9.自定义映射ResultMap
[TOC]
自定义映射resultMap
resultMap处理字段和属性的映射关系
- resultMap:设置自定义映射
- 属性:
- id:表示自定义映射的唯一标识,不能重复
- type:查询的数据要映射的实体类的类型
- 子标签:
- id:设置主键的映射关系
- result:设置普通字段的映射关系
- 子标签属性:
- property:设置映射关系中实体类中的属性名
- column:设置映射关系中表中的字段名
- 若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射,即使字段名和属性名一致的属性也要映射,也就是全部属性都要列出来
1 | |
若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性名符合Java的规则(使用驼峰)。此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系
- 可以通过为字段起别名的方式,保证和实体类中的属性名保持一致
1
2
3
4<!--List<Emp> getAllEmp();-->
<select id="getAllEmp" resultType="Emp">
select eid,emp_name empName,age,sex,email from t_emp
</select> - 可以在MyBatis的核心配置文件中的
setting标签中,设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将_类型的字段名转换为驼峰,例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为userName。核心配置文件详解1
2
3<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
- 可以通过为字段起别名的方式,保证和实体类中的属性名保持一致
多对一映射处理
查询员工信息以及员工所对应的部门信息
1 | |
1 | |
1.级联方式处理映射关系
1 | |
2.使用association处理映射关系
- association:处理多对一的映射关系
- property:需要处理多对的映射关系的属性在pojo类中的创建名
- javaType:该属性的类型
1 | |
3.分步查询
1. 查询员工信息
- select:设置分布查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名.方法名)
- column:设置分步查询的条件
1 | |
1 | |
2. 查询部门信息
1 | |
1 | |
一对多映射处理
1 | |
collection
- collection:用来处理一对多的映射关系
- ofType:表示该属性对饮的集合中存储的数据的类型
1 | |
分步查询
1. 查询部门信息
1 | |
1 | |
2. 根据部门id查询部门中的所有员工
1 | |
1 | |
延迟加载
- 分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息:
- lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
- aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载
- 此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=”lazy(延迟加载)|eager(立即加载)”
1 | |
1 | |
- 关闭延迟加载,两条SQL语句都运行了

- 开启延迟加载,只运行获取emp的SQL语句

1 | |
开启后,需要用到查询dept的时候才会调用相应的SQL语句

fetchType:当开启了全局的延迟加载之后,可以通过该属性手动控制延迟加载的效果,fetchType=”lazy(延迟加载)|eager(立即加载)”
1
2
3
4
5
6
7
8
9
10
11<resultMap id="empAndDeptByStepResultMap" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
<result property="email" column="email"></result>
<association property="dept"
select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
column="did"
fetchType="lazy"></association>
</resultMap>
9.自定义映射ResultMap
http://example.com/2021/04/11/9.自定义映射ResultMap/