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中就是
第一次写博客,若有错误或者表述不准确烦请指正,感谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~