亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis的?級(jí)映射及延遲加載過(guò)程詳解

 更新時(shí)間:2023年02月08日 14:24:43   作者:@每天都要敲代碼  
這篇文章主要介紹了MyBatis的?級(jí)映射及延遲加載,包括多對(duì)一延時(shí)加載方式及一對(duì)多,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

一:MyBatis的?級(jí)映射及延遲加載

前期準(zhǔn)備:

模塊名:mybatis-010-advanced-mapping

打包?式:jar

引?依賴:mysql驅(qū)動(dòng)依賴、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

編寫測(cè)試類:com.powernode.mybatis.test.StudentMapperTest和ClazzMapperTest

拷??具類:com.powernode.mybatis.utils.SqlSessionUtil

準(zhǔn)備數(shù)據(jù)庫(kù)表:?個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)?:

班級(jí)表:t_clazz

學(xué)?表:t_student

clazz實(shí)例類

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實(shí)體類:只定義兩個(gè)字段;對(duì)于cid屬性,是為了維護(hù)兩者關(guān)系的屬性

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. 多對(duì)?

pojo類Student中添加?個(gè)屬性:Clazz clazz; 表示學(xué)?關(guān)聯(lián)的班級(jí)對(duì)象,增加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;
    }
}

多對(duì)一:多個(gè)學(xué)生Student對(duì)應(yīng)一個(gè)班級(jí)Clazz

多種?式,常?的包括三種:

① 第?種?式:?條SQL語(yǔ)句,級(jí)聯(lián)屬性映射。

② 第?種?式:?條SQL語(yǔ)句,association。

③第三種?式:兩條SQL語(yǔ)句,分步查詢。

第?種?式:級(jí)聯(lián)屬性映射

三兄弟之一:StudentMapper接口,編寫方法

根據(jù)id獲取學(xué)生Student信息,同時(shí)獲取學(xué)生關(guān)聯(lián)的班級(jí)Clazz信息

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Student;
 
public interface StudentMapper {
    /*
     * @param id 學(xué)生的id
     * @return 學(xué)生對(duì)象,但是學(xué)生對(duì)象當(dāng)中含有班級(jí)對(duì)象
     */
    Student selectById(Integer id);
    
}

三兄弟之二:StudentMapper.xml文件,編寫sql語(yǔ)句

(1)使用resultMap來(lái)指定映射關(guān)系,結(jié)果映射resultMap有兩個(gè)參數(shù):

一個(gè)參數(shù)是id,指定resultMap的唯一標(biāo)識(shí),這個(gè)id將來(lái)在select標(biāo)簽中使用。

一個(gè)參數(shù)是type,用來(lái)指定POJO類的類名。

(2)在resultMap下還有一個(gè)子標(biāo)簽result;首先對(duì)于有主鍵的需要配一個(gè)id,不是必須的,但可以增加效率;下面使用result子標(biāo)簽的property屬性和column屬性分別指定POJO類的屬性名和數(shù)據(jù)庫(kù)表中的字段表之間的映射關(guān)系。

<?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">
    <!--多對(duì)一映射的第一種方式:一條SQL語(yǔ)句,級(jí)聯(lián)屬性映射-->
    <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">
    <!--多對(duì)一映射的第一種方式:一條SQL語(yǔ)句,級(jí)聯(lián)屬性映射-->
    <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類,用來(lái)編寫測(cè)試類

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對(duì)象
        System.out.println(student);
        // 輸出每個(gè)屬性
        System.out.println(student.getSid());
        System.out.println(student.getSname());
        System.out.println(student.getClazz().getCid());
        System.out.println(student.getClazz().getCname());
 
        sqlSession.close();
    }
}

執(zhí)行結(jié)果:

第?種?式:association標(biāo)簽

第二種方式,和第一種方式的代碼很類似,就是多引入一個(gè)association標(biāo)簽,association翻譯為關(guān)聯(lián)的意思

三兄弟之一:StudentMapper接口,編寫方法

根據(jù)id獲取學(xué)生Student信息,同時(shí)獲取學(xué)生關(guān)聯(lián)的班級(jí)Clazz信息

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Student;
 
public interface StudentMapper {
     /**
     * 一條SQL語(yǔ)句,使用association標(biāo)簽的方式
     * @param id 學(xué)生的id
     * @return 學(xué)生對(duì)象,但是學(xué)生對(duì)象當(dāng)中含有班級(jí)對(duì)象
     */
    Student selectByIdAssociation(Integer id);
    
}

三兄弟之二:StudentMapper.xml文件,編寫sql語(yǔ)句

association:翻譯為關(guān)聯(lián),一個(gè)Student對(duì)象關(guān)聯(lián)一個(gè)Clazz對(duì)象

①property標(biāo)簽:提供要映射的POJO類的屬性名,這里就是clazz

②javaType標(biāo)簽:用來(lái)指定要映射的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語(yǔ)句,引入association標(biāo)簽-->
    <resultMap id="studentResultMapAssociation" type="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname"/>
        <!--使用assocaition標(biāo)簽-->
        <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類,用來(lái)編寫測(cè)試類

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對(duì)象
        System.out.println(student);
        sqlSession.close();
    }
}

執(zhí)行結(jié)果:

第三種?式:分步查詢

分布查詢,需要兩條SQL語(yǔ)句,這種?式常?:

①優(yōu)點(diǎn)?是可復(fù)?。

②優(yōu)點(diǎn)?是?持懶加載(延遲加載)

(1)分布查詢第一步:先根據(jù)學(xué)生的sid查詢學(xué)生信息

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

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Student;
 
public interface StudentMapper {
    
    // 分布查詢第一步:現(xiàn)根據(jù)學(xué)生的sid查詢學(xué)生信息
    Student selectByIdStep1(Integer id);
 
}

②在StudentMapper.xml中編寫SQL語(yǔ)句,并指明兩者之間的關(guān)聯(lián)關(guān)系

還是需要association標(biāo)簽:

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

②select屬性:用來(lái)指定另外第二步SQL語(yǔ)句的id,這個(gè)id實(shí)際上就是namespace+id;通過(guò)第二步語(yǔ)句的查詢結(jié)果,把值賦值給clazz

③column屬性:是把第一條SQL語(yǔ)句查詢出來(lái)的cid傳給第第二條SQL語(yǔ)句

<?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">   
    <!--這是第一步:根據(jù)學(xué)生的id查詢學(xué)生的所有信息,包含cid-->
    <resultMap id="studentResultMapByStep" type="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname" />
        <!--使用association標(biāo)簽,指明關(guān)聯(lián)關(guān)系-->
        <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)分布查詢第二步:根據(jù)學(xué)生的cid查詢班級(jí)信息

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

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

②在ClazzMapper.xml中編寫SQL語(yǔ)句

<?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">
    <!--分布查詢第二步:根據(jù)cid獲取班級(jí)信息-->
    <select id="selectByIdStep2" resultType="Clazz">
        select cid,cname from t_clazz where cid = #{id};
    </select>
</mapper>

(3)最終StudentMapperTest編寫測(cè)試,因?yàn)镾tudent是主表

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();
    }
}

執(zhí)行結(jié)果:

2. 多對(duì)?延遲加載

(1)延遲加載的核心是:用到的在查詢,暫時(shí)訪問(wèn)不到的數(shù)據(jù)可以先不查詢。

(2)作用:提?程序的執(zhí)?效率;不用的時(shí)候也查性能肯定低,例如笛卡爾積現(xiàn)象

(3)在MyBatis中如何開(kāi)啟延遲加載:asspciation標(biāo)簽當(dāng)中添加fetchType="lazy"

例1:不開(kāi)啟延遲加載機(jī)制,假如只訪問(wèn)學(xué)生表t_student的sname屬性,和t_clazz表實(shí)際上是沒(méi)有任何關(guān)系的

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);
        // 只訪問(wèn)sname屬性
        System.out.println(student.getSname());
        sqlSession.close();
    }
}

執(zhí)行結(jié)果:實(shí)際上執(zhí)行了兩個(gè)查詢語(yǔ)句,效率變低

例2:在asspciation標(biāo)簽中開(kāi)啟延遲機(jī)制,就能做到只執(zhí)行第一條SQL語(yǔ)句,第二條不執(zhí)行;

<?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標(biāo)簽,并開(kāi)啟延遲加載機(jī)制-->
        <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>

執(zhí)行結(jié)果:同樣還是只訪問(wèn)學(xué)生表t_student的sname屬性,此時(shí)就是只查詢一張表即可

(4)在association標(biāo)簽中配置fetchType=“lazy”,實(shí)際上是局部的設(shè)置,只對(duì)當(dāng)前的association關(guān)聯(lián)的SQL語(yǔ)句起作用!

(5)那么怎樣在mybatis中如何開(kāi)啟全局的延遲加載呢?需要setting配置,如下:

 (6)在核心配置文件mybatis-config.xml文件當(dāng)中使用setting標(biāo)簽進(jìn)行配置

    <!--啟?全局延遲加載機(jī)制-->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

(7)開(kāi)啟全局延遲加載之后,所有的SQL都會(huì)?持延遲加載,但是如果某個(gè)SQL你不希望它?持延遲加載怎么辦呢? 將fetchType設(shè)置為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標(biāo)簽,不開(kāi)啟延遲加載機(jī)制-->
        <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. ?對(duì)多

?對(duì)多的實(shí)現(xiàn),通常是在?的??中有List集合屬性!

pojo類Clazz中添加?個(gè)屬性:List<Student> stu; 表示班級(jí)關(guān)聯(lián)的學(xué)生對(duì)象,增加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;
    }
}

?對(duì)多的實(shí)現(xiàn)通常包括兩種實(shí)現(xiàn)?式:

①第?種?式:collection

②第?種?式:分步查詢

第?種?式:collection

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

 三兄弟之一:ClazzMapper接口,編寫方法

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Clazz;
 
public interface ClazzMapper {
    
   // 根據(jù)班級(jí)編號(hào)查詢班級(jí)信息
    Clazz selectByIdCollection(Integer cid);
}

三兄弟之二:ClazzMapper.xml文件,編寫sql語(yǔ)句

使用collection標(biāo)簽,和上面使用association標(biāo)簽的第二種方法是很相似的

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

②ofType屬性:用來(lái)指定集合當(dāng)中的元素類型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用來(lái)指定集合當(dāng)中的元素類型-->
        <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類,用來(lái)編寫測(cè)試類

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();
    }
}

執(zhí)行結(jié)果:

 查詢的結(jié)果是stus變量是一個(gè)有三個(gè)數(shù)據(jù)的List集合,其中clazz是null屬于正?,F(xiàn)象,如果clazz還有值,就會(huì)與前面的Student形成遞歸循環(huán) 

第?種?式:分步查詢和延遲加載

(1)分布查詢第一步:先根據(jù)班級(jí)編號(hào)獲取班級(jí)信息

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

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Clazz;
 
public interface ClazzMapper {
 
    // 分布查詢第一步:根據(jù)班級(jí)編號(hào),獲取班級(jí)信息
    Clazz selectByStep1(Integer cid);
}

②在ClazzMapper.xml中編寫SQL語(yǔ)句,并指明兩者之間的關(guān)聯(lián)關(guān)系

<?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">
   <!--分布查詢第一步:根據(jù)班級(jí)的cid獲取班級(jí)信息-->
    <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)分布查詢第二步:根據(jù)學(xué)生的cid查詢班級(jí)信息

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

package com.bjpowernode.mybatis.mapper;
 
import com.bjpowernode.mybatis.pojo.Student;
import java.util.List;
 
public interface StudentMapper {
   
    // 分布查詢第二步:根據(jù)班級(jí)編號(hào)查詢學(xué)生信息
    List<Student> selectByCidStep2(Integer cid);
}

②在StudentMapper.xml中編寫SQL語(yǔ)句

<?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編寫測(cè)試,因?yàn)镃lazz是主表

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();
    }
}

執(zhí)行結(jié)果:

?對(duì)多延遲加載機(jī)制和多對(duì)?是?樣的,同樣是通過(guò)兩種?式:

第?種:fetchType="lazy"

第?種:修改全局的配置setting,lazyLoadingEnabled=true,如果開(kāi)啟全局延遲加載,想讓某個(gè) sql不使?延遲加載:fetchType="eager"

到此這篇關(guān)于MyBatis的?級(jí)映射及延遲加載的文章就介紹到這了,更多相關(guān)MyBatis延遲加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)雙色球抽獎(jiǎng)算法

    java實(shí)現(xiàn)雙色球抽獎(jiǎng)算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)雙色球抽獎(jiǎng)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Spring Boot實(shí)現(xiàn)圖片上傳功能

    Spring Boot實(shí)現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細(xì)介紹了Spring Boot實(shí)現(xiàn)圖片上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過(guò)程

    SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過(guò)程

    日常開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要使用到郵件發(fā)送任務(wù),比方說(shuō)驗(yàn)證碼的發(fā)送、日常信息的通知等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過(guò)程,需要的朋友可以參考下
    2022-10-10
  • SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法

    SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法

    本篇文章主要介紹了SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • Java中的Object類詳細(xì)解讀

    Java中的Object類詳細(xì)解讀

    這篇文章主要介紹了Java中的Object類詳細(xì)解讀,java.lang.Object是類層次結(jié)構(gòu)的根類,即所有其它類的父類,每個(gè)類都使用 Object 作為超類,需要的朋友可以參考下
    2023-11-11
  • SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

    SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出)

    這篇文章主要介紹了SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導(dǎo)出,在線文件導(dǎo)出),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot中的配置文件加載優(yōu)先級(jí)詳解

    SpringBoot中的配置文件加載優(yōu)先級(jí)詳解

    這篇文章主要介紹了SpringBoot中的配置文件加載優(yōu)先級(jí)詳解,springboot啟動(dòng)會(huì)掃描以下位置的application.properties或者application.yml文件作為Spring?boot的默認(rèn)配置文件,需要的朋友可以參考下
    2024-01-01
  • Intellij IDEA導(dǎo)入eclipse web項(xiàng)目的操作步驟詳解

    Intellij IDEA導(dǎo)入eclipse web項(xiàng)目的操作步驟詳解

    Eclipse當(dāng)中的web項(xiàng)目都會(huì)有這兩個(gè)文件,但是idea當(dāng)中應(yīng)該是沒(méi)有的,所以導(dǎo)入會(huì)出現(xiàn)兼容問(wèn)題,但是本篇文章會(huì)教大家如何導(dǎo)入,并且導(dǎo)入過(guò)后還能使用tomcat運(yùn)行,需要的朋友可以參考下
    2023-08-08
  • springboot集成gzip和zip數(shù)據(jù)壓縮傳輸(適用大數(shù)據(jù)信息傳輸)

    springboot集成gzip和zip數(shù)據(jù)壓縮傳輸(適用大數(shù)據(jù)信息傳輸)

    ?在大數(shù)據(jù)量的傳輸中,壓縮數(shù)據(jù)后進(jìn)行傳輸可以一定程度的解決速度問(wèn)題,本文主要介紹了springboot集成gzip和zip數(shù)據(jù)壓縮傳輸,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼示例

    SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼示例

    ip2region v2.0 - 是一個(gè)離線IP地址定位庫(kù)和IP定位數(shù)據(jù)管理框架,10微秒級(jí)別的查詢效率,提供了眾多主流編程語(yǔ)言的 xdb 數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn),本文介紹了SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼工程,需要的朋友可以參考下
    2024-08-08

最新評(píng)論