最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis高級(jí)映射及延遲加載的實(shí)現(xiàn)

 更新時(shí)間:2024年11月05日 10:00:34   作者:代碼代碼快快顯靈  
MyBatis在處理對(duì)象關(guān)系映射時(shí),多對(duì)一關(guān)系是常見的場(chǎng)景,本文就來(lái)介紹了MyBatis高級(jí)映射及延遲加載的實(shí)現(xiàn),感興趣的可以了解一下

多對(duì)一:

多種方式,常見的包括三種:

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

  • 第二種方式:一條SQL語(yǔ)句,association。

  • 第三種方式:兩條SQL語(yǔ)句,分步查詢。(這種方式常用:優(yōu)點(diǎn)一是可復(fù)用。優(yōu)點(diǎn)二是支持懶加載。)

怎么區(qū)分主表和副表?

原則:誰(shuí)在前面誰(shuí)是主表

例如:多對(duì)一,多在前面,那么多的那個(gè)表就是主表

級(jí)聯(lián)屬性映射:

Student類:

package pojo;

/**
 * 學(xué)生信息
 * 沒有cid這個(gè)屬性,后期會(huì)有特殊的方式來(lái)處理這個(gè)關(guān)系字段
 */
public class Student {
    private Integer sid;
    private String sname;
    private Clazz clazz;

    public Clazz getClazz() {
        return clazz;
    }

    public void setClazz(Clazz clazz) {
        this.clazz = clazz;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", clazz=" + clazz +
                '}';
    }

    public Student() {
    }

    public Student(Integer sid, String sname) {
        this.sid = sid;
        this.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;
    }
}

對(duì)應(yīng)的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="mapper.StudentMapper">

    <!-- 級(jí)聯(lián)屬性映射 -->

    <resultMap id="studentResultMap" type="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname"/>
        <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_plus s
                LEFT JOIN
            t_clazz c ON s.cid = c.cid
        WHERE
            s.sid = #{sid}
    </select>

</mapper>
@Test
    public void testSelectBySid(){
        StudentMapper mapper = SqlSessionUtil.openSession().getMapper(StudentMapper.class);
        Student student = mapper.selectBySid(1);
        System.out.println(student);
    }

sql語(yǔ)句:

2024-10-14 13:29:58.511 [main] DEBUG mapper.StudentMapper.selectById - ==>  Preparing: 
SELECT s.sid, s.sname, c.cid, c.cname FROM t_student_plus s 
LEFT JOIN t_clazz c ON s.cid = c.cid WHERE s.sid = ?

association

對(duì)應(yīng)的sql映射文件:

  <resultMap id="studentResultMapAssociation" type="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname"/>
        <!-- 嵌套映射,將 clazz 對(duì)象中的 cid 和 cname 映射 -->
        <association property="clazz" javaType="Clazz">
            <id property="cid" column="cid"/>
            <result property="cname" column="cname"/>
        </association>
    </resultMap>
    <select id="selectByIdAssociation" resultMap="studentResultMap">
        SELECT
            s.sid, s.sname, c.cid, c.cname
        FROM
            t_student_plus s
                LEFT JOIN
            t_clazz c ON s.cid = c.cid
        WHERE
            s.sid = #{sid}
    </select>

association翻譯為:關(guān)聯(lián)。 學(xué)生對(duì)象關(guān)聯(lián)一個(gè)班級(jí)對(duì)象。

關(guān)鍵點(diǎn)說(shuō)明

  • <resultMap> 元素resultMap 用于映射結(jié)果集到 Java 對(duì)象。通過(guò)定義 StudentResultMap 來(lái)描述如何將查詢結(jié)果映射到 Student 對(duì)象。

  • <association> 元素<association> 用于處理多對(duì)一的關(guān)系映射。它會(huì)把 clazz 的數(shù)據(jù)映射到 Student 對(duì)象的 clazz 屬性上。

    • property:對(duì)應(yīng) Student 類中的 clazz 屬性。
    • javaType:指定 Clazz 類的全限定名。
    • 通過(guò) property 和 column 進(jìn)行字段的映射。
  • SQL 查詢selectStudentWithClazz 查詢使用了 LEFT JOIN 來(lái)同時(shí)獲取 student 和 clazz 的信息,并通過(guò) resultMap 映射到 Student 對(duì)象中。

分步查詢

  <resultMap id="studentResultMapByStep" type="Student">
        <id property="sid" column="sid"/>
        <id property="sname" column="sname"/>
       <association property="clazz"
                            select="mapper.ClazzMapper.selectByCid"
                            column="cid"/>
    </resultMap>

<!--兩條sql語(yǔ)句,完成多對(duì)一的分布查詢-->
<!--    這是第一步,根據(jù)id值查詢學(xué)生的所有信息,這些信息當(dāng)中含有班級(jí)id(cid-->
<select id="selectByIdStep1" resultMap="studentResultMapByStep" >
    select sid,sname,cid from t_student_plus where sid = #{sid}
</select>

解釋:

  • <resultMap id="studentResultMap" type="Student">:定義了一個(gè)結(jié)果映射規(guī)則,結(jié)果將映射到 Student 對(duì)象中。
  • <id property="sid" column="sid"/>:將數(shù)據(jù)庫(kù)中的 sid 列映射到 Student 類的 sid 屬性,通常用于映射主鍵。
  • <result property="sname" column="sname"/>:將數(shù)據(jù)庫(kù)中的 sname 列映射到 Student 類的 sname 屬性。
  • <association>:用于描述一個(gè)對(duì)象屬性與其他查詢之間的關(guān)聯(lián)。
    • property="clazz":Student 類中對(duì)應(yīng)的屬性名是 clazz,它表示學(xué)生所屬的班級(jí)。
    • select="com.powernode.mybatis.mapper.ClazzMapper.selectByCid":指定調(diào)用的查詢方法,用于獲取 Clazz 信息。
    • column="cid":指定當(dāng)前查詢結(jié)果中的 cid 列的值,將其作為參數(shù)傳遞給 selectByCid 方法。

 在ClazzMapper接口中添加方法

public interface ClazzMapper {

    /**
     * 分布查詢第二步
     * 根據(jù)cid獲取Clazz信息
     * @param cid
     * @return
     */
    Clazz selectByCid(Integer cid);
}

 ClazzMapper的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="mapper.ClazzMapper">
<select id="selectByCid" resultType="Clazz">
    select cid,cname from t_clazz where cid = #{cid}
</select>
</mapper>

執(zhí)行結(jié)果,可以很明顯看到先后有兩條sql語(yǔ)句執(zhí)行:

延遲加載

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

第一種:fetchType="lazy"

  <resultMap id="studentResultMapByStep" type="Student">
        <id property="sid" column="sid"/>
        <id property="sname" column="sname"/>
       <association property="clazz"
                            select="mapper.ClazzMapper.selectByCid"
                            column="cid"
                            fetchType="lazy"/> <!--添加延遲-->
    </resultMap>

<!--兩條sql語(yǔ)句,完成多對(duì)一的分布查詢-->
<!--    這是第一步,根據(jù)id值查詢學(xué)生的所有信息,這些信息當(dāng)中含有班級(jí)id(cid-->
<select id="selectByIdStep1" resultMap="studentResultMapByStep" >
    select sid,sname,cid from t_student_plus where sid = #{sid}
</select>

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

一對(duì)多

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

在Clazz類中添加List<Student> stus; 屬性。

package pojo;

import java.util.List;

/**
 * 班級(jí)信息
 */
public class Clazz {

    public Clazz() {
    }

    private Integer cid;
    private String cname;
    private List<Student> stus;

    public List<Student> getStus() {
        return stus;
    }

    @Override
    public String toString() {
        return "Clazz{" +
                "cid=" + cid +
                ", cname='" + cname + '\'' +
                ", stus=" + 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;
    }

    public Clazz(Integer cid, String cname) {
        this.cid = cid;
        this.cname = cname;
    }
}

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

  • 第一種方式:collection
  • 第二種方式:分步查詢

collection:

public interface ClazzMapper {

    /**
     * 根據(jù)cid獲取Clazz信息
     * @param cid
     * @return
     */
    Clazz selectByCid(Integer cid);

    /**
     * 根據(jù)班級(jí)編號(hào)查詢班級(jí)信息。同時(shí)班級(jí)中所有的學(xué)生信息也要查詢。
     * @param cid
     * @return
     */
    Clazz selectClazzAndStusByCid(Integer cid);
}
<resultMap id="clazzResultMap" type="Clazz">
  <id property="cid" column="cid"/>
  <result property="cname" column="cname"/>
  <collection property="stus" ofType="Student">
    <id property="sid" column="sid"/>
    <result property="sname" column="sname"/>
  </collection>
</resultMap>

<select id="selectClazzAndStusByCid" resultMap="clazzResultMap">
  select * from t_clazz c join t_student s on c.cid = s.cid where c.cid = #{cid}
</select>

 注意是ofType,表示“集合中的類型”?。?!

分步查詢:

<resultMap id="clazzResultMap" type="Clazz">
  <id property="cid" column="cid"/>
  <result property="cname" column="cname"/>
  <!--主要看這里-->
  <collection property="stus"
              select="com.powernode.mybatis.mapper.StudentMapper.selectByCid"
              column="cid"/>
</resultMap>

<!--sql語(yǔ)句也變化了-->
<select id="selectClazzAndStusByCid" resultMap="clazzResultMap">
  select * from t_clazz c where c.cid = #{cid}
</select>
/**
* 根據(jù)班級(jí)編號(hào)獲取所有的學(xué)生。
* @param cid
* @return
*/
List<Student> selectByCid(Integer cid);
<select id="selectByCid" resultType="Student">
  select * from t_student where cid = #{cid}
</select>

延遲加載

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

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

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

相關(guān)文章

  • SpringBoot中整合Shiro實(shí)現(xiàn)權(quán)限管理的示例代碼

    SpringBoot中整合Shiro實(shí)現(xiàn)權(quán)限管理的示例代碼

    這篇文章主要介紹了SpringBoot中整合Shiro實(shí)現(xiàn)權(quán)限管理的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • MyBatis的逆向工程詳解

    MyBatis的逆向工程詳解

    這篇文章主要介紹了MyBatis的逆向工程詳解,詳細(xì)的介紹了逆行工程的概念和實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Java內(nèi)部類原理、概述與用法實(shí)例詳解

    Java內(nèi)部類原理、概述與用法實(shí)例詳解

    這篇文章主要介紹了Java內(nèi)部類原理、概述與用法,結(jié)合實(shí)例形式詳細(xì)分析了Java內(nèi)部類的相關(guān)概念、原理、訪問(wèn)、調(diào)用方法等操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • SpringBoot feign動(dòng)態(tài)設(shè)置數(shù)據(jù)源(https請(qǐng)求)

    SpringBoot feign動(dòng)態(tài)設(shè)置數(shù)據(jù)源(https請(qǐng)求)

    這篇文章主要介紹了SpringBoot如何在運(yùn)行時(shí)feign動(dòng)態(tài)添加數(shù)據(jù)源,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Springboot pom項(xiàng)目間接依賴包版本與預(yù)期不符原因解決分析

    Springboot pom項(xiàng)目間接依賴包版本與預(yù)期不符原因解決分析

    這篇文章主要介紹了Springboot pom項(xiàng)目間接依賴包版本與預(yù)期不符原因解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • java中關(guān)于getProperties方法的使用

    java中關(guān)于getProperties方法的使用

    這篇文章主要介紹了java中關(guān)于getProperties方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • JAVA DOM解析XML文件過(guò)程詳解

    JAVA DOM解析XML文件過(guò)程詳解

    這篇文章主要介紹了JAVA DOM解析XML文件過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringCloud網(wǎng)關(guān)Gateway功能實(shí)現(xiàn)

    SpringCloud網(wǎng)關(guān)Gateway功能實(shí)現(xiàn)

    本文介紹SpringCloud網(wǎng)關(guān)Gateway功能實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • java中的tostring方法的具體用法

    java中的tostring方法的具體用法

    這篇文章主要介紹了java中的tostring方法的具體用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)一起學(xué)習(xí)一下吧
    2019-06-06
  • elasticsearch集群cluster?discovery可配式模塊示例分析

    elasticsearch集群cluster?discovery可配式模塊示例分析

    這篇文章主要為大家介紹了elasticsearch集群cluster?discovery可配式模塊示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04

最新評(píng)論

开鲁县| 环江| 富宁县| 雅安市| 威信县| 陇南市| 定日县| 定兴县| 淳安县| 杨浦区| 临城县| 延长县| 广元市| 和田县| 香港| 祁连县| 淮滨县| 密云县| 浪卡子县| 通渭县| 望城县| 宁武县| 四川省| 阿拉善右旗| 鞍山市| 柳林县| 顺义区| 怀集县| 栖霞市| 合水县| 白河县| 盐源县| 砀山县| 明星| 滨州市| 湖州市| 芷江| 贞丰县| 淄博市| 利辛县| 常宁市|