输入映射和输出映射

输入映射

Mybatis映射文件通过parameterType指定输入参数的类型,类型可以是

  • 简单类型
  • hashmap
  • pojo的包装类型

在xml映射文件中sql语句会根据OGNL自动获取传入类型中的属性值。
如果传入类型中没有相应的属性值,就会报找不到对应属性的错。

即使传入类型的具体对象中的相应属性为null,也并不会报错。因为Mybatis使用的是动态sql,如果没有设置某个值,条件就不会拼接在sql中去。

输出映射

输入映射主要有两种方式:

  • resultType
  • resultMap

resultType

  • 使用resultType进行输出映射时,只有查询出来的列名和pojo中的属性名一致,才能映射成功。
    • 列名与pojo的属性名只要有一个不一致就不会创建pojo对象,此时会报错。
    • 列名与pojo的属性名只要有一个一致就会创建一个pojo对象并返回。

resultMap

如果查询出来的列名和pojo的属性名不一致,可以通过定义一个resultMap对列名和属性名之间进行映射。
1.定义resultMap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<resultMap type="user" id="userResultMap">
<!-- id表示查询结果集中唯一标识
column:查询出来的列名
property:type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系 (对应关系)
-->
<id column="id_" property="id"/>
<!--
result:对普通名映射定义
column:查询出来的列名
property:type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系 (对应关系)
-->
<result column="username_" property="username"/>
<!--
一对一映射
association:用于映射关联查询单个对象的信息
property:要将关联查询的用户信息映射到Orders中哪个属性
javaType:映射到user的哪个属性
-->
<!--
一对多映射
collection:对关联查询到多条记录映射到集合对象中
property:将关联查询到多条记录映射到com.iot.mybatis.po.Orders哪个属性
ofType:指定映射到list集合属性中pojo的类型
-->
</resultMap>

2.使用resultMap作为statement的输出映射类型

1
2
3
4
5
6
<!-- 使用resultMap进行输出映射
resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace
-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
SELECT id id_,username username_ FROM USER WHERE id=#{value}
</select>

扩展

使用resultMap多表查询时,可能会导致重复字段赋值错误。
解决方法:在查询时定义别名。resultMap中根据别名列来映射


resultType和resultMap区别:

  • resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。如果没有查询结果的特殊要求建议使用resultType。
  • resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
  • resultMap可以实现延迟加载,resultType无法实现延迟加载。

association:

  • 作用:将关联查询信息映射到一个pojo对象中。
  • 场合:为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。

collection:

  • 作用:将关联查询信息映射到一个list集合中。
  • 场合:为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。如果使用resultType无法将查询结果映射到list集合中。