MyBatis 延遲加載怎麼實現?

一.Mybatis 極簡入門

二.Mybatis 級聯查詢

本篇:Mybatis 延遲加載

現在我們有如下需求:有時候只需要查詢學生姓名,不需要查詢學生班級,有時候不僅需要查詢姓名還要查詢班級。怎麼才能實現這個功能呢?Mybatis爲我們提供了延遲加載功能。

上一篇級聯查詢中,我們根據學生id查詢出學生姓名和班級,同時查詢了兩張表,我們要重寫一個延遲加載。

第一步:在config.xml中開啓打印SQL語句和懶加載。

 <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="lazyLoadingEnabled" value="true"/>
 </settings>

第二步:添加查詢方法如下

package com.ibuyi.mybatis.repository;

import com.ibuyi.mybatis.entity.Student;

public interface StudentDAO {
    //根據student ID查詢學生姓名班級
    Student findStudentByID(long id);
    //懶加載添加的方法
    Student findStudentByIDLazy(long id);
}

緊接着,在mapper文件中

    <resultMap id="studentLazy" type="com.ibuyi.mybatis.entity.Student">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <!--這裏進行修改,不是以前的和查詢結果一一對應,而是調用ClassDAO中的查詢方法-->
        <association property="classes" javaType="com.ibuyi.mybatis.entity.Classes" select="com.ibuyi.mybatis.repository.ClassDAO.findClassedByID" column="cid"></association>
    </resultMap>
    <select id="findStudentByIDLazy" parameterType="long" resultMap="studentLazy">
        select * from student where id=#{id}
    </select>

在ClassDAO中也要聲明一個方法:

package com.ibuyi.mybatis.repository;
import com.ibuyi.mybatis.entity.Classes;
import java.util.List;
public interface ClassDAO {
    //根據cid查詢班級全部學生
    List<Classes> findStudentByID(long id);
    Classes findClassedByID(long id);
}

<select id="findClassedByID" parameterType="long" resultType="com.ibuyi.mybatis.entity.Classes">
   select * from classes where id=#{id}
</select>

測試代碼:

package com.ibuyi.mybatis.test;
import com.ibuyi.mybatis.entity.Student;
import com.ibuyi.mybatis.repository.StudentDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class Test {
    public static void main(String[] args) {
        InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
        Student student=studentDAO.findStudentByIDLazy(2L);
        //System.out.println(student.getName());
        System.out.println(student.getClasses());
    }
}

在這裏插入圖片描述

public class Test {
    public static void main(String[] args) {
        InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
        Student student=studentDAO.findStudentByIDLazy(2L);
        System.out.println(student.getName());
        //System.out.println(student.getClasses());
    }
}

在這裏插入圖片描述

根據結果我們可以看出,只有在需要用到班級信息的時候,mybatis纔會幫我們執行第二條sql語句,不需要用到就不會執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章