自定义映射 resultMap
字段名、属性名不一致
1、修改任意一方名称,使两者相同
2、SQL 语句使用 AS 关键字,使字段名的别名和实体类中的属性名保持一致
3、MyBatis 全局设置
<setting name="mapUnderscoreToCamelCase" value="true"/>
(1)MyBatis 核心配置文件中的 setting 标签,设置一个全局配置信息 mapUnderscoreToCamelCase
(2)mapUnderscoreToCamelCase:是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn,默认值 false
(3)在查询表中数据时,自动将 _ 类型的字段名转换为驼峰,例如:字段名 user_name,设置 mapUnderscoreToCamelCase 为 ture 后,此时字段名就会转换为 userName
(4)前提:字段名符合数据库的规则(使用 _ ),实体类中的属性名符合 Java 的规则(使用驼峰)
4、resultMap 设置自定义映射
(1)设置自定义映射,处理字段和属性的映射关系
(2)字段名和属性名一致的属性也需要映射,即全部属性都要列出来
(3)映射文件(示例)
<!--
id:表示自定义映射的唯一标识,不能重复,用于标识一个结果映射
type:查询的数据要映射的实体类的类型,类的全类名或别名
-->
<resultMap id="empResultMap" type="Emp">
<!--
id:设置主键的映射关系
result:设置普通字段的映射关系
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名
-->
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
</resultMap>
<!-- List<Emp> getAllEmp(); -->
<select id="getAllEmp" resultMap="empResultMap">
select * from emps
</select>
处理多对一映射关系
1、对一:聚合 JavaBean 对象
2、级联属性赋值
<resultMap id="EmpAndDeptResultMap" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<result property="dept.did" column="did"></result>
<result property="dept.deptName" column="dept_name"></result>
</resultMap>
<!-- Emp getEmpAndDept(@Param("eid") Integer eid); -->
<select id="getEmpAndDept" resultMap="EmpAndDeptResultMap">
select *
from emps left join depts
on emps.eid = dept.did
where emps.eid = #{eid}
</select>
3、使用 association 标签
(1)association 标签:处理多对一的映射关系
(2)property 属性:需要处理多对的映射关系的属性名,即多对一的 JavaBean
(3)javaType 属性:property 属性的类型
<resultMap id="EmpAndDeptResultMap" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<association property="dept" javaType="Dept">
<id property="did" column="did"></id>
<result property="deptName" column="dept_name"></result>
</association>
</resultMap>
<!-- Emp getEmpAndDept(@Param("eid") Integer eid); -->
<select id="getEmpAndDept" resultMap="EmpAndDeptResultMap">
select *
from emps left join depts
on emps.eid = dept.did
where emps.eid = #{eid}
</select>
4、分步查询
(1)select:设置分布查询 SQL 唯一标识:namespace / mapper 接口的全类名 + .SQL 语句 id / .方法名
(2)column:设置分步查询的条件,数据库中的列名,或者是列的别名
<resultMap id="EmpAndDeptByStepResultMap" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<association property="dept"
select="org.test.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
column="did">
</association>
</resultMap>
<!-- Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);-->
<select id="getEmpAndDeptByStepOne" resultMap="EmpAndDeptByStepResultMap">
select * from emps where eid = #{eid}
</select>
<!-- 此处resultMap只是处理字段和属性的映射关系-->
<resultMap id="EmpAndDeptByStepTwoResultMap" type="Dept">
<id property="did" column="did"></id>
<result property="deptName" column="dept_name"></result>
</resultMap>
<!-- Dept getEmpAndDeptByStepTwo(@Param("did") Integer did); -->
<select id="getEmpAndDeptByStepTwo" resultMap="EmpAndDeptByStepTwoResultMap">
select * from depts where did = #{did}
</select>
延迟加载
1、分步查询的优点:可以实现延迟加载,但必须在核心配置文件中设置全局配置信息
(1)lazyLoadingEnabled:默认为 false,延迟加载的全局开关,当开启时,所有关联对象都会延迟加载
(2)aggressiveLazyLoading:默认为 false,当开启时,任何方法的调用都会加载该对象的所有属性,否则,每个延迟加载属性会按需加载
2、按需加载,获取的数据是什么,只会执行相应 SQL
3、全局配置
<setting name="lazyLoadingEnabled" value="true"/>
4、局部配置
(1)可通过 association 和 collection 中的 fetchType 属性,设置当前的分步查询是否使用延迟加载
(2)fetchType="lazy"(延迟加载)
(3)fetchType="eager"(立即加载)
处理一对多映射关系
1、对多:聚合 JavaBean 集合
2、使用 collection 标签
(1)collection 标签:处理一对多的映射关系
(2)ofType 属性:表示该属性对应的集合中,存储的数据类型
<resultMap id="DeptAndEmpResultMap" type="Dept">
<id property="did" column="did"></id>
<result property="deptName" column="dept_name"></result>
<collection property="emps" ofType="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
</collection>
</resultMap>
<!-- Dept getDeptAndEmp(@Param("did") Integer did); -->
<select id="getDeptAndEmp" resultMap="DeptAndEmpResultMap">
select *
from depts left join emps
on depts.did = emps.did
where depts.did = #{did}
</select>
3、分步查询
(1)select:设置分布查询 SQL 唯一标识:namespace / mapper 接口的全类名 + .SQL 语句 id / .方法名
(2)column:设置分步查询的条件,数据库中的列名,或者是列的别名
<resultMap id="DeptAndEmpByStepOneResultMap" type="Dept">
<id property="did" column="did"></id>
<result property="deptName" column="dept_name"></result>
<collection property="emps"
select="org.test.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
column="did">
</collection>
</resultMap>
<!-- Dept getDeptAndEmpByStepOne(@Param("did") Integer did); -->
<select id="getDeptAndEmpByStepOne" resultMap="DeptAndEmpByStepOneResultMap">
select * from t_dept where did = #{did}
</select>
<!-- 此处resultMap只是处理字段和属性的映射关系 -->
<resultMap id="DeptAndEmpByStepTwoResultMap" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
</resultMap>
<!-- List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did); -->
<select id="getDeptAndEmpByStepTwo" resultType="DeptAndEmpByStepTwoResultMap">
select * from emps where did = #{did}
</select>
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战