victory的博客

长安一片月,万户捣衣声

0%

MyBatis | 分步查询、分步查询延迟加载

分步查询、分步查询延迟加载

项目目录

1.mybatis-config.xml
分步查询延迟加载需要在MyBatis核心配置文件中做以下配置:

<settings>
    <!-- 开启延迟加载 -->
    <setting name="lazyLoadingEnabled" value="true"></setting>
    <!-- 是否查询所有数据 -->
    <setting name="aggressiveLazyLoading" value="false"></setting>
</settings>

2.DeptMapper.java

public interface DeptMapper {
    Dept getDeptByDid(String did);
}

3.DeptMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.atguigu.mapper.DeptMapper">
    <select id="getDeptByDid" resultType="Dept">
        select did,dname from dept where did=#{did}
    </select>
</mapper>

4.EmpDeptMapper.java

public interface EmpDeptMapper {
    List<Emp> getAllEmp();
    
    Emp getEmpStep(String eid);//分步查询
}

5.EmpDeptMapper.xml
添加查询语句

<resultMap type="Emp" id="empMapStep">
    <id column="eid" property="eid"/>
    <result column="ename" property="ename"/>
    <result column="age" property="age"/>
    <result column="sex" property="sex"/>
    <!--
        select:分步查询的SQL的id,即接口全限定名.方法名或者namespace.SQL的id
        column:分步查询的条件,注意:此条件必须是从数据库查询过的 
     -->
    <association property="dept" select="com.atguigu.mapper.DeptMapper.getDeptByDid" column="did"></association>
</resultMap>

<!-- Emp getEmpStep(String eid); -->
<select id="getEmpStep" resultMap="empMapStep">
    select eid,ename,age,sex,did from emp where eid = #{eid}
</select>

6.TestEmpDept.java

public class TestEmpDept {
    public static void main(String[] args) throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpDeptMapper mapper = sqlSession.getMapper(EmpDeptMapper.class);
        
        Emp emp = mapper.getEmpStep("3");
        System.out.println(emp.getEname());
        System.out.println(emp.getDept());
    }
}

7.运行结果
执行emp.getEname()运行结果为前四行
再执行emp.getDept()运行结果为八行

DEBUG 04-06 09:48:10,087 ==>  Preparing: select eid,ename,age,sex,did from emp where eid = ?   (BaseJdbcLogger.java:145) 
DEBUG 04-06 09:48:10,102 ==> Parameters: 3(String)  (BaseJdbcLogger.java:145) 
DEBUG 04-06 09:48:10,147 <==      Total: 1  (BaseJdbcLogger.java:145) 
王五
DEBUG 04-06 09:48:10,147 ==>  Preparing: select did,dname from dept where did=?   (BaseJdbcLogger.java:145) 
DEBUG 04-06 09:48:10,148 ==> Parameters: 3(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 04-06 09:48:10,149 <==      Total: 1  (BaseJdbcLogger.java:145) 
Dept [did=3, dname=研发部]