resultMap是Mybatis中自动映射的强大标签,可以完成简单类型、复杂(bean、POJO)类型、集合类型的映射。
通过其子标签的 property 和 column 属性完成JDBC中resultSet.getXxx(column)的操作。
id,result用于完成简单类型的映射。
支持的简单类型映射请参照[Mybatis中文网]
(https://mybatis.net.cn/sqlmap-xml.html "Mybatis中文网")
id用于该表主键的映射,result用于该表非主键的映射。
标记出作为 ID 的结果可以帮助提高整体性能
我们可以通过javaType和jdbcType完成bean成员变量和数据库字段(这个字段指你在查询完成后表的列名)的映射,当然大部分时候我们无需写这两个属性。Mybatis在绝大部分情况下都可以完成自动匹配。
示例代码
<resultMap id="clazzMap" type="clazz" >
<id column="id" property="id"/>
<result column="name" property="name"/>
</resultMap>
<select id="selectById" resultMap="clazzMap">
select id,name
from clazz
where id = #{id};
</select>
2. `association` 用于完成 有一个(bean) 的映射
- 什么是有一个 在一个bean类中含有另一个bean类,这里我称前者bean为Out,后者为In
- association` 的使用情况大致有两种
1. 在查询完成的表中含有In的成员变量,这个时候我们就可以通过`id`和`result`来完成映射。
2. 在查询完成的表中只含有In的部分字段,此时,想要完成In所有的字段映射,必须通过该字段再去In表中去查询(select属性指定查询语句,`column`属性指定该语句入参),然后再通过`id`、`result`映射。
3. `collection` 用于完成 集合类型 的映射 - `collection` 与`association`基本相同,也是有两种情况.
1. 在查询完成的表中含有In的成员变量,(`ofType`属性指定list集合内元素的类型,`javaType`指定集合类型)。
2. 这点同上述`association`中一样,只需要多指定`ofType`和`javaType`。
- 什么是
N+1
+1:你执行了一个单独的 SQL 语句来获取结果的一个列表。
N:对列表返回的每条记录,你执行一个 select 查询语句来为每条记录加载详细信息。- 上述的3.2中就是
N+1问题,我们可以通过开启延迟来解决。 - 这时我们可以发现,
collection的两种情况都是N+1问题,其实第一种方式正是解决N+1的一种方式。我们也可以通过resultMap来完成3.1中情况的映射,但要尤其注意字段名是否匹配,你可以使用columnPrefix来为resultMap中字段来添加一个前缀,以解决联表查询时字段别名来的一些问题。 - 从版本 3.2.3 开始,MyBatis 提供了另一种解决 N+1 查询问题的方法。
通过调用存储过程来执行多条sql,将返回的结果分别进行映射。
- 上述的3.2中就是
第一次写博客,若有错误或者表述不准确烦请指正,感谢。
浙公网安备 33010602011771号