首頁 > 軟體

MyBatis的⾼級對映及延遲載入過程詳解

2023-02-08 22:02:19

一:MyBatis的⾼級對映及延遲載入

前期準備:

模組名:mybatis-010-advanced-mapping

打包⽅式:jar

引⼊依賴:mysql驅動依賴、mybatis依賴、junit依賴、logback依賴

pojo:com.powernode.mybatis.pojo.Student和Calzz

mapper接⼝:com.powernode.mybatis.mapper.StudentMapper和ClazzMapper

引⼊設定⽂件:mybatis-config.xml、jdbc.properties、logback.xml

mapper設定⽂件:com/powernode/mybatis/mapper/StudentMapper.xml和ClazzMapper.xml

編寫測試類:com.powernode.mybatis.test.StudentMapperTest和ClazzMapperTest

拷⻉⼯具類:com.powernode.mybatis.utils.SqlSessionUtil

準備資料庫表:⼀個班級對應多個學⽣:

班級表:t_clazz

學⽣表:t_student

clazz範例類

package com.bjpowernode.mybatis.pojo;
 
/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.pojo
 * @Project:mybatis
 * @name:Clazz
 * @Date:2023/1/7 18:18
 */
public class Clazz {
    private Integer cid;
    private String cname;
 
    public Clazz() {
    }
 
    public Clazz(Integer cid, String cname) {
        this.cid = cid;
        this.cname = cname;
    }
 
    @Override
    public String toString() {
        return "Clazz{" +
                "cid=" + cid +
                ", cname='" + cname + ''' +
                '}';
    }
 
    public Integer getCid() {
        return cid;
    }
 
    public void setCid(Integer cid) {
        this.cid = cid;
    }
 
    public String getCname() {
        return cname;
    }
 
    public void setCname(String cname) {
        this.cname = cname;
    }
}

Student實體類:只定義兩個欄位;對於cid屬性,是為了維護兩者關係的屬性

package com.bjpowernode.mybatis.pojo;
 
/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.pojo
 * @Project:mybatis
 * @name:Student
 * @Date:2023/1/7 18:18
 */
public class Student { 
    private Integer sid;
    private String sname;
   
    public Student() {
    }
    public Student(Integer sid, String sname) {
        this.sid = sid;
        this.sname = sname;
    }
 
    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + ''' +
                '}';
    }
 
    public Integer getSid() {
        return sid;
    }
 
    public void setSid(Integer sid) {
        this.sid = sid;
    }
 
    public String getSname() {
        return sname;
    }
 
    public void setSname(String sname) {
        this.sname = sname;
    }
}

1. 多對⼀

pojo類Student中新增⼀個屬性:Clazz clazz; 表示學⽣關聯的班級物件,增加setter and getter方法,重寫toString方法。

package com.bjpowernode.mybatis.pojo;
 
/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.pojo
 * @Project:mybatis
 * @name:Student
 * @Date:2023/1/7 18:18
 */
public class Student { // Student是多的一方
    private Integer sid;
    private String sname;
    private Clazz clazz; // Clazz是一的一方
 
    public Student() {
    }
    public Student(Integer sid, String sname) {
        this.sid = sid;
        this.sname = sname;
    }
 
    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + ''' +
                ", clazz=" + clazz +
                '}';
    }
 
    public Clazz getClazz() {
        return clazz;
    }
 
    public void setClazz(Clazz clazz) {
        this.clazz = clazz;
    }
 
    public Integer getSid() {
        return sid;
    }
 
    public void setSid(Integer sid) {
        this.sid = sid;
    }
 
    public String getSname() {
        return sname;
    }
 
    public void setSname(String sname) {
        this.sname = sname;
    }
}

多對一:多個學生Student對應一個班級Clazz

多種⽅式,常⻅的包括三種:

① 第⼀種⽅式:⼀條SQL語句,級聯屬性對映。

② 第⼆種⽅式:⼀條SQL語句,association。

③第三種⽅式:兩條SQL語句,分步查詢。

第⼀種⽅式:級聯屬性對映

三兄弟之一:StudentMapper介面,編寫方法

根據id獲取學生Student資訊,同時獲取學生關聯的班級Clazz資訊

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Student;
 
public interface StudentMapper {
    /*
     * @param id 學生的id
     * @return 學生物件,但是學生物件當中含有班級物件
     */
    Student selectById(Integer id);
    
}

三兄弟之二:StudentMapper.xml檔案,編寫sql語句

(1)使用resultMap來指定對映關係,結果對映resultMap有兩個引數:

一個引數是id,指定resultMap的唯一標識,這個id將來在select標籤中使用。

一個引數是type,用來指定POJO類的類名。

(2)在resultMap下還有一個子標籤result;首先對於有主鍵的需要配一個id,不是必須的,但可以增加效率;下面使用result子標籤的property屬性和column屬性分別指定POJO類的屬性名和資料庫表中的欄位表之間的對映關係。

<?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.bjpowernode.mybatis.mapper.StudentMapper">
    <!--多對一對映的第一種方式:一條SQL語句,級聯屬性對映-->
    <resultMap id="studentResultMap" type="Student">
        <id property="id" column="id"/>
        <result property="sid" column="sid"/>
        <result property="clazz.cid" column="cid"/>
        <result property="clazz.cname" column="cname" />
    </resultMap>
 
    <select id="selectById" resultMap="studentResultMap">
      select
        s.sid,s.sname,c.cid,c.cname
      from
        t_student s
      left join
        t_clazz c
      on s.cid = c.cid
      where
        s.sid = #{sid}
    </select>
</mapper>
<?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.bjpowernode.mybatis.mapper.StudentMapper">
    <!--多對一對映的第一種方式:一條SQL語句,級聯屬性對映-->
    <resultMap id="studentResultMap" type="Student">
        <id property="id" column="id"/>
        <result property="sid" column="sid"/>
        <result property="clazz.cid" column="cid"/>
        <result property="clazz.cname" column="cname" />
    </resultMap>
 
    <select id="selectById" resultMap="studentResultMap">
      select
        s.sid,s.sname,c.cid,c.cname
      from
        t_student s
      left join
        t_clazz c
      on s.cid = c.cid
      where
        s.sid = #{sid}
    </select>
</mapper>

三兄弟之三:StudentMappeTest類,用來編寫測試類

package com.bjpowernode.mybatis.test;
 
import com.bjpowernode.mybatis.mapper.StudentMapper;
import com.bjpowernode.mybatis.pojo.Student;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
 
public class StudentMapperTest {
    @Test
    public void testSelectById(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Student student = mapper.selectById(1);
        // 直接輸出Student物件
        System.out.println(student);
        // 輸出每個屬性
        System.out.println(student.getSid());
        System.out.println(student.getSname());
        System.out.println(student.getClazz().getCid());
        System.out.println(student.getClazz().getCname());
 
        sqlSession.close();
    }
}

執行結果:

第⼆種⽅式:association標籤

第二種方式,和第一種方式的程式碼很類似,就是多引入一個association標籤,association翻譯為關聯的意思

三兄弟之一:StudentMapper介面,編寫方法

根據id獲取學生Student資訊,同時獲取學生關聯的班級Clazz資訊

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Student;
 
public interface StudentMapper {
     /**
     * 一條SQL語句,使用association標籤的方式
     * @param id 學生的id
     * @return 學生物件,但是學生物件當中含有班級物件
     */
    Student selectByIdAssociation(Integer id);
    
}

三兄弟之二:StudentMapper.xml檔案,編寫sql語句

association:翻譯為關聯,一個Student物件關聯一個Clazz物件

①property標籤:提供要對映的POJO類的屬性名,這裡就是clazz

②javaType標籤:用來指定要對映的java型別,這裡就是com.bjpowernode.mybatis.Clazz

<?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.bjpowernode.mybatis.mapper.StudentMapper">
    <!--一條SQL語句,引入association標籤-->
    <resultMap id="studentResultMapAssociation" type="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname"/>
        <!--使用assocaition標籤-->
        <association property="clazz" javaType="Clazz">
            <!--雖然欄位是相同的,但是不能省略不寫-->
            <id property="cid" column="cid"/>
            <result property="cname" column="cname" />
        </association>
    </resultMap>
    
    <select id="selectByIdAssociation" resultMap="studentResultMapAssociation">
        select
        s.sid,s.sname,c.cid,c.cname
      from
        t_student s
      left join
        t_clazz c
      on s.cid = c.cid
      where
        s.sid = #{sid}
    </select>
</mapper>

三兄弟之三:StudentMappeTest類,用來編寫測試類

package com.bjpowernode.mybatis.test;
 
import com.bjpowernode.mybatis.mapper.StudentMapper;
import com.bjpowernode.mybatis.pojo.Student;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
 
public class StudentMapperTest {
     @Test
    public void testSelectByIdAssociation(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Student student = mapper.selectByIdAssociation(2);
        // 直接輸出Student物件
        System.out.println(student);
        sqlSession.close();
    }
}

執行結果:

第三種⽅式:分步查詢

分佈查詢,需要兩條SQL語句,這種⽅式常⽤:

①優點⼀是可復⽤。

②優點⼆是⽀持懶載入(延遲載入)

(1)分佈查詢第一步:先根據學生的sid查詢學生資訊

①在StudentMapper中編寫第一步的查詢方法

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Student;
 
public interface StudentMapper {
    
    // 分佈查詢第一步:現根據學生的sid查詢學生資訊
    Student selectByIdStep1(Integer id);
 
}

②在StudentMapper.xml中編寫SQL語句,並指明兩者之間的關聯關係

還是需要association標籤:

①property屬性:還是提供要對映的POJO類的屬性名,這裡就是clazz

②select屬性:用來指定另外第二步SQL語句的id,這個id實際上就是namespace+id;通過第二步語句的查詢結果,把值賦值給clazz

③column屬性:是把第一條SQL語句查詢出來的cid傳給第第二條SQL語句

<?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.bjpowernode.mybatis.mapper.StudentMapper">   
    <!--這是第一步:根據學生的id查詢學生的所有資訊,包含cid-->
    <resultMap id="studentResultMapByStep" type="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname" />
        <!--使用association標籤,指明關聯關係-->
        <association property="clazz"
                     select="com.bjpowernode.mybatis.mapper.ClazzMapper.selectByIdStep2"
                     column="cid"/>
    </resultMap>
 
    <select id="selectByIdStep1" resultMap="studentResultMapByStep">
        select sid,sname,cid from t_student where sid = #{sid};
    </select>
 
</mapper>

(2)分佈查詢第二步:根據學生的cid查詢班級資訊

①在ClazzMapper中編寫第二步的查詢方法

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Clazz;
 
public interface ClazzMapper {
    // 分佈查詢第二步:根據cid獲取查詢資訊
    Clazz selectByIdStep2(Integer cid);
}

②在ClazzMapper.xml中編寫SQL語句

<?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.bjpowernode.mybatis.mapper.ClazzMapper">
    <!--分佈查詢第二步:根據cid獲取班級資訊-->
    <select id="selectByIdStep2" resultType="Clazz">
        select cid,cname from t_clazz where cid = #{id};
    </select>
</mapper>

(3)最終StudentMapperTest編寫測試,因為Student是主表

package com.bjpowernode.mybatis.test;
 
import com.bjpowernode.mybatis.mapper.StudentMapper;
import com.bjpowernode.mybatis.pojo.Student;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
 
public class StudentMapperTest {
    @Test
    public void testSelectByIdStep1(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Student student = mapper.selectByIdStep1(3);
        System.out.println(student);
        sqlSession.close();
    }
}

執行結果:

2. 多對⼀延遲載入

(1)延遲載入的核心是:用到的在查詢,暫時存取不到的資料可以先不查詢。

(2)作用:提⾼程式的執⾏效率;不用的時候也查效能肯定低,例如笛卡爾積現象

(3)在MyBatis中如何開啟延遲載入:asspciation標籤當中新增fetchType="lazy"

例1:不開啟延遲載入機制,假如只存取學生表t_student的sname屬性,和t_clazz表實際上是沒有任何關係的

package com.bjpowernode.mybatis.test;
 
import com.bjpowernode.mybatis.mapper.StudentMapper;
import com.bjpowernode.mybatis.pojo.Student;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
 
 
public class StudentMapperTest {
    @Test
    public void testSelectByIdStep1(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Student student = mapper.selectByIdStep1(3);
        // System.out.println(student);
        // 只存取sname屬性
        System.out.println(student.getSname());
        sqlSession.close();
    }
}

執行結果:實際上執行了兩個查詢語句,效率變低

例2:在asspciation標籤中開啟延遲機制,就能做到只執行第一條SQL語句,第二條不執行;

<?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.bjpowernode.mybatis.mapper.StudentMapper">
    <resultMap id="studentResultMapByStep" type="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname" />
        <!--使用association標籤,並開啟延遲載入機制-->
        <association property="clazz"
                     select="com.bjpowernode.mybatis.mapper.ClazzMapper.selectByIdStep2"
                     column="cid"
                     fetchType="lazy"/>
    </resultMap>
 
    <select id="selectByIdStep1" resultMap="studentResultMapByStep">
        select sid,sname,cid from t_student where sid = #{sid};
    </select>
</mapper>

執行結果:同樣還是隻存取學生表t_student的sname屬性,此時就是隻查詢一張表即可

(4)在association標籤中設定fetchType=“lazy”,實際上是區域性的設定,只對當前的association關聯的SQL語句起作用!

(5)那麼怎樣在mybatis中如何開啟全域性的延遲載入呢?需要setting設定,如下:

 (6)在核心組態檔mybatis-config.xml檔案當中使用setting標籤進行設定

    <!--啟⽤全域性延遲載入機制-->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

(7)開啟全域性延遲載入之後,所有的SQL都會⽀持延遲載入,但是如果某個SQL你不希望它⽀持延遲載入怎麼辦呢? 將fetchType設定為eager

<?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.bjpowernode.mybatis.mapper.StudentMapper">
    <resultMap id="studentResultMapByStep" type="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname" />
        <!--使用association標籤,不開啟延遲載入機制-->
        <association property="clazz"
                     select="com.bjpowernode.mybatis.mapper.ClazzMapper.selectByIdStep2"
                     column="cid"
                     fetchType="eager"/>
    </resultMap>
 
    <select id="selectByIdStep1" resultMap="studentResultMapByStep">
        select sid,sname,cid from t_student where sid = #{sid};
    </select>
</mapper>

3. ⼀對多

⼀對多的實現,通常是在⼀的⼀⽅中有List集合屬性!

pojo類Clazz中新增⼀個屬性:List<Student> stu; 表示班級關聯的學生物件,增加setter and getter方法,重寫toString方法。

package com.bjpowernode.mybatis.pojo;
 
import java.util.*;
 
public class Clazz {
    private Integer cid;
    private String cname;
    private List<Student> stus;
    
    public Clazz() {
    }
 
    public Clazz(Integer cid, String cname) {
        this.cid = cid;
        this.cname = cname;
    }
 
    @Override
    public String toString() {
        return "Clazz{" +
                "cid=" + cid +
                ", cname='" + cname + ''' +
                ", stus=" + stus +
                '}';
    }
 
    public List<Student> getStus() {
        return stus;
    }
 
    public void setStus(List<Student> stus) {
        this.stus = stus;
    }
 
    public Integer getCid() {
        return cid;
    }
 
    public void setCid(Integer cid) {
        this.cid = cid;
    }
 
    public String getCname() {
        return cname;
    }
 
    public void setCname(String cname) {
        this.cname = cname;
    }
}

⼀對多的實現通常包括兩種實現⽅式:

①第⼀種⽅式:collection

②第⼆種⽅式:分步查詢

第⼀種⽅式:collection

注:這次t_calss是主表,所以是在ClazzMapper、ClazzMapper.xml、ClazzMapperTest當中完成一些列操作。

 三兄弟之一:ClazzMapper介面,編寫方法

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Clazz;
 
public interface ClazzMapper {
    
   // 根據班級編號查詢班級資訊
    Clazz selectByIdCollection(Integer cid);
}

三兄弟之二:ClazzMapper.xml檔案,編寫sql語句

使用collection標籤,和上面使用association標籤的第二種方法是很相似的

①property屬性:提供要對映的POJO類的屬性名,這裡就是stus

②ofType屬性:用來指定集合當中的元素型別com.bjpowernode.mybatis.Student

<?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.bjpowernode.mybatis.mapper.ClazzMapper">
    <resultMap id="clazzResultMap" type="Clazz">
        <id property="cid" column="cid"/>
        <result property="cname" column="cname"/>
        <!--ofType用來指定集合當中的元素型別-->
        <collection property="stus" ofType="Student">
            <id property="sid" column="sid"/>
            <result property="sname" column="sname"/>
        </collection>
    </resultMap>
 
    <select id="selectByIdCollection" resultMap="clazzResultMap">
        select
          c.cid,c.cname,s.sid,s.sname
        from
          t_clazz c
        left join
          t_student s
        on c.cid = s.cid
        where c.cid = #{cid}
    </select>
</mapper>

三兄弟之三:ClazzMappeTest類,用來編寫測試類

package com.bjpowernode.mybatis.test;
 
import com.bjpowernode.mybatis.mapper.ClazzMapper;
import com.bjpowernode.mybatis.pojo.Clazz;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
 
public class ClazzMapperTest {
    @Test
    public void testSelectByIdCollection(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class);
        Clazz clazz = mapper.selectByIdCollection(1001);
        System.out.println(clazz);
        sqlSession.close();
    }
}

執行結果:

 查詢的結果是stus變數是一個有三個資料的List集合,其中clazz是null屬於正常現象,如果clazz還有值,就會與前面的Student形成遞迴迴圈 

第⼆種⽅式:分步查詢和延遲載入

(1)分佈查詢第一步:先根據班級編號獲取班級資訊

①在ClazzMapper中編寫第一步的查詢方法

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Clazz;
 
public interface ClazzMapper {
 
    // 分佈查詢第一步:根據班級編號,獲取班級資訊
    Clazz selectByStep1(Integer cid);
}

②在ClazzMapper.xml中編寫SQL語句,並指明兩者之間的關聯關係

<?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.bjpowernode.mybatis.mapper.ClazzMapper">
   <!--分佈查詢第一步:根據班級的cid獲取班級資訊-->
    <resultMap id="clazzResultMapStep" type="Clazz">
        <id property="cid" column="cid"/>
        <result property="cname" column="cname"/>
        <collection property="stus"
                    select="com.bjpowernode.mybatis.mapper.StudentMapper.selectByCidStep2"
                    column="cid" />
    </resultMap>
    <select id="selectByStep1" resultMap="clazzResultMapStep">
        select cid,cname from t_clazz where cid = #{cid}
    </select>
</mapper>

(2)分佈查詢第二步:根據學生的cid查詢班級資訊

①在StudentMapper中編寫第二步的查詢方法

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Student;
import java.util.List;
 
public interface StudentMapper {
   
    // 分佈查詢第二步:根據班級編號查詢學生資訊
    List<Student> selectByCidStep2(Integer cid);
}

②在StudentMapper.xml中編寫SQL語句

<?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.bjpowernode.mybatis.mapper.StudentMapper">
    <select id="selectByCidStep2" resultType="Student">
        select * from t_student where cid = #{cid}
    </select>
</mapper>

(3)最終ClazzMapperTest編寫測試,因為Clazz是主表

package com.bjpowernode.mybatis.test;
 
import com.bjpowernode.mybatis.mapper.ClazzMapper;
import com.bjpowernode.mybatis.pojo.Clazz;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
 
public class ClazzMapperTest {
    @Test
    public void testSelectByStep1(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class);
        Clazz clazz = mapper.selectByStep1(1001);
        System.out.println(clazz);
        sqlSession.close();
    }
}

執行結果:

⼀對多延遲載入機制和多對⼀是⼀樣的,同樣是通過兩種⽅式:

第⼀種:fetchType="lazy"

第⼆種:修改全域性的設定setting,lazyLoadingEnabled=true,如果開啟全域性延遲載入,想讓某個 sql不使⽤延遲載入:fetchType="eager"

到此這篇關於MyBatis的⾼級對映及延遲載入的文章就介紹到這了,更多相關MyBatis延遲載入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com