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

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

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

多對一:

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

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

  • 第二種方式:一條SQL語句,association。

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

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

原則:誰在前面誰是主表

例如:多對一,多在前面,那么多的那個表就是主表

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

Student類:

package pojo;

/**
 * 學(xué)生信息
 * 沒有cid這個屬性,后期會有特殊的方式來處理這個關(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;
    }
}

對應(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">

    <!-- 級聯(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語句:

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

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

  <resultMap id="studentResultMapAssociation" type="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname"/>
        <!-- 嵌套映射,將 clazz 對象中的 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é)生對象關(guān)聯(lián)一個班級對象。

關(guān)鍵點說明

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

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

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

分步查詢

  <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語句,完成多對一的分布查詢-->
<!--    這是第一步,根據(jù)id值查詢學(xué)生的所有信息,這些信息當中含有班級id(cid-->
<select id="selectByIdStep1" resultMap="studentResultMapByStep" >
    select sid,sname,cid from t_student_plus where sid = #{sid}
</select>

解釋:

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

延遲加載

一對多延遲加載機制和多對一是一樣的。同樣是通過兩種方式:

第一種: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語句,完成多對一的分布查詢-->
<!--    這是第一步,根據(jù)id值查詢學(xué)生的所有信息,這些信息當中含有班級id(cid-->
<select id="selectByIdStep1" resultMap="studentResultMapByStep" >
    select sid,sname,cid from t_student_plus where sid = #{sid}
</select>

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

一對多

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

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

package pojo;

import java.util.List;

/**
 * 班級信息
 */
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;
    }
}

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

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

collection:

public interface ClazzMapper {

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

    /**
     * 根據(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,表示“集合中的類型”!?。?/strong>

分步查詢:

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

延遲加載

一對多延遲加載機制和多對一是一樣的。同樣是通過兩種方式:

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

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

相關(guān)文章

  • Java實現(xiàn)的JSONUtil工具類與用法示例

    Java實現(xiàn)的JSONUtil工具類與用法示例

    這篇文章主要介紹了Java實現(xiàn)的JSONUtil工具類與用法,結(jié)合實例形式分析了Java操作json格式數(shù)據(jù)工具類JSONUtil的定義與簡單使用技巧,需要的朋友可以參考下
    2018-07-07
  • Java中的HashMap和ConcurrentHashMap區(qū)別和適用場景

    Java中的HashMap和ConcurrentHashMap區(qū)別和適用場景

    HashMap和ConcurrentHashMap在對null值的處理、線程安全性、性能等方面存在顯著的區(qū)別,HashMap允許鍵和值為null,適用于單線程環(huán)境下的數(shù)據(jù)存儲和查詢場景;而ConcurrentHashMap不允許鍵和值為null,適用多線程環(huán)境下的數(shù)據(jù)存儲和查詢場景,具有線程安全性和較高的并發(fā)性能
    2025-01-01
  • Java畢業(yè)設(shè)計實戰(zhàn)之財務(wù)預(yù)算管理系統(tǒng)的實現(xiàn)

    Java畢業(yè)設(shè)計實戰(zhàn)之財務(wù)預(yù)算管理系統(tǒng)的實現(xiàn)

    這是一個使用了java+SSM+Jsp+Mysql+Layui+Maven開發(fā)的財務(wù)預(yù)算管理系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有財務(wù)預(yù)算管理該有的所有功能,感興趣的朋友快來看看吧
    2022-02-02
  • SpringBoot實現(xiàn)掃碼登錄的項目實踐

    SpringBoot實現(xiàn)掃碼登錄的項目實踐

    本文主要介紹了SpringBoot實現(xiàn)掃碼登錄的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 淺析java中常用的定時任務(wù)框架-單體

    淺析java中常用的定時任務(wù)框架-單體

    這篇文章主要帶大家了解常用的單體應(yīng)用定時任務(wù)框架以及掌握定時任務(wù)在單體中如何使用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • Java生態(tài)/Redis中使用Lua腳本的過程

    Java生態(tài)/Redis中使用Lua腳本的過程

    這篇文章主要介紹了Java生態(tài)/Redis中如何使用Lua腳本,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 安裝多個版本JDK后使用時的切換方法總結(jié)

    安裝多個版本JDK后使用時的切換方法總結(jié)

    我們平時在window上做開發(fā)的時候,可能需要同時開發(fā)兩個甚至多個項目,有時不同的項目對JDK的版本要求有區(qū)別,下面這篇文章主要給大家介紹了安裝多個版本JDK后使用的切換方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 學(xué)習(xí)java多線程

    學(xué)習(xí)java多線程

    本文運用了大量的代碼講解了java多線程,它可以提高程序并行執(zhí)行的速度,更快的響應(yīng)程序。感興趣的小伙伴一起來看看吧
    2021-08-08
  • Java設(shè)計模式之備忘錄模式使用詳解

    Java設(shè)計模式之備忘錄模式使用詳解

    這篇文章主要介紹了Java設(shè)計模式中備忘錄模式的使用,備忘錄設(shè)計模式也叫作快照模式,主要用于實現(xiàn)防丟失、撤銷、恢復(fù)等功能,本文將通過示例為大家講解備忘錄模式的定義與使用,需要的同學(xué)可以參考一下
    2024-02-02
  • 一篇文章弄懂JVM類加載機制過程以及原理

    一篇文章弄懂JVM類加載機制過程以及原理

    JVM原理對于初學(xué)者而言,比較晦澀難以理解,概念繁多又比較抽象,很多時候感覺看不見摸不著,還不好驗證,下面這篇文章主要給大家介紹了關(guān)于如何通過一篇文章弄懂JVM類加載機制過程及原理的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評論