Mybatis的输出映射

来源:互联网 发布:尤克里里软件下载 编辑:程序博客网 时间:2024/05/21 19:31

前言:Mybatis是基于"数据库结构不可控"的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际上却不是这样的。那么结果映射就是Mybatis为我们提供的理想与现实的转换的手段了,而ResultMap就是结果银蛇的配置标签了。ResultMap是Mybatis中最重要最强大的元素,能完成很多复杂查询和JDBC完成不了的事情。在正式学习resultMap

之前,我们还得了解一下从SQL查询结果集到javaBean或POJO实体的过程。

(1)通过JDBC查询得到ResultSet对象。

(2)遍历ResultSet对象并将每行的数据暂存到HashMap实例中,已结果集的字段名或字段别名作为键,以字段值作为值。

(3)通过ResultMap标签的type属性通过反射实例化领域模型。

(4)根据ResultMap标签的type属性和id,result等标签信息将HashMap中键值对填充到领域模型实例中并返回。

ps:查询出来的结果最后都是封装到ResultMap里面,resultType和resultMap不能够同时存在。在select语句中必须写二者之一,而insert,delete,update语句中不用写。

一.resultType

使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致时,该列才可以映射成功。(注意只要查询出来的列名和pojo中的属性值有一个一致,就会创建一个pojo,只有查询出来的列名和pojo中的属性名全部不一致时,才不创建pojo对象)

(1)简单类型(int)

public Interface UserMapper.java中:
public int findUserCount(User u) throws Exception;
UserMapper.xml中:
<select id="findUserCount" parameterType="cn.cal.entity.User" resultType="int">
SELECT COUNT(*) FROM user WHERE user.name like '%{u.name}'
</select>

查询出来的结果只有一行一列,可以使用简单类型来进行输出映射,常用在分页查询中。

(2)pojo

不敢试输出的pojo单个对象还是一个List列表,在UserMapper.xml中指定的resultType类型都是一样的,只是在UserMapper.java中返回的值不一样。见如下演示:

输出的单个的pojo对象:

public User findUserById(int id) throws Exception;

输出的是pojo对象的List:

public List<User> findUserByName(String name) throws Exception;
生成的动态代理对象中是根据UserMapper方法的返回值类型来确定是调用selectOne还是调用selectList.

 (3)map

在接口中的定义:

public List<Map<String, Object>> queryListPageQuery(KbcDectVo kbcDectVo)

在xml文件中的定义:

<select id="queryListPageQuery" resultType="map" parameterType="cn.cal.entity.KbcDectVo">
......
</select>


 二.resultMap

如果查询到的列名和映射的pojo的属性不一致的时候,可以通过在sql查询的时候为字段取别名来和pojo的属性对应来解决,也可以通过resultMap设置列名和属性的对应关系(映射关系)来解决。

在高级查询之前说一说我们平时进行数据模型分析的思路:(1)分模块对每张表记录的内容进行熟悉,相当于你学习系统需求的过程。(2)对每张表中重要的字段进行了解如主键,非空字段和外键。(3).通过外键了解数据库级别上的表与表之间的关系。(4).在某个业务意义上去分析表与表之间的业务关系。

复杂查询的时候第一步是先确定关系,然后确定用什么查询,再确定主表,最后实现。

(1)一对一查询:

可以用resultType来实现,只要让pojo继承另一对象就可以了。

重点说一下resultType,因为它可以实现延迟加载,而resultType却不可以。

(2)一对多查询:

Mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中去。如果使用resultType来实现的话,对于重复的一些记录就需要自己处理,比如用双重循环来实现这个自己去做实现,很简单。

(3)多对多查询:

一对多是多对多的一个特例,使用association和collection完成一对一和一对多的高级映射(对结果又特殊要求)

0 0
原创粉丝点击