resultMap 可以看https://www.bilibili.com/video/av21272940/ 这里的讲解很细致
1. 当表的字段与实体类的属性不一致
例如我的表里的字段是emp_name javaBean类里面是name, 这时mybatis自动映射不能帮忙了
1. 将 name 改为 empName 就可以
2. 用resultMap来映射
在mapper.xml文件里面
和上面的id="empMap"对应
select * from emp where id=#{id}
注意 insert update delete是没有resultType和resultMap属性的,下面的图可以看到
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
2. 一对多时 如何使用?
(1)使用级联属性
这里column 与你的SQL语句中要查询的列要对应 ,property是对应的POJO属性对应
我将这里的列名 改掉 ,则会查不出对应的部门信息
(2)可以通过 association来替代级联
(3)可以通过 association实现分步查询
绑定mapper出现BindingException 要注意
public interface EmployeeMapper {
public Employee getEmpByIdStep(Integer id);
Department里面
public interface DepartmentMapper {
public Department findDeptById(Integer id);
}
最后的单元测试
@Test
public void test3() throws Exception{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//2.
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee emp = mapper.getEmpByIdStep(2);
System.out.println(emp);
System.out.println(emp.getDept());
} finally {
openSession.close();
}
}
可以看到控制台发了两个SQL ,Employee显示出了全部的内容
(4)延迟加载(懒加载)
association和collection还具备延迟加载的功能
在mybatis-config文件中配置下面的
lazyLoadingEnabled 默认是false) |
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载 。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 |
true | false | false |
aggressiveLazyLoading (默认是false, true in ≤3.4.1)) |
当开启时,任何方法的调用都会加载该对象的所有属性 。否则,每个属性会按需加载(参考lazyLoadTriggerMethods). |
将这个 注释掉 只开启一个 依然是发送的两个SQL
开启延时加载最好是同时设置这两个,
@Test
public void test3() throws Exception{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//2.
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee emp = mapper.getEmpByIdStep(2);
System.out.println(emp.getEmpName());
} finally {
openSession.close();
}
}
没开启就会发送2个SQL
开启后只发送了一条SQL
(5) resultMap高级映射collection的使用
当我要查询 一个部门的所有员工时 ,比如需要查出开发部里的全部员工 , 返回的是查询的部门中包含多名员工
这时将关联的员工信息封装起来 需要用collection来处理
DepartmentMapper.xml里面设置resultMap
DepartmentMapper.java 接口中定义这个方法
public Department getDeptByIdPlus(Integer id);
这里的collection用于封装查询到的Employee信息
这里要先在Department POJO类 加上一个集合属性
public class Department {
private Integer id;
private String deptName;
private List emps;//加上这个集合属性
这样就可以查到 一个部门 下的 所有员工
@2 与association类似,collection同样支持分段查询 以及延迟加载
分段查询: 同样地 要查询一个部门下的所有员工,可以分阶段 先查部门 再查询员工
1.首先在两个mapper加上接口方法
public Department getDeptByIdStep(Integer id); ===》》 DepartmentMapper
public List getEmpsByIdStep(Integer deptId); ===》》 EmployeeMapper
2.对应的Departmentmapper.xml 以及 EmployeeMapper.xml
通过测试,可以看到发送了两个SQL
对于延迟加载 是按需加载,若只要查询部门名,就只会发一条SQL