Mybatis自动映射

Posted on   zyuan09  阅读(6)  评论(0编辑  收藏  举报

resultMap是Mybatis中自动映射的强大标签,可以完成简单类型、复杂(bean、POJO)类型、集合类型的映射。

通过其子标签的 propertycolumn 属性完成JDBC中resultSet.getXxx(column)的操作。

  1. idresult 用于完成简单类型的映射。
    支持的简单类型映射请参照[Mybatis中文网]
    (https://mybatis.net.cn/sqlmap-xml.html "Mybatis中文网")
    id用于该表主键的映射,result用于该表非主键的映射。
    标记出作为 ID 的结果可以帮助提高整体性能
    我们可以通过 javaTypejdbcType完成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,将返回的结果分别进行映射。

第一次写博客,若有错误或者表述不准确烦请指正,感谢。

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示