MyBatis 學習(四)之 SQL 映射文件

目錄

1 SQL 映射文件介紹

2 select 元素

3 insert 元素

4?update 和 delete 元素

5?sql 元素? ? ? ?

6?parameterType 元素

7?resultType 元素

8?resultMap 元素(重要)

9 參考文檔


1 SQL 映射文件介紹

????????映射器是 MyBatis 中最復雜并且是最重要的組件。它由一個接口和 SQL 映射文件(或者注解)組成。在映射器中我們可以配置各類 SQL、動態 SQL、緩存、存儲過程、級聯等復雜的內容。

以下是 SQL 映射文件的部分元素介紹

元素描述
cache該命名空間的緩存配置
cache-ref引用其它命名空間的緩存配置
resultMap描述如何從數據庫結果集中加載對象,它是最復雜也是最強大的元素
sql可被其它語句引用的可重用語句塊
select映射查詢語句
insert映射插入語句
update映射更新語句
delete映射刪除語句

2 select 元素

select 元素表示 SQL 的 select 語句,用于查詢,以下是 select 元素的部分屬性

屬性

描述
id在命名空間中唯一的標識符,可以被用來引用這條語句
parameterType將會傳入這條語句的參數類的全類名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler) 推斷出具體傳入語句的參數,默認值為未設置(unset)
resultType從這條語句中返回的期望類型的類的全類名或別名。 注意如果返回的是集合,那應該設置為集合包含的類型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同時使用
resultMap外部 resultMap 的命名引用。結果集的映射是 MyBatis 最強大的特性,如果你對其理解透徹,許多復雜映射的情形都能迎刃而解。可以使用 resultMap 或 resultType,但不能同時使用
flushCache將其設置為 true 后,只要語句被調用,都會導致本地緩存和二級緩存被清空,默認值:false
useCache將其設置為 true 后,將會導致本條語句的結果被二級緩存緩存起來,默認值:對 select 元素為 true
timeout這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為未設置(unset)(依賴驅動)
fetchSize這是一個給驅動的提示,嘗試讓驅動程序每次批量返回的結果行數和這個設置值相等。 默認值為未設置(unset)(依賴驅動)
statementTypeSTATEMENT,PREPARED 或 CALLABLE 中的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED
resultSetTypeFORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等價于 unset) 中的一個,默認值為 unset (依賴驅動)
databaseId如果配置了數據庫廠商標識 (databaseIdProvider) 并且存在兩個相同的語句,一個帶 databaseId 而另一個不帶,MyBatis 會優先加載帶有 databaseId 的語句。如果 databaseId 與當前數據庫匹配,則不帶 databaseId 的相同語句將被忽略。未設置?databaseId 使用通用 SQL 規則
resultOrderedresultOrdered:這個設置僅對嵌套結果 select 語句適用:如果為 true,就是假設包含了嵌套結果集或是分組,這樣的話當返回一個主結果行的時候,就不會發生有對前面結果集的引用的情況。 這就使得在獲取嵌套的結果集的時候不至于導致內存不夠用。默認值:false
resultSets這個設置僅對多結果集的情況適用。它將列出語句執行后返回的結果集并給每個結果集一個名稱,名稱是逗號分隔的

3 insert 元素

屬性

描述
id在命名空間中唯一的標識符,可以被用來引用這條語句
parameterType將會傳入這條語句的參數的類全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數,默認值為未設置(unset)
flushCache將其設置為 true 后,只要語句被調用,都會導致本地緩存和二級緩存被清空,默認值:(對 insert、update 和 delete 語句)true
timeout這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為未設置(unset)(依賴數據庫驅動)
statementType可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED
useGeneratedKeys(僅適用于 insert 和 update)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數據庫內部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關系型數據庫管理系統的自動遞增字段),默認值:false
keyProperty(僅適用于 insert 和 update)指定能夠唯一識別對象的屬性,MyBatis 會使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設置它的值,默認值:未設置(unset)。如果生成列不止一個,可以用逗號分隔多個屬性名稱。不能和keyColumn連用
keyColumn(僅適用于 insert 和 update)設置生成鍵值在表中的列名,在某些數據庫(像 PostgreSQL)中,當主鍵列不是表中的第一列的時候,是必須設置的。如果生成列不止一個,可以用逗號分隔多個屬性名稱。不能和keyProperty連用
databaseId同 select 元素

主鍵回填

? ? ? ? 在 MyBatis 中,若表中的主鍵設置為自增,插入數據時沒有插入主鍵,但是又想獲得數據庫中該條數據的主鍵,那么可以通過設置 useGeneratedKeys=”true”,然后再把 keyProperty 設置到目標屬性(如 User 類中的 id 屬性)上來獲得該值。

<insert id="insertUser" parameterType="com.entity.User" useGeneratedKeys="true" keyProperty="id">insert into person(name, age, sex)values (#{name}, #{age}, #{sex});
</insert>
//添加一個用戶數據
@Test
public void testInsertUser() {String statement = "com.mapper.UserMapper.insertUser";User user = new User();user.setName("孫尚香");user.setAge(24);user.setSex("女");int i = sqlSession.insert(statement, user);System.out.println( (i>0)? "添加成功!":"添加失敗!");//提交插入的數據sqlSession.commit();sqlSession.close();// 輸出返回的主鍵值System.out.println("返回的主鍵值=" + user.getId());
}

自定義主鍵并且可以在 Java 中通過屬性獲得該值

在 MyBatis 中可以通過?selectKey 元素自定義主鍵,以下是其屬性介紹

  • keyProperty:selectKey 需要設置的目標屬性
  • resultType:結果類型
  • order:可以設置為 BEFORE 或 AFTER ,表示先設置主鍵,后執行插入語句或先執行插入語句,后設置主鍵
<insert id="insertUser" parameterType="com.entity.User" ><selectKey keyProperty="id" resultType="int" order="BEFORE">select ROUND(RAND()*1000)</selectKey>insert into person(id, name, age, sex)values (#{id}, #{name}, #{age}, #{sex});
</insert>
@Test
public void testInsertUser() {String statement = "com.mapper.UserMapper.insertUser";User user = new User();user.setName("鄭旦");user.setAge(24);user.setSex("女");int i = sqlSession.insert(statement, user);System.out.println( (i>0)? "添加成功!":"添加失敗!");//提交插入的數據sqlSession.commit();sqlSession.close();// 輸出返回的主鍵值System.out.println("返回的主鍵值=" + user.getId());
}

??

4?update 和 delete 元素

????????update 和 delete 元素在使用上比較簡單,所以這里把它們放在一起論述。它們和 insert 元素的屬性差不多,執行完后也會返回一個整數,用來表示該 SQL 語句影響了多少條數據庫記錄。

<!-- 根據 id 更新用戶 -->
<update id="updateUser">update person set name = #{name},age = #{age},sex = #{sex} where id = #{id}
</update>
<!-- 根據 id 刪除用戶 -->
<delete id="deleteUser" parameterType="int">delete from person where id = #{id}
</delete>

5?sql 元素? ? ? ?

????????sql 元素是用來定義可重用的 sql 代碼片段,這樣在字段比較多的時候,以便在其它語句中使用。需要結合 include 元素一起使用,以下是代碼示例。

<!--定義sql代碼片段-->
<sql id="userCols">id,username,age,sex
</sql>
<!-- 查詢所有用戶 -->
<select id="selectAllUser" resultType="com.entity.User">select <include refid="userCols"/> from person
</select>

6?parameterType 元素

parameterType 元素可以輸入以下類型:

  • Java 基本數據類型
  • POJO 類型
  • Map 類型
<!-- 通過 普通數據類型 int 查詢一個用戶 -->
<select id="selectUserById" parameterType="int" resultType="com.entity.User">select * from person where id = #{id};
</select><!-- 通過 POJO 類型 User 添加用戶-->
<insert id="insertUser" parameterType="com.entity.User">insert into person(id,username,age,sex) values (#{id},#{username},#{age},#{sex});
</insert><!-- 通過 嵌套 POJO 類型 查詢一個用戶,QueryVo 類中定義了 User user 屬性 -->
<select id="selectUserByUserNameAndAge" parameterType="com.entity.QueryVo" resultType="com.entity.User">select * from person where name = #{user.name} and age = #{user.age};
</select><!-- 通過 Map 類型 查詢一個用戶, HashMap<String, Object> map = new HashMap<>(); 
map.put("name","趙飛燕"); map.put("age",24); 通過 key 獲得 map 中的 value-->
<select id="selectUserByMap" parameterType="hashmap" resultType="com.entity.User">select * from person where name = #{name} and age = #{age};
</select>

7?resultType 元素

resultType 元素和 parameterType 元素用法差不多,一個是輸出,一個是輸入。resultType 元素可以輸出以下類型:

  • Java 基本數據類型
  • POJO 對象
  • POJO 對象列表
  • Map 對象列表
<!-- 統計用戶總數量,輸出為一個整數 int -->
<select id="countUsers" resultType="int">select count(1) from person
</select><!-- 通過 id 查詢一個用戶,輸出為一個 User -->
<select id="selectUserById" parameterType="int" resultType="com.entity.User">select * from personwhere id = #{id};
</select><!-- 查詢所有用戶,輸出為一個 List<User> 列表 -->
<select id="selectAllUser" resultType="com.entity.User">select * from person
</select><!-- 查詢所有用戶, 輸出為一個 List<HashMap<String, Object>> Map 列表-->
<select id="selectAllUser" resultType="hashmap">select * from person
</select>

8?resultMap 元素(重要)

????????我們在使用 resultType 的時候,需要保證數據庫表中的字段名和表對應實體類的屬性名稱一致才行(包括駝峰命名規則)。那不一致怎么辦,查詢的時候可以給列名起個別名,但是一般不建議這樣做,而是通過 resultMap 元素進行一個轉換。

<!-- id:唯一標識,type:需要映射的 Java 類型-->
<resultMap id="userMap" type="com.entity.User"><!-- 與主鍵字段的對應,property對應實體屬性,column對應表字段 --><id property="userId" column="id"/><!-- 與非主鍵字段的對應,property對應實體屬性,column對應表字段 --><result property="userName" column="username"/><result property="userAge" column="age"/><result property="userSex" column="sex"/>
</resultMap><!-- 查詢所有用戶,返回集為resultMap類型,resultMap的value上面配置的 id=userMap 要一致-->
<select id="selectAllUser" resultMap="userMap">select * from person
</select>

上述代碼是不是很眼熟,在 MyBatis 案例中使用了?@ResultMap 注解來實現上述代碼

resultMap 元素的組成

<!-- autoMapping:指定是否自動映射查詢結果的列到 Java 對象的屬性。
默認為開啟(true),如果設置為 false,則需要手動配置每個屬性的映射關系 -->
<resultMap id="標識" type="輸出類型" extends="繼承其他 <resultMap>" autoMapping="自動映射"><constructor><!--構造器注入屬性值--><!-- 構造器標識,一般為主鍵 --><!-- column對應表字段,name對應實體屬性 --><idArg column="id" name="userId" javaType="int"/><!-- 構造器參數 --><arg column="username" name="userName" javaType="string"/> </constructor><!-- id 與主鍵字段的對應,property對應實體屬性,column對應表字段 --><id property="userId" column="id"/><!-- result 與非主鍵字段的對應,property對應實體屬性,column對應表字段 --><result property="userName" column="username"/><association/><!--高級映射,一對一映射--><collection /><!--高級映射,一對多映射--><discriminator><case/></discriminator><!--根據返回的字段的值封裝不同的類型-->
</resultMap>

9 參考文檔

Mybatis3詳解(四)----SQL映射文件詳解(XxxMapper.xml) - 唐浩榮 - 博客園 (cnblogs.com)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713055.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713055.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【軟考中級】系統集成項目管理工程師—案例分析基礎

軟考中級——系統集成項目管理工程師 案例分析基礎 考試時間及要求 中級考試案例分析5道題&#xff0c;時間150分鐘&#xff0c;時間充裕。&#xff08;高級考試案例分析3道題【高級一般第一題都是找錯、第二題改錯、第三題默寫】&#xff0c;時間90分鐘、平均每道題花30分鐘…

Vue(3.3.4)+three.js(0.161.0)實現3D可視化地圖

一.前言 由于最近在學習three.js,所以觀摩了一下掘金&#xff0c;csdn等網站上的有關這部分的內容&#xff0c;剛好看到一個帶你入門three.js——從0到1實現一個3d可視化地圖 - 掘金 (juejin.cn)&#xff0c;再加上我的專業屬性是地理相關&#xff0c;可以說是專業對口&#xf…

Java使用ffmpeg指令實現音頻格式轉換

針對Linux環境下如何安裝ffmpeg請看上一篇文章Linux上搭建并使用ffmpeg&#xff08;Java&#xff09;-CSDN博客 public static void voiceChangeFormat(String localPath, String targetPath) {List<String> command new ArrayList<>();command.add("ffmpeg…

存儲xss實現獲取cookie(本地實戰)

實戰更能體驗收獲&#xff01;&#xff01;&#xff01; 環境準備&#xff1a; 1.phpstudy 2.dvwa靶場 實戰 首先我們在phpstudy指定的localhost網站目錄下編寫一個xss.php文件&#xff0c;內容如下&#xff1a; <?php $cookie $_GET[cookie]; $ip getenv (REMOTE_…

electron+vue3全家桶+vite項目搭建【28】封裝窗口工具類【2】窗口組,維護窗口關系

文章目錄 引入實現效果思路主進程模塊渲染進程模塊測試效果 引入 demo項目地址 窗口工具類系列文章&#xff1a; 封裝窗口工具類【1】雛形 我們思考一下窗口間的關系&#xff0c;窗口創建和銷毀的一些動作&#xff0c;例如父子窗口&#xff0c;窗口組合等等&#xff0c;還有…

【前端素材】推薦優質在線高端家具電商網頁Classi平臺模板(附源碼)

一、需求分析 1、系統定義 在線高端家具商城是一個專門銷售高端家具產品的電子商務平臺&#xff0c;旨在為消費者提供購買高品質家具的便捷渠道。 2、功能需求 在線高端家具商城是一個專門銷售高端家具產品的電子商務平臺&#xff0c;旨在為消費者提供購買高品質家具的便捷…

Maven高級(黑馬學習筆記)

Maven 是一款構建和管理 Java 項目的工具。 分模塊設計與開發 介紹 所謂分模塊設計&#xff0c;顧名思義指的就是我們在設計一個 Java 項目的時候&#xff0c;將一個 Java 項目拆分成多個模塊進行開發。 1). 未分模塊設計的問題 如果項目不分模塊&#xff0c;也就意味著所有…

node.js和electron安裝

文章目錄 一、node.js安裝1.node.js下載安裝2.設置鏡像 二、其它問題1.文件夾創建錯誤2.electron安裝錯誤 一、node.js安裝 1.node.js下載安裝 參考B站視頻node.js安裝&#xff0c;沒有按視頻中設置鏡像 2.設置鏡像 參考&#xff1a;https://npmmirror.com/ npm config se…

十八:Java8新特性

文章目錄 01、Java8概述02、Java8新特性的好處03、并行流與串行流04、Lambda表達式4.1、Lambda表達式使用舉例4.2、Lambda表達式語法的使用14.3、Lambda表達式語法的使用2 05、函數式(Functional)接口5.1、函數式接口的介紹5.2、Java內置的函數式接口介紹及使用舉例 06、方法引…

Hgame題解(第二星期)

Hgame題解&#xff08;第二星期&#xff09; Web Select More Courses 打開靶機發現是一個登陸頁面&#xff0c;根據題目提示下載弱密碼字典&#xff0c;通過BP爆破獲得用戶密碼為qwert123 登陸后進入下一個頁面&#xff0c;由于學分已滿無法選課&#xff0c;所以需要先進行…

回歸預測 | Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測

回歸預測 | Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測 目錄 回歸預測 | Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.Matlab實現BiTCN基于雙向時間卷積網絡的數據回歸預測&#xff08;完整源碼和數據&a…

推薦瑩瑩API管理系統PHP源碼

瑩瑩API管理系統PHP源碼附帶兩套模板,PHP版本要求為5.6至8.0之間&#xff0c;已測試通過的版本為7.4。 需要安裝PHPSG11加密擴展。 已測試&#xff1a;寶塔/主機親測成功搭建&#xff01; 演示地 址 &#xff1a; runruncode.com/php/19698.html 安裝說明&#xff08;適用于寶…

深入理解c指針(六)

目錄 九、函數指針數組 1、字符指針變量 2、數組指針變量 3、二維數組傳參的本質 4、函數指針變量 4.1 分析《C陷阱和缺陷》中的兩端代碼 4.2 typedef關鍵字 5、函數指針數組 6、函數指針數組的用途---轉移表 九、函數指針數組 1、字符指針變量 在指針的類型中我們知道…

教你如何判斷Java代碼中異步操作是否完成

在許多應用程序中&#xff0c;我們經常使用異步操作來提高性能和響應度。在Java中&#xff0c;我們可以使用多線程或者異步任務來執行耗時操作&#xff0c;并且在后臺處理過程完成后獲取結果。但是&#xff0c;在使用異步操作時&#xff0c;我們通常需要知道異步任務何時完成&a…

【C++精簡版回顧】15.繼承派生

1.繼承派生的區別 繼承&#xff1a;子繼父業&#xff0c;就是子類完全繼承父類的全部內容 派生&#xff1a;子類在父類的基礎上發展 2.繼承方式 1.public繼承為原樣繼承 2.protected繼承會把public繼承改為protect繼承 3.private繼承會把public&#xff0c;protected繼承改為pr…

怎么摳圖把把人物扣下來?簡單快捷的摳圖方法

相信很多新手小白在初入設計行業時&#xff0c;對于摳圖怎么把人物扣下來都是一頭霧水。摳圖作為設計中常用的一種技術&#xff0c;能夠幫助我們快速提取圖片中的某個部分&#xff0c;進行合成或者修改。對于老手來說&#xff0c;摳圖或許是再熟悉不過的操作&#xff0c;但對于…

【C++】仿函數與函數指針:C++中的強大工具

文章目錄 什么是函數指針&#xff1f;函數指針的基本語法&#xff1a; 什么是仿函數&#xff1f;仿函數的基本用法&#xff1a; 仿函數與函數指針的比較應用場景代碼舉例函數指針示例仿函數示例定義排序規則舉例使用函數指針使用仿函數哪一個更好&#xff1f; 結論 在C編程中&a…

c語言---數組(超級詳細)

數組 一.數組的概念二. 一維數組的創建和初始化2.1數組的創建2.2數組的初始化錯誤的初始化 2.3 數組的類型 三. 一維數組的使用3.1數組的下標3.2數組元素的打印3.2數組元素的輸入 四. 一維數組在內存中的存儲五. 二維數組的創建5.1二維數組的概念5.2如何創建二維數組 六.二維數…

【嵌入式學習】QT-Day4-Qt基礎

簡單實現鬧鐘播報&#xff0c;設置時間&#xff0c;當系統時間與設置時間相同時播報語音5次&#xff0c;然后停止。如果設置時間小于當前系統時間&#xff0c;則彈出消息提示框&#xff0c;并清空輸入框。 #include "my_clock.h" #include "ui_my_clock.h&quo…

批量處理圖片,像素隨心所欲,創意無限釋放!

在數字化時代&#xff0c;圖片批量處理已成為設計、攝影、電商等多個領域不可或缺的一部分。然而&#xff0c;傳統的圖片批量處理方式往往效率低下&#xff0c;難以滿足現代人對高效和精準的需求。現在&#xff0c;我們為您帶來了一款一鍵圖片批量處理工具&#xff0c;讓您自由…