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

Mybatis查詢語句結(jié)果集的總結(jié)大全

 更新時(shí)間:2018年08月10日 10:51:38   作者:DaleZhang  
這篇文章主要給大家總結(jié)介紹了關(guān)于Mybatis查詢語句結(jié)果集的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

簡(jiǎn)單查詢-resultType

數(shù)據(jù)準(zhǔn)備

字段 注釋
SNO 學(xué)號(hào)
SNAME 學(xué)生名字
SSEX 性別
SBIRITHDAY 生日
CLASS 班級(jí)

<!--建表語句:-->
create table TEST.STUDENT
(
 SNO varchar(3) not null,
 SNAME varchar(4) not null,
 SSEX varchar(2) not null,
 SBIRTHDAY datetime null,
 CLASS varchar(5) null
)
<!--Bean 文件-->
public class Student {
 private String SNO;
 private String SNAME;
 private String SSEX;
 private Date SBIRTHDAY;
 private String CLASS;
 
 <!--get 和 set 方法-->
 ...
}

例子

按照返回?cái)?shù)據(jù)類型大致分為基礎(chǔ)數(shù)據(jù)類型,JavaBean 和 Map。其中雖然返回的結(jié)果行數(shù)有單條也有多條,對(duì)應(yīng)的接口返回類型是集合或者單個(gè)對(duì)象,但是在 xml 映射文件中,resultType 的值是相同的。

1、指定字段-基礎(chǔ)數(shù)據(jù)類型

接口類:

<!--單條結(jié)果集-->
String querySingleStudent();
<!--多條結(jié)果集-->
List<String> queryAllStudent();

Mapper 文件:

<!--單條結(jié)果集-->
<select id="querySingleStudent" resultType="string">
 SELECT SNAME FROM TEST.STUDENT LIMIT 1
</select>
<!--多條結(jié)果集-->
<select id="queryAllStudent" resultType="string">
 SELECT SNAME FROM TEST.STUDENT
</select>

2、Map,一般為 hashMap

接口類:

<!--單條結(jié)果集-->
Map<String, Object> queryStudentMap();
<!--多條結(jié)果集-->
List<Map<String, Object>> queryAllStudentMap();
復(fù)制代碼Mapper 文件:
<!--單條結(jié)果集-->
<select id="queryStudentMap" resultType="hashmap">
 SELECT SNAME FROM TEST.STUDENT LIMIT 1
</select>
<!--多條結(jié)果集-->
<select id="queryAllStudentMap" resultType="hashmap">
 SELECT SNAME FROM TEST.STUDENT
</select>

其中:

  • hashmap 為簡(jiǎn)寫,也可以使用 java.util.HashMap 全稱
  • 默認(rèn)情況下,結(jié)果集中值為 null 時(shí), 不會(huì)增加映射對(duì)象的 setter 方法, (map 對(duì)象時(shí)為 put)。該行為可以在 mybatis-config.xml 配置文件中設(shè)置
    <setting name="callSettersOnNulls" value="true"/> 覆蓋默認(rèn)設(shè)定。

3、JavaBean

接口類:

<!--單條結(jié)果集-->
Student querySingleStudentBean();
<!--多條結(jié)果集-->
List<Student> queryAllStudentBean();

Mapper 文件:

<!--單條結(jié)果集-->
<select id="queryStudentMap" resultType="student">
 SELECT SNAME FROM TEST.STUDENT LIMIT 1
</select>
<!--多條結(jié)果集-->
<select id="queryAllStudentMap" resultType="student">
 SELECT SNAME FROM TEST.STUDENT
</select>

resultType="student" 為 Student.java 的別名,也可以是全限定名。別名在 mybatis-config.xml 配置文件中設(shè)置:

<typeAliases>
 <typeAlias type="com.bean.Student" alias="student"/>
 ...
</typeAliases>

但是如果 JavaBean 文件很多,不想一個(gè)個(gè)指定,也可以使用 package 標(biāo)簽 設(shè)置mybatis自動(dòng)掃描,別名即為類名的小寫。

<typeAliases>
 <package name="包名"/>
</typeAliases>

復(fù)雜查詢 resultMap

對(duì)于一般的查詢語句,resultType 足夠了。對(duì)于多表查詢等情況,就要請(qǐng)出 resultMap 了。

數(shù)據(jù)庫字段和 java 數(shù)據(jù)類型映射關(guān)系

數(shù)據(jù)庫字段類型 jdbcType 和 java 數(shù)據(jù)類型 并不是一一對(duì)應(yīng)的關(guān)系,而且不同數(shù)據(jù)庫類型也不盡相同。而 mybatis 將 TypeHandler 作為兩者之間的映射關(guān)系。大部分情況下都是沒有問題的,但是并非能覆蓋所有的情況,特殊情況下可以使用 resultMap 自定義這種映射關(guān)系。

舉個(gè)例子,數(shù)據(jù)庫 LongVarchar 字段類型對(duì)應(yīng) java 中的 String 類型。但是在 DB2 數(shù)據(jù)庫中,查詢的 LongVarchar 類型的字段,在 mybatis 中被識(shí)別成 jdbcType 為 BLOB。有兩種解決方法,第一種是在 SQL 中對(duì)該字段使用 CAST 轉(zhuǎn)換為 VARCHAR(長(zhǎng)度)類型。另一種是使用 resultMap:

<resultMap id="resultMapDemo" type="" autoMapping="true">
 <result property="" column="" jdbcType="VARCHAR" />
</resultMap>

<select id="demoID" resultMap="resultMapDemo">
...
<select>

1、<select>標(biāo)簽中使用 resultMap 指定返回集合。注意 resultMap 和 resultType 不能同時(shí)使用

2、<resultMap> 標(biāo)簽

  • id 和 select 標(biāo)簽指定映射關(guān)系
  • type 和 resultType 一樣為返回類型的全限定名或者別名
  • autoMapping 自動(dòng)映射關(guān)系,在這里目的只是修改一個(gè)字段,其他自動(dòng)采用自動(dòng)完成映射關(guān)系

3、<result> 標(biāo)簽

  • property 為 java 變量名
  • column 為數(shù)據(jù)庫字段名
  • jdbcType 這里指定為 VARCHAR

id

字段的映射關(guān)系的標(biāo)簽即有,也有,在 mybatis 文檔中指出不使用id,會(huì)造成性能下降,因此將主鍵字段使用 id 標(biāo)簽是推薦的做法。但是如果不存在主鍵呢,當(dāng)你在 ResultMap 只提供了部分字段而不是全部字段,即使使用了 autoMapping 屬性,那么 mybatis 會(huì)按照你提供的字段名進(jìn)行去重。那么在使用 resultMap 的時(shí)候,最優(yōu)選擇是:

  • 如果表存在主鍵,就使用id標(biāo)簽指定
  • 如果表不存在主鍵,要么不配置字段的映射關(guān)系,使用 autoMapping 屬性自動(dòng)映射;或者不使用 autoMapping 將所有字段羅列。

多表關(guān)聯(lián)查詢

在 resultType 的例子中都只涉及到一張表,如果涉及多張表關(guān)聯(lián)查詢呢。我們可以簡(jiǎn)單的將所有列映射到 hashmap 的鍵值上。

但是 HashMap 不是一個(gè)很好的領(lǐng)域模型。 你的程序更可能會(huì)使用 JavaBean 或 POJO(Plain Old Java Objects,普通 Java 對(duì)象)作為領(lǐng)域模型。

因此這里均采用 JavaBean 作為領(lǐng)域模型。增加一個(gè)成績(jī)表 Score

字段 注釋
SNO 學(xué)號(hào)
CNO 課程編號(hào)
DEGREE 成績(jī)

<!--建表語句-->
create table SCORE
(
 SNO varchar(3) not null,
 CNO varchar(5) not null,
 DEGREE decimal(10, 1) not null
)
<!--Bean 文件-->
public class Score {
 private String SNO;
 private String CNO;
 private Double DEGREE;
 <!--get 和 set 方法-->
 ...
}

一對(duì)一關(guān)系

這里的一對(duì)多關(guān)系是兩個(gè)表字段一一對(duì)應(yīng),一個(gè)學(xué)生的某門課的成績(jī)是唯一確定的。 在一一對(duì)應(yīng)的情況下要在 resultMap 中使用  標(biāo)簽。

在 Student.java 中增加字段 Score

<!--Student.java-->
private Score score;
public Score getScore() {
 return score;
}
public void setScore(Score score) {
 this.score = score;
}

有兩種使用情況,第一種為嵌套查詢,即前一個(gè) SQL 查詢結(jié)果集中的字段作為參數(shù)傳遞給下一個(gè) SQL。第二種情況為嵌套結(jié)果集,即兩個(gè)表做關(guān)聯(lián)查詢,將結(jié)果集映射到多個(gè) JavaBean 文件。

嵌套查詢

<resultMap id="allstudentResultMap" type="student">
 <!--指定第二個(gè) SELECT 語句,和傳遞的字段-->
 <association property="score" column="sno" select="queryScore" />
</resultMap>

<!--第一個(gè) SQL -->
<select id="queryAllStudent" resultMap="allstudentResultMap">
 select SNO,SNAME
 from test.STUDENT
</select>

<!--第二個(gè) SQL-->
<select id="queryScore" resultType="score">
 select degree from test.SCORE
 where sno = #{sno}
</select>

在標(biāo)簽中

  • property 指向了 Student.java 中新增的 score 字段。
  • column 指定了作為參數(shù)傳遞給下一個(gè)查詢SQL的字段,需要注意的是對(duì)于傳遞單個(gè)字段的情況,mybatis 只是簡(jiǎn)單的將 #{參數(shù)} 替換為占位符 ?, 然后執(zhí)行 resultSet.getString(columnName),沒有進(jìn)行參數(shù)匹配,因此第二個(gè) SQL 中 #{} 中寫任何字符都可以;如果需要傳遞多個(gè)字段,使用 column = " {prop1=col1,prop2=col2} ",這種情況下會(huì)以參數(shù)對(duì)象的形式來傳遞。
  • select 指定了下一個(gè) SELECT 語句

另外需要注意的是這種嵌套查詢對(duì)于大型結(jié)果集和列名并友好,存在 N+1 的問題,因?yàn)橄乱粭l SQL 會(huì)執(zhí)行 N 次去循環(huán)查詢,使用關(guān)聯(lián)查詢更合適。再者也可以開啟 mybatis 的懶查詢功能,嵌套的 SQL 不是一口氣順序執(zhí)行完,而是在使用的時(shí)候才會(huì)執(zhí)行下一條 SQL。例如執(zhí)行student.getScore().getSNO()才會(huì)執(zhí)行queryScore的 SQL。默認(rèn)情況下沒有開啟,需要在配置文件中設(shè)置

設(shè)置參數(shù) 描述 默認(rèn)值
lazyLoadingEnabled 延遲加載的全局開關(guān),特定關(guān)聯(lián)關(guān)系中可通過設(shè)置 fetchType 屬性來覆蓋該項(xiàng)的開關(guān)狀態(tài) false
aggressiveLazyLoading 當(dāng)開啟時(shí),任何方法的調(diào)用都會(huì)加載該對(duì)象的所有屬性。否則,每個(gè)屬性會(huì)按需加載 false (true in ≤3.4.1)
<!--mybatis-config.xml-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>

也可以在標(biāo)簽中設(shè)置 fetchType = “l(fā)azy” 開啟懶加載,會(huì)覆蓋全局的參數(shù)設(shè)置。

嵌套結(jié)果集

對(duì)于多表關(guān)聯(lián)查詢,一般在 SQL 中使用別名來避免字段名的重復(fù)。mybatis 要做的是將別名正確的映射到 JavaBean 屬性上。

<!--嵌套結(jié)果-->
<resultMap id="associationDemoMap" type="student" autoMapping="true">
 <association property="score" javaType="score">
  <result property="SNO" column="SC_SNO"/>
 </association>
</resultMap>

<select id="queryStudentScore" resultMap="associationDemoMap">
 SELECT SNAME, SSEX, CLASS, ST.SNO, SC.SNO AS SC_SNO
 FROM test.student st INNER JOIN test.score sc 
 ON st.sno = sc.sno
 where CNO = '3-105';
</select>

通過設(shè)置標(biāo)簽指定了表列名和屬性之間的映射關(guān)系。但這樣如果字段很多,會(huì)需要一一指定,標(biāo)簽提供了columnPrefix屬性,指定別名的前綴,這樣可以重用resultMap

<resultMap id="associationDemoMap" type="student" autoMapping="true">
 <!--columnPrefix 指定別名的前綴-->
 <association property="score" resultMap="anotherMap" columnPrefix="SC_" />
</resultMap>

<!--方便重用-->
<resultMap id="anotherMap" type="score" autoMapping="true">
</resultMap>

一對(duì)多關(guān)系

除了一對(duì)一的關(guān)系,還有一對(duì)多的關(guān)系,比如這里一個(gè)學(xué)生Student 對(duì)應(yīng)多門課的成績(jī)。 一對(duì)多對(duì)應(yīng)的情況下要在 resultMap 中使用  標(biāo)簽。首先需要調(diào)整 JavaBean 文件中兩個(gè)表之間的關(guān)系。

<!--Student.java-->
private List<Score> score;
public List<Score> getScore() {
 return score;
}
public void setScore(List<Score> score) {
 this.score = score;
}

以嵌套結(jié)果集為例

<resultMap id="collectionDemoMap" type="student" autoMapping="true">
 <!--多出了 ofType 屬性-->
 <collection property="score" ofType="score">
  <result property="SNO" column="SC_SNO"/>
 </collection>
</resultMap>

<select id="queryStudentScore" resultMap="collectionDemoMap">
 SELECT SNAME,SSEX,CLASS,ST.SNO,SC.SNO AS SC_SNO
 FROM test.student st INNER JOIN test.score sc
 ON st.sno = sc.sno
</select>

注意到相比 association 多了一個(gè)屬性ofType,是用來表示 List 集合中的類型的。其他屬性的用法同 association 是一樣的。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • java如何給對(duì)象按照字符串屬性進(jìn)行排序

    java如何給對(duì)象按照字符串屬性進(jìn)行排序

    這篇文章主要介紹了java如何給對(duì)象按照字符串屬性進(jìn)行排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 關(guān)于Spring中聲明式事務(wù)的使用詳解

    關(guān)于Spring中聲明式事務(wù)的使用詳解

    Spring中事務(wù)分為編程式事務(wù)和聲明式事務(wù),編程式事務(wù)由于需要在代碼中硬編碼,在實(shí)際項(xiàng)目開發(fā)中比較少用到,實(shí)際開發(fā)中用的比較多的就是聲明式事務(wù),這篇文章主要給大家介紹了關(guān)于Spring中聲明式事務(wù)使用的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Java Bean的作用域,生命周期和注解

    Java Bean的作用域,生命周期和注解

    這篇文章主要介紹了淺談Spring中Bean的作用域,生命周期和注解,具有一定借鑒價(jià)值,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • Mybatis緩存機(jī)制詳解與實(shí)例分析

    Mybatis緩存機(jī)制詳解與實(shí)例分析

    Mybatis的緩存分為一級(jí)緩存和二級(jí)緩存,一級(jí)緩存是SqlSession級(jí)別的而二級(jí)緩存是mapper級(jí)別的,本文詳細(xì)的介紹了Mybatis緩存機(jī)制與實(shí)例分析,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • 實(shí)例詳解MyBatis-plus自動(dòng)填充功能

    實(shí)例詳解MyBatis-plus自動(dòng)填充功能

    每次對(duì)數(shù)據(jù)進(jìn)行新增、刪除、修改時(shí)都需要對(duì)這些字段進(jìn)行設(shè)置,雖然新增時(shí)間和修改時(shí)間可以使用數(shù)據(jù)庫的時(shí)間,但是新增人和修改人就不能使用這樣的功能,下面小編給大家介紹下MyBatis-plus自動(dòng)填充功能的實(shí)例代碼,感興趣的朋友一起看看吧
    2022-01-01
  • Java8之lambda最佳實(shí)踐_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java8之lambda最佳實(shí)踐_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    在8 里面Lambda是最火的主題,不僅僅是因?yàn)檎Z法的改變,更重要的是帶來了函數(shù)式編程的思想,我覺得優(yōu)秀的程序員,有必要學(xué)習(xí)一下函數(shù)式編程的思想以開闊思路
    2017-06-06
  • SpringBoot接口如何統(tǒng)一異常處理

    SpringBoot接口如何統(tǒng)一異常處理

    這篇文章主要介紹了SpringBoot接口如何統(tǒng)一異常處理,SpringBoot接口如何對(duì)異常進(jìn)行統(tǒng)一封裝,并統(tǒng)一返回呢?以下文的參數(shù)校驗(yàn)為例,如何優(yōu)雅的將參數(shù)校驗(yàn)的錯(cuò)誤信息統(tǒng)一處理并封裝返回呢,感興趣的下下伙伴可以一同參考一下
    2022-07-07
  • log4j日志格式加入自定義字段信息方式

    log4j日志格式加入自定義字段信息方式

    這篇文章主要介紹了log4j日志格式加入自定義字段信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 基于Java驗(yàn)證jwt token代碼實(shí)例

    基于Java驗(yàn)證jwt token代碼實(shí)例

    這篇文章主要介紹了基于Java驗(yàn)證jwt token代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • nacos配置實(shí)例權(quán)重不生效問題

    nacos配置實(shí)例權(quán)重不生效問題

    這篇文章主要介紹了nacos配置實(shí)例權(quán)重不生效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

河西区| 四川省| 紫金县| 延川县| 固镇县| 宁蒗| 阜南县| 赣州市| 星子县| 和林格尔县| 克拉玛依市| 澳门| 奉贤区| 喀喇沁旗| 武义县| 苍南县| 蛟河市| 黄骅市| 安国市| 杭州市| 彭阳县| 若尔盖县| 全州县| 开封县| 齐齐哈尔市| 高唐县| 唐海县| 革吉县| 托克逊县| 安溪县| 安多县| 五华县| 昌图县| 周至县| 公安县| 广西| 泸溪县| 克什克腾旗| 游戏| 许昌市| 佛坪县|