亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Mybatis查詢語句結果集的總結大全

2024-07-14 08:41:59
字體:
來源:轉載
供稿:網友

簡單查詢-resultType

數據準備

 

字段 注釋
SNO 學號
SNAME 學生名字
SSEX 性別
SBIRITHDAY 生日
CLASS 班級

 

<!--建表語句:-->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 方法--> ...}

例子

按照返回數據類型大致分為基礎數據類型,JavaBean 和 Map。其中雖然返回的結果行數有單條也有多條,對應的接口返回類型是集合或者單個對象,但是在 xml 映射文件中,resultType 的值是相同的。

1、指定字段-基礎數據類型

接口類:

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

Mapper 文件:

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

2、Map,一般為 hashMap

接口類:

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

其中:

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

3、JavaBean

接口類:

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

Mapper 文件:

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

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

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

但是如果 JavaBean 文件很多,不想一個個指定,也可以使用 package 標簽 設置mybatis自動掃描,別名即為類名的小寫。

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

復雜查詢 resultMap

對于一般的查詢語句,resultType 足夠了。對于多表查詢等情況,就要請出 resultMap 了。

數據庫字段和 java 數據類型映射關系

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

舉個例子,數據庫 LongVarchar 字段類型對應 java 中的 String 類型。但是在 DB2 數據庫中,查詢的 LongVarchar 類型的字段,在 mybatis 中被識別成 jdbcType 為 BLOB。有兩種解決方法,第一種是在 SQL 中對該字段使用 CAST 轉換為 VARCHAR(長度)類型。另一種是使用 resultMap:

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

1、<select>標簽中使用 resultMap 指定返回集合。注意 resultMap 和 resultType 不能同時使用

2、<resultMap> 標簽

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

3、<result> 標簽

  • property 為 java 變量名
  • column 為數據庫字段名
  • jdbcType 這里指定為 VARCHAR

id

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

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

多表關聯查詢

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

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

因此這里均采用 JavaBean 作為領域模型。增加一個成績表 Score

 

字段 注釋
SNO 學號
CNO 課程編號
DEGREE 成績

 

<!--建表語句-->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 方法--> ...}

一對一關系

這里的一對多關系是兩個表字段一一對應,一個學生的某門課的成績是唯一確定的。 在一一對應的情況下要在 resultMap 中使用  標簽。

在 Student.java 中增加字段 Score

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

有兩種使用情況,第一種為嵌套查詢,即前一個 SQL 查詢結果集中的字段作為參數傳遞給下一個 SQL。第二種情況為嵌套結果集,即兩個表做關聯查詢,將結果集映射到多個 JavaBean 文件。

嵌套查詢

<resultMap id="allstudentResultMap" type="student"> <!--指定第二個 SELECT 語句,和傳遞的字段--> <association property="score" column="sno" select="queryScore" /></resultMap><!--第一個 SQL --><select id="queryAllStudent" resultMap="allstudentResultMap"> select SNO,SNAME from test.STUDENT</select><!--第二個 SQL--><select id="queryScore" resultType="score"> select degree from test.SCORE where sno = #{sno}</select>

在標簽中

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

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

設置參數 描述 默認值
lazyLoadingEnabled 延遲加載的全局開關,特定關聯關系中可通過設置 fetchType 屬性來覆蓋該項的開關狀態 false
aggressiveLazyLoading 當開啟時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載 false (true in ≤3.4.1)
<!--mybatis-config.xml--><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>

也可以在標簽中設置 fetchType = “lazy” 開啟懶加載,會覆蓋全局的參數設置。

嵌套結果集

對于多表關聯查詢,一般在 SQL 中使用別名來避免字段名的重復。mybatis 要做的是將別名正確的映射到 JavaBean 屬性上。

<!--嵌套結果--><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>

通過設置標簽指定了表列名和屬性之間的映射關系。但這樣如果字段很多,會需要一一指定,標簽提供了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>

一對多關系

除了一對一的關系,還有一對多的關系,比如這里一個學生Student 對應多門課的成績。 一對多對應的情況下要在 resultMap 中使用  標簽。首先需要調整 JavaBean 文件中兩個表之間的關系。

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

以嵌套結果集為例

<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 多了一個屬性ofType,是用來表示 List 集合中的類型的。其他屬性的用法同 association 是一樣的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日韩欧美综合| 色中色综合影院手机版在线观看| 亚洲欧美精品一区二区| 欧美色另类天堂2015| 欧美高清理论片| 欧美中文字幕视频| 欧美国产亚洲精品久久久8v| 亚洲欧美日韩成人| 一本大道香蕉久在线播放29| 亚洲网站在线播放| 亚洲视频777| 国内精品久久影院| 亚洲综合在线做性| 97碰碰碰免费色视频| 国产精品久久久久久久久借妻| 国产成人精品久久二区二区| 91精品久久久久久综合乱菊| 亚洲第一男人av| 国产亚洲精品久久久久动| 国产精品老女人视频| 欧美丝袜一区二区| 91精品国产自产在线老师啪| 欧美激情网站在线观看| 国内成人精品一区| 日本精品性网站在线观看| 91高清视频免费观看| 精品美女国产在线| 亚洲美女在线视频| 国产精品视频精品视频| 国产精品日韩欧美| 欧美在线日韩在线| 日韩在线免费av| 亚洲免费小视频| 97超碰国产精品女人人人爽| 秋霞午夜一区二区| 欧美午夜精品久久久久久久| 97成人精品区在线播放| 欧美精品在线观看91| 欧美最顶级的aⅴ艳星| 国产精品久久久久久久app| 国产精品久久久久久久久久免费| 国产69精品久久久久9999| 成人免费网视频| 亚洲成人精品视频| 中文字幕在线看视频国产欧美在线看完整| 欧美在线日韩在线| 欧美日韩第一视频| 国产日韩中文字幕在线| 有码中文亚洲精品| 色妞色视频一区二区三区四区| 色吧影院999| 久久久久五月天| 操人视频在线观看欧美| 欧美日韩中文字幕在线| 欧美成人激情图片网| 亚洲欧美日韩国产中文| 国产精品91久久久| 狠狠色狠狠色综合日日五| 久久免费视频观看| 中文字幕日韩av电影| 国产精品福利在线| 国产日韩欧美在线视频观看| 国产精品视频精品视频| 欧美做受高潮电影o| 奇米4444一区二区三区| 国内伊人久久久久久网站视频| 亚洲性日韩精品一区二区| 久久高清视频免费| 久久久久久综合网天天| 中文字幕v亚洲ⅴv天堂| 国产激情综合五月久久| 欧美黑人一级爽快片淫片高清| 97久久精品人搡人人玩| 国产精品久久久999| 国产亚洲视频中文字幕视频| 国内精品视频一区| 日韩欧美国产骚| 久久久久久亚洲精品| 中文字幕亚洲天堂| 久久精品电影网站| 国产精品一区二区3区| 精品久久久国产精品999| 国产精品入口免费视| 亚洲国产成人av在线| 国产精品成人一区二区三区吃奶| 亚洲综合小说区| 精品久久久久久久久久久久久久| 热久久免费国产视频| 中文字幕日韩欧美精品在线观看| 久久精品视频va| 91高清视频在线免费观看| 国产精品福利在线观看| 欧美在线视频观看| 国产精品一区二区三区在线播放| 亚洲精品国产美女| 亚洲丝袜一区在线| 精品国产户外野外| 亚洲欧美激情精品一区二区| 中文字幕一精品亚洲无线一区| 成人国产精品一区| 国产福利成人在线| 国产日韩精品在线| 欧美精品在线免费播放| 亚洲人成在线电影| 亚洲va男人天堂| 97成人精品视频在线观看| 久久人人爽人人爽人人片av高清| 国产精品视频资源| 亚洲国产日韩欧美在线99| 日韩美女av在线| 久久九九亚洲综合| 欧美日韩国产精品一区二区三区四区| 亚洲品质视频自拍网| 亚洲丝袜av一区| 91精品在线播放| 日韩毛片中文字幕| 欧美成人免费观看| 欧美成人高清视频| 亚洲欧美国产视频| 日韩国产在线播放| 欧美超级免费视 在线| 国产一区二区三区视频在线观看| 日韩视频在线免费| 久久精品国亚洲| 91久久夜色精品国产网站| 欧美成人精品三级在线观看| 精品成人久久av| 亚洲欧洲xxxx| 欧美激情中文字幕乱码免费| 全球成人中文在线| 91中文字幕一区| 亚洲无av在线中文字幕| 欧美激情精品久久久久久| 欧美精品成人在线| 欧美精品激情在线| 日本欧美一二三区| 成人伊人精品色xxxx视频| 欧美国产精品日韩| 亚洲天堂精品在线| 亚洲欧美福利视频| 亚洲欧美在线免费观看| 国产精品国语对白| 2019精品视频| 中文一区二区视频| 伊人成人开心激情综合网| 欧美午夜性色大片在线观看| 91在线视频导航| 亚洲少妇中文在线| 久久久久久一区二区三区| 日韩美女在线观看一区| 久久6精品影院| 久久久之久亚州精品露出| 日韩中文字幕在线观看| 性亚洲最疯狂xxxx高清| 在线亚洲国产精品网| 91高清视频免费| 久热精品视频在线观看| 欧美大片欧美激情性色a∨久久| 久久频这里精品99香蕉| 久久亚洲影音av资源网| 日韩欧美有码在线| 日韩免费观看网站| 91精品国产一区| 欧美中文在线免费|