目录
1.resultmap处理字段与属性的映射关系
2.处理多对一映射
2.1 级联(嵌套查询)
2.2 使用association处理映射关系
2.3 分布查询
3.处理一对多映射
3.1 collection标签
3.2 分布查询
之前我们学习的都是字段与实体类属性名一致的情况,接下来就介绍用resultmap处理字段与属性名不匹配的情况和一对多和多对一的映射。
resultMap:设置自定义映射
子标签还有两个属性:
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名
属性 | 含义 |
---|---|
id | 表示自定义映射的唯一标识 |
type | 查询的数据要映射的实体类的类型 |
子标签 | 作用 |
---|---|
id | 设置主键的映射关系 |
result | 设置普通字段的映射关 |
associatio | 设置多对一的映射关系 |
collection | 设置一对多的映射关系 |
例:字段名和实体类中的属性名不一致
字段:
实体类:
若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性
名符合Java的规则(使用驼峰)
此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系
a>可以通过为字段起别名的方式,保证和实体类中的属性名保持一致
b>可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可
**以在查询表中数据时,自动将_类型的字段名转换为驼峰
例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为
userName
场景模拟:
查询员工信息以及员工所对应的部门信息
员工表:
部门表:
用左联将两个表和在一起,然后通过员工实体类的dept类属性.部门实体类的属性来和部门表映射。
association标签后要使用javaType表示property属性的类型。(这里的Dept是类型别名,因为设置了别名)
在配置文件里通过包设置别名。
使用association
1.查询员工id信息
fetchType="egager”,这是立即加载
fetchType="lazy“,这是延迟加载
property | 设置需要处理映射关系的属性的属性名 |
select | 设置分步查询的唯一标识 |
column | 将查询出的某个字段作为分步查询的下一个查询的sql条件 |
fetchType | 开启了延迟加载后通过该属性设置是否使用延迟加载 |
Emp getEmpAndDeptByIdStepOne(@Param("empId") Integer empid);
2.根据员工部门id查询部门信息
员工信息获取成功后,根据查询的员工信息的员工部门id作为参数查询部门信息
Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);//通过分步查询员工及对应部门信息
场景模拟:
查询部门信息,并将该部门的员工信息查出。
因为一对多,需要在部门实体类里加一个list集合存放员工信息
ofType:设置集合类型的属性中存储的数据的类型
Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);//查询部门以及部门中的员工
映射文件
1.查询部门信息
Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);//通过分步查询部门以及部门中员工的信息的第一步
2.根据部门id查询员工信息
List getDeptAndEmpByStepTwo(@Param("deptId") Integer deptid);//通过分步查询部门以及部门中员工的信息的第二步
分步查询的优点:可以实现延迟加载
但是必须在核心配置文件中设置全局配置信息:
lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属
性会按需加载
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和
collection中的fetchType属性设置当前的分步查询是否使用延迟加载, fetchType="lazy(延迟加
载)|eager(立即加载)"