本文主要是介绍MyBatis association分步查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Employee类
public class Employee {private Integer id;private String lastName;private String email;private String gender;private Department dept;// 省略setter、getter、toString方法
}
Department类
public class Department {private Integer id;private String departmentName;private List<Employee> emps;
}
再来看EmployeeMapper.xml中的相关语句
select * from tbl_employee where id=#{id}DepartmentMapper.xml中的相关语句
<!--public Department getDeptById(Integer id); --><select id="getDeptById" resultType="com.mybatis.bean.Department">select id,dept_name departmentName from tbl_dept where id=#{id}</select>
通过association实现了分步查询,在一定程度上简化了sql语句,另外association还指支持延迟加载(懒加载),目前的情况是当我们执行了getEmpByIdStep语句,也一定执行DepartmentMapper.xml中的getDeptById语句,但如果并不需要部门表中的信息呢?
如:
Employee employee = mapper.getEmpByIdStep(3);System.out.println(employee);
查询id为3的员工的信息,此时我们并不需要部门表的信息,那可以用懒加载的方式进行。
需要在mybatis全局配置文件mybatis-config.xml中开启
<settings><!-- <setting name="mapUnderscoreToCamelCase" value="true"/> --><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/></settings>
对于这两个属性,我们来看一下mybatis官方文档中的介绍
lazyLoadingEnabled:
当值为true时,所有关联对象都会延迟加载,特定关联关系中通过设置fetchType属性来覆盖该项的开关状态
aggressiveLazyLoading:
当开启时,任何方法的调用都会加载该对象的所有属性。否则每个属性会按需加载
当这样设置后,当我们再次运行
Employee employee = mapper.getEmpByIdStep(3);System.out.println(employee);
通过控制台的打印sql语句可以发现,并未执行查询部门的sql语句
Employee employee = mapper.getEmpByIdStep(3);
System.out.println(employee.getDept());
当这样调用时,就会调用查询部门的语句,实现了按需加载。
这篇关于MyBatis association分步查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!