[mybatis]映射文件_select_resultMap_关联查询_association分步查询&延迟加载
Posted 唐火
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[mybatis]映射文件_select_resultMap_关联查询_association分步查询&延迟加载相关的知识,希望对你有一定的参考价值。
association分步查询
场景一
查询Employee的同时查询员工对应的部门
Employee===Department
一个员工有与之对应的部门信息
Employee表:
Department表:
public interface DepartmentMapper
public Department getDeptById(Integer id);
public interface EmployeeMapperPlus
public Employee getEmpByIdStep(Integer id);
<!-- public Department getDeptById(Integer id);
-->
<select id="getDeptById" resultType="com.atguigu.mybatis.bean.Department">
select id,dept_name departmentName from tb1_dept where id = #id
</select>
<resultMap id="MyEmpStep" type="com.atguigu.mybatis.bean.Employee">
<!-- 1.先按照员工id查询员工信息-->
<!-- 2.根据查询员工信息中的d_id值去部门表查出部门信息-->
<!-- 3.部门设置到员工中-->
<id column="id" property="id"></id>
<result column="last_name" property="lastName"></result>
<result column="email" property="email"></result>
<result column="gender" property="gender"></result>
<!-- association定义关联对象的封装规则
select:表明当前属性是调用select指定的方法查出的结果
column:指定将哪一列的值传给这个方法
流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性
-->
<association property="dept" select="com.atguigu.mybatis.dao.DepartmentMapper.getDeptById"
column="d_id"></association>
</resultMap>
<!-- public Employee getEmpByIdStep(Integer id);-->
<select id = "getEmpByIdStep" resultMap="MyEmpStep">
select * from tb1_employee where id = #id
</select>
@Test
public void test03() throws IOException
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
try
EmployeeMapperPlus mapper = sqlSession.getMapper(EmployeeMapperPlus.class);
Employee emp = mapper.getEmpByIdStep(1);
System.out.println(emp);
System.out.println(emp.getDept());
finally
sqlSession.close();
延迟加载
Employee ===> Dept
我们每次查询Employee对象的时候,都将一起查询出来
分段查询的基础上,使用延迟加载
可以使部门信息在我们使用的时候再去查询
lazyLoadingEnabled & aggressiveLazyLoading
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
场景二
查询部门的时候将部门对应的所有员工信息也查询出来
public class Department
private Integer id;
private String departmentName;
private List<Employee> emps;
public interface DepartmentMapper
public Department getDeptByIdPlus(Integer id);
<resultMap id="MyDept" type="com.atguigu.mybatis.bean.Department">
<id column="did" property="id"></id>
<result column="dept_name" property="departmentName"></result>
<!--collection定义关联集合类型的属性的封装规则
ofType:指定集合里面元素的类型
-->
<collection property="emps" ofType="com.atguigu.mybatis.bean.Employee" >
<!--定义这个集合中元素的封装规则-->
<id column="eid" property="id"></id>
<result column="last_name" property="lastName"></result>
<result column="email" property="email"></result>
<result column="gender" property="gender"></result>
</collection>
</resultMap>
<!-- public Department getDeptByIdPlus(Integer id);-->
<select id="getDeptByIdPlus" resultMap = "MyDept">
SELECT d.id did, d.dept_name dept_name ,
e.id eid,e.last_name last_name,e.email email,e.gender gender
FROM tb1_dept d
LEFT JOIN tb1_employee e
ON d.id = e.d_id
WHERE d.id = #id
</select>
@Test
public void test04() throws IOException
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
try
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
Department deptByIdPlus = mapper.getDeptByIdPlus(1);
System.out.println(deptByIdPlus);
System.out.println(deptByIdPlus.getEmps());
finally
sqlSession.close();
扩展:多列的值传递过去
将多列的值封装map传递
column="key1=column1,key2=column2"
fetchType=“lazy”:表示使用延迟加载;
lazy:延迟
eager:立即
以上是关于[mybatis]映射文件_select_resultMap_关联查询_association分步查询&延迟加载的主要内容,如果未能解决你的问题,请参考以下文章
[mybatis]映射文件_参数处理_#取值时指定参数相关规则
[mybatis]映射文件_select_返回集合(List,Map)