Mybatis懶加載機制


 

懶加載會按需要是否執行關聯查詢語句。如果用到了關聯查詢語句的信息,就需要執行關聯查詢,否則就只執行主查詢

1.在mybatis的全局配置文件中加入兩個屬性:

 

<settings>
                <setting name="mapUnderscoreToCamelCase" value="true"/>
                <!-- 開啟懶加載機制 ,默認值為true-->
                <setting name="lazyLoadingEnabled" value="true"/>
                <!-- 開啟的話,每個屬性都會直接全部加載出來;禁用的話,只會按需加載出來 -->
                <setting name="aggressiveLazyLoading" value="false"/>
            </settings>

Mapper接口:

    public tbl_employee findTblEmployeeById(int id);

xml文件:

<!--關聯查詢-->
<
select id="selectDepartment" resultType="com.neuedu.bean.tbl_dept"> select * from tbl_dept where id=#{id} </select> <resultMap type="com.neuedu.bean.tbl_employee" id="findTblEmployeeByIdMap"> <id column="id" property="id" /> <result column="email" property="email" /> <result column="gender" property="gender" /> <result column="user_name" property="userName" /> <!-- <result column="d_id" property="dId"/> --> <association property="dept" select="selectDepartment" column="d_id"></association> </resultMap>
<!--主查詢-->
<select id="findTblEmployeeById" resultMap="findTblEmployeeByIdMap" parameterType="int"> select e.id,e.email,e.gender,e.user_name,e.d_id from tbl_employee e where e.id=#{id} </select>

測試:

  只用到主查詢的信息

    @Test
    public void testFindEmployee() throws IOException{
        SqlSessionFactory sqlSessionFactory = sqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        Tbl_employeeMapper mapper = openSession.getMapper(Tbl_employeeMapper.class);
        tbl_employee findTblEmployeeById = mapper.findTblEmployeeById(1);
      System.out.println("名字:"+findTblEmployeeById.getUserName());
    }

  下面是打印的日志:

DEBUG 09-05 20:13:14,178 ==> Preparing: select e.id,e.email,e.gender,e.user_name,e.d_id from tbl_employee e where e.id=? (BaseJdbcLogger.java:145)
DEBUG 09-05 20:13:14,452 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 09-05 20:13:14,861 <== Total: 1 (BaseJdbcLogger.java:145)
名字:yr

通過日志可知只打印了一條SQL語句,就以為着只執行了一條主查詢

  使用了關聯查詢的信息:

    @Test
    public void testFindEmployee() throws IOException{
        SqlSessionFactory sqlSessionFactory = sqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        Tbl_employeeMapper mapper = openSession.getMapper(Tbl_employeeMapper.class);
        tbl_employee findTblEmployeeById = mapper.findTblEmployeeById(1);
        System.out.println(findTblEmployeeById);
    }

  打印的日志:

DEBUG 09-05 20:17:13,873 ==> Preparing: select e.id,e.email,e.gender,e.user_name,e.d_id from tbl_employee e where e.id=? (BaseJdbcLogger.java:145)
DEBUG 09-05 20:17:14,107 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 09-05 20:17:14,449 <== Total: 1 (BaseJdbcLogger.java:145)
DEBUG 09-05 20:17:14,454 ==> Preparing: select * from tbl_dept where id=? (BaseJdbcLogger.java:145)
DEBUG 09-05 20:17:14,455 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 09-05 20:17:14,460 <== Total: 1 (BaseJdbcLogger.java:145)
tbl_employee [id=1, userName=yr, gender=0, email=907339416@qq.com, dId=0, dept=tbl_dept [id=1, deptName=秘書部, empList=null]]

 

這里用到了關聯查詢的信息,所以用到了兩個查詢語句。打印了兩個。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM