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

解決mybatis三表連接查詢(xún)數(shù)據(jù)重復(fù)的問(wèn)題

 更新時(shí)間:2021年01月07日 09:30:38   作者:周向源  
這篇文章主要介紹了解決mybatis三表連接查詢(xún)數(shù)據(jù)重復(fù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

此問(wèn)題的產(chǎn)生,主要是數(shù)據(jù)庫(kù)的字段名一樣導(dǎo)致

三張表 DOCTOR JOB OBJECT

有問(wèn)題的查詢(xún)語(yǔ)句和查詢(xún)結(jié)果是:

SELECT d.*,j.*,o.* from
 (select d.*,rownum r from DOCTOR d where rownum<=6) d
 join job j on d.job_id=j.id join object o on o.id=d.object_id
 where r>0
<img src="https://img-blog.csdn.net/20161020110037608?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

注意 :查詢(xún)結(jié)果中有6列是一樣的id,name

修改為別名

SELECT d.*,j.name jobn,j.id jid,j.oid joid,o.id objid,o.name objn from
 (select d.*,rownum r from DOCTOR d where rownum<=6) d
 join job j on d.job_id=j.id join object o on o.id=d.object_id
 where r>0
<span style="color:#3366ff;">新的查詢(xún)結(jié)果是:  注意看列名</span>
<span style="color:#3366ff;">
</span>
<span style="color:#3366ff;"><img src="https://img-blog.csdn.net/20161020110703515?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
</span>

此時(shí)依然不能解決數(shù)據(jù)重復(fù)問(wèn)題,還需要修改resultMap的column屬性名為別名

至此問(wèn)題全部解決!

補(bǔ)充:Mybatis連3表查詢(xún)數(shù)據(jù)resultMap結(jié)果映射

一、前言                              

MyBatis是基于“數(shù)據(jù)庫(kù)結(jié)構(gòu)不可控”的思想建立的,也就是我們希望數(shù)據(jù)庫(kù)遵循第三范式或BCNF,但實(shí)際事與愿違,那么結(jié)果集映射就是MyBatis為我們提供這種理想與現(xiàn)實(shí)間轉(zhuǎn)換的手段了,而resultMap就是結(jié)果集映射的配置標(biāo)簽了。

二、從SQL查詢(xún)結(jié)果到領(lǐng)域模型實(shí)體                  

在深入ResultMap標(biāo)簽前,我們需要了解從SQL查詢(xún)結(jié)果集到JavaBean或POJO實(shí)體的過(guò)程。

1. 通過(guò)JDBC查詢(xún)得到ResultSet對(duì)象

2. 遍歷ResultSet對(duì)象并將每行數(shù)據(jù)暫存到HashMap實(shí)例中,以結(jié)果集的字段名或字段別名為鍵,以字段值為值

3. 根據(jù)ResultMap標(biāo)簽的type屬性通過(guò)反射實(shí)例化領(lǐng)域模型

4. 根據(jù)ResultMap標(biāo)簽的type屬性和id、result等標(biāo)簽信息將HashMap中的鍵值對(duì),填充到領(lǐng)域模型實(shí)例中并返回

三、ResultMap標(biāo)簽                        

1. 屬性說(shuō)明

id屬性 ,resultMap標(biāo)簽的標(biāo)識(shí)。

type屬性 ,返回值的全限定類(lèi)名,或類(lèi)型別名。

autoMapping屬性 ,值范圍true(默認(rèn)值)|false, 設(shè)置是否啟動(dòng)自動(dòng)映射功能,自動(dòng)映射功能就是自動(dòng)查找與字段名小寫(xiě)同名的屬性名,并調(diào)用setter方法。而設(shè)置為false后,則需要在`resultMap`內(nèi)明確注明映射關(guān)系才會(huì)調(diào)用對(duì)應(yīng)的setter方法。

2. 基本作用:建立SQL查詢(xún)結(jié)果字段與實(shí)體屬性的映射關(guān)系信息

示例1:通過(guò)setter構(gòu)造領(lǐng)域模型

public class EStudent{
 private long id;
 private String name;
 private int age;
 // getter,setter方法

 /**
 * 必須提供一個(gè)無(wú)參數(shù)的構(gòu)造函數(shù)
 */
 public EStudent(){}
}
<select id="getStudent" resultMap="getStudentRM">
 SELECT ID, Name, Age
 FROM TStudent
</select>
<resultMap id="getStudentRM" type="EStudnet">
 <id property="id" column="ID"/>
 <result property="studentName" column="Name"/>
 <result property="studentAge" column="Age"/>
</resultMap>

子元素說(shuō)明:

id元素 ,用于設(shè)置主鍵字段與領(lǐng)域模型屬性的映射關(guān)系

result元素 ,用于設(shè)置普通字段與領(lǐng)域模型屬性的映射關(guān)系

示例2:通過(guò)構(gòu)造函數(shù)構(gòu)造領(lǐng)域模型

public class EStudent{
 private long id;
 private String name;
 private int age;
 // getter方法
 public EStudent(long id, String name, int age){
 this.id = id;
 this.name = name;
 this.age = age;
 }
}
<select id="getStudent" resultMap="getStudentRM">
 SELECT ID, Name, Age
 FROM TStudent
</select>
<resultMap id="getStudentRM" type="EStudnet">
 <constructor>
 <idArg column="ID" javaType="_long"/>
 <arg column="Name" javaType="String"/>
 <arg column="Age" javaType="_int"/>
 </constructor>
</resultMap>

子元素說(shuō)明:

constructor元素 ,指定使用指定參數(shù)列表的構(gòu)造函數(shù)來(lái)實(shí)例化領(lǐng)域模型。注意:其子元素順序必須與參數(shù)列表順序?qū)?yīng)

idArg子元素 ,標(biāo)記該入?yún)橹麈I

arg子元素 ,標(biāo)記該入?yún)槠胀ㄗ侄?主鍵使用該子元素設(shè)置也是可以的)

3. 一對(duì)一關(guān)系、一對(duì)多關(guān)系查詢(xún)這里不多說(shuō)

注意:在采用嵌套結(jié)果的方式查詢(xún)一對(duì)一、一對(duì)多關(guān)系時(shí),必須要通過(guò)resultMap下的id或result標(biāo)簽來(lái)顯式設(shè)置屬性/字段映射關(guān)系,否則在查詢(xún)多條記錄時(shí)會(huì)僅僅返回最后一條記錄的情況。

4. 動(dòng)態(tài)映射關(guān)系信息

通過(guò) discriminator子元素 (鑒別器)可以實(shí)現(xiàn)動(dòng)態(tài)映射關(guān)系信息的設(shè)置。具體示例如下:

public class EStudent{
 private long id;
 private String name;
 private String juniorHighSchool;
 private String seniorHighSchool;
 private int during; // 在本校就讀時(shí)間
 // getter,setter方法

 /**
 * 必須提供一個(gè)無(wú)參數(shù)的構(gòu)造函數(shù)
 */
 public EStudent(){}
}

情景:查詢(xún)學(xué)生信息的seniorHighSchool信息,若就讀時(shí)間during字段值為4、5、6時(shí),則以juniorHighSchool字段作所為seniorHighSchool信息。

<select id="getStundent" resultMap="rm">
 SELECT ID, Name, JuniorHighSchool, SeniorHighSchool, during
 FROM TStudent
</select>
<resultMap id="rm" type="EStudent">
 // 若不加這句,則當(dāng)將juniorHighSchool賦予給seniorHighSchool屬性時(shí),juniorHighSchool屬性將為null
 <result column="juniorHighSchool" property="juniorHighSchool"/>

 <discriminator column="during" javaType="_int">
 // 形式1:通過(guò)resultType設(shè)置動(dòng)態(tài)映射信息
 <case value="4" resultType="EStudent">
  <result column="juniorHighSchool" property="seniorHighSchool"/>
 </case>

 // 形式2: 通過(guò)resultMap設(shè)置動(dòng)態(tài)映射信息
 <case value="5" resultMap="dynamicRM"/>
 <case value="6" resultMap="dynamicRM"/>
 </discriminator>
</resultMap>
<resultMap id="dynamicRM" type="EStudent">
 <result column="juniorHighSchool" property="seniorHighSchool"/>
</resultMap>

注意:上面關(guān)于 discriminator子元素 的 case元素 的 resultType屬性 和 resultMap元素 的 type屬性 ,均不是直指返回的領(lǐng)域模型類(lèi)型,而是指定根據(jù)判斷條件后得到映射關(guān)系,可通過(guò) id子元素 和 result子元素 重寫(xiě)映射關(guān)系。

5. id元素,result元素,idArg元素,arg元素,discriminator元素的共同屬性

javaType屬性 :Java類(lèi)的全限定名,或別名

jdbcType屬性 :JDBC類(lèi)型, JDBC類(lèi)型為CUD操作時(shí)列可能為空時(shí)進(jìn)行處理

typeHandler屬性 :指定類(lèi)型處理器的全限定類(lèi)名或類(lèi)型別名

column屬性 :指定SQL查詢(xún)結(jié)果的字段名或字段別名。將用于JDBC的 resultSet.getString(columnName)

四、總結(jié)                                  

掌握上述內(nèi)容,那么在寫(xiě)一對(duì)一關(guān)系、一對(duì)多關(guān)系查詢(xún)時(shí)就更有把握了哦!

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Java 注解學(xué)習(xí)筆記

    Java 注解學(xué)習(xí)筆記

    這篇文章主要介紹了Java 注解的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 如何通過(guò)XML方式配置并實(shí)現(xiàn)Mybatis

    如何通過(guò)XML方式配置并實(shí)現(xiàn)Mybatis

    這篇文章主要介紹了如何通過(guò)XML方式配置并實(shí)現(xiàn)Mybatis,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java并發(fā)編程——volatile關(guān)鍵字

    Java并發(fā)編程——volatile關(guān)鍵字

    這篇文章主要介紹了Java并發(fā)編程——volatile關(guān)鍵字的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java并發(fā)編程,感興趣的朋友可以了解下
    2020-10-10
  • SpringBoot應(yīng)用程序啟動(dòng)監(jiān)聽(tīng)功能的常見(jiàn)方法

    SpringBoot應(yīng)用程序啟動(dòng)監(jiān)聽(tīng)功能的常見(jiàn)方法

    應(yīng)用啟動(dòng)監(jiān)聽(tīng)在?Spring?Boot?和其他框架中扮演著重要的角色,它們的主要作用是在應(yīng)用啟動(dòng)或關(guān)閉時(shí)觸發(fā)特定的操作或任務(wù),本文給大家介紹了SpringBoot應(yīng)用程序啟動(dòng)監(jiān)聽(tīng)功能的常見(jiàn)方法,需要的朋友可以參考下
    2024-05-05
  • 詳解java爬蟲(chóng)jsoup解析多空格class數(shù)據(jù)

    詳解java爬蟲(chóng)jsoup解析多空格class數(shù)據(jù)

    在本篇內(nèi)容中小編給大家分享了java爬蟲(chóng)jsoup怎么解析多空格class數(shù)據(jù)的方法和技巧,需要的朋友們跟著學(xué)習(xí)下。
    2018-12-12
  • java讀取XML文件的四種方法總結(jié)(必看篇)

    java讀取XML文件的四種方法總結(jié)(必看篇)

    下面小編就為大家?guī)?lái)一篇java讀取XML文件的四種方法總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java實(shí)現(xiàn)字符數(shù)組全排列的方法

    Java實(shí)現(xiàn)字符數(shù)組全排列的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)字符數(shù)組全排列的方法,涉及Java針對(duì)字符數(shù)組的遍歷及排序算法的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-12-12
  • Java連接Mysql數(shù)據(jù)庫(kù)詳細(xì)代碼實(shí)例

    Java連接Mysql數(shù)據(jù)庫(kù)詳細(xì)代碼實(shí)例

    這篇文章主要介紹了Java連接Mysql數(shù)據(jù)庫(kù)詳細(xì)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟

    SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟

    我們的微服務(wù)項(xiàng)目用的是springCloud,某個(gè)微服務(wù)接口因?yàn)閿?shù)據(jù)處理量大,出現(xiàn)了接口超時(shí)的情況,我們需要單獨(dú)修改這一個(gè)feignClient的超時(shí)時(shí)間,所以本文介紹了SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟,需要的朋友可以參考下
    2023-10-10
  • Java的泛型擦除和運(yùn)行時(shí)泛型信息獲取方式

    Java的泛型擦除和運(yùn)行時(shí)泛型信息獲取方式

    Java泛型在編譯時(shí)會(huì)發(fā)生類(lèi)型擦除,即泛型參數(shù)被替換為它們的限定類(lèi)型(如Object),這使得ArrayList<Integer>和ArrayList<String>在運(yùn)行時(shí)類(lèi)型相同,盡管如此,我們可以通過(guò)定義類(lèi)或匿名內(nèi)部類(lèi)的方式在運(yùn)行時(shí)獲取泛型信息
    2024-09-09

最新評(píng)論

亳州市| 芜湖县| 黄冈市| 大方县| 榆社县| 东城区| 沙河市| 五原县| 新民市| 广宗县| 砚山县| 义马市| 庄河市| 柞水县| 疏附县| 鄯善县| 桂林市| 灵宝市| 花莲市| 高陵县| 隆安县| 泗阳县| 黄龙县| 来凤县| 嘉善县| 施甸县| 唐河县| 额敏县| 城口县| 北辰区| 浦城县| 苗栗县| 永福县| 延川县| 德兴市| 阿坝| 灯塔市| 增城市| 沈阳市| 利川市| 年辖:市辖区|