MyBatis中selectKey標(biāo)簽及主鍵回填實(shí)現(xiàn)
<selectKey>標(biāo)簽是MyBatis中用于在插入數(shù)據(jù)之前或之后生成主鍵并將其回填到對(duì)象中的一個(gè)功能標(biāo)簽。這個(gè)標(biāo)簽通常用于處理那些不支持自動(dòng)生成主鍵的數(shù)據(jù)庫(kù),或者在需要使用復(fù)雜的邏輯來(lái)生成主鍵的場(chǎng)景。
1. <selectKey>標(biāo)簽的作用
主鍵生成:通過(guò)
<selectKey>標(biāo)簽,可以在插入操作前或插入操作后執(zhí)行一條SQL語(yǔ)句,用于生成主鍵值。主鍵回填:生成的主鍵值會(huì)自動(dòng)回填到插入數(shù)據(jù)對(duì)應(yīng)的對(duì)象屬性中,以便在后續(xù)的業(yè)務(wù)邏輯中使用。
2. <selectKey>標(biāo)簽的屬性
keyProperty:指定要回填主鍵的對(duì)象屬性名。resultType:指定主鍵的返回類型,如int、long、string等。order:指定主鍵生成的時(shí)機(jī),BEFORE表示在執(zhí)行插入SQL語(yǔ)句之前生成主鍵,AFTER表示在執(zhí)行插入SQL語(yǔ)句之后生成主鍵。statementType:指定SQL語(yǔ)句的類型,默認(rèn)為STATEMENT,也可以設(shè)置為PREPARED。
3. <selectKey>標(biāo)簽的使用場(chǎng)景
3.1 在插入前生成主鍵
假設(shè)我們使用一個(gè)數(shù)據(jù)庫(kù)序列(如Oracle的sequence)來(lái)生成主鍵,可以通過(guò)在插入操作之前生成主鍵并回填。
示例:使用Oracle的sequence在插入前生成主鍵
數(shù)據(jù)庫(kù)表結(jié)構(gòu):
users表:包含id、username、email字段。
Java實(shí)體類:
public class User {
private Integer id;
private String username;
private String email;
// Getters and Setters
}MyBatis映射文件:
<insert id="insertUser">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT seq_users.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO users(id, username, email)
VALUES(#{id}, #{username}, #{email})
</insert>解釋:
keyProperty="id":表示生成的主鍵值將被設(shè)置到User對(duì)象的id屬性中。resultType="int":表示生成的主鍵值的類型為int。order="BEFORE":表示在執(zhí)行插入操作之前生成主鍵。SELECT seq_users.NEXTVAL FROM DUAL:這是Oracle的序列生成語(yǔ)句,用于獲取下一個(gè)主鍵值。
3.2 在插入后生成主鍵
在某些數(shù)據(jù)庫(kù)(如MySQL)中,主鍵可以在插入數(shù)據(jù)后由數(shù)據(jù)庫(kù)自動(dòng)生成,例如通過(guò)自增字段。這時(shí)可以通過(guò)<selectKey>在插入操作后獲取生成的主鍵值并回填。
示例:使用MySQL的自增主鍵在插入后獲取主鍵
數(shù)據(jù)庫(kù)表結(jié)構(gòu):
users表:包含id(自增)、username、email字段。
Java實(shí)體類:
public class User {
private Integer id;
private String username;
private String email;
// Getters and Setters
}MyBatis映射文件:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users(username, email)
VALUES(#{username}, #{email})
</insert>解釋:
useGeneratedKeys="true":表示使用JDBC的getGeneratedKeys方法來(lái)獲取數(shù)據(jù)庫(kù)自動(dòng)生成的主鍵。keyProperty="id":表示將生成的主鍵值回填到User對(duì)象的id屬性中。
使用<selectKey>獲取自增主鍵的示例
有時(shí)可能希望使用<selectKey>來(lái)手動(dòng)獲取自增主鍵:
<insert id="insertUser">
INSERT INTO users(username, email)
VALUES(#{username}, #{email})
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>解釋:
order="AFTER":表示在插入操作完成后獲取主鍵。SELECT LAST_INSERT_ID():用于獲取MySQL數(shù)據(jù)庫(kù)中最后插入記錄的自增主鍵值。
4. 主鍵回填的過(guò)程
當(dāng)<selectKey>標(biāo)簽被使用時(shí),MyBatis會(huì)在插入操作前后執(zhí)行指定的SQL語(yǔ)句,并將生成的主鍵值自動(dòng)回填到對(duì)應(yīng)的對(duì)象屬性中。這一過(guò)程的典型步驟如下:
執(zhí)行
<selectKey>標(biāo)簽內(nèi)的SQL:如果order為BEFORE,在執(zhí)行插入操作之前執(zhí)行<selectKey>中的SQL語(yǔ)句,并將生成的主鍵值設(shè)置到對(duì)象中。如果order為AFTER,則在插入操作完成后執(zhí)行SQL。回填主鍵:將生成的主鍵值回填到指定的Java對(duì)象屬性中。
執(zhí)行插入操作:將回填主鍵的對(duì)象插入到數(shù)據(jù)庫(kù)中。
5. 使用<selectKey>的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
靈活性高:可以使用復(fù)雜的邏輯生成主鍵,支持各種數(shù)據(jù)庫(kù)特性,如Oracle的
sequence。跨數(shù)據(jù)庫(kù)支持:適用于不支持自動(dòng)主鍵生成的數(shù)據(jù)庫(kù)。
控制力強(qiáng):可以精確控制主鍵生成的時(shí)機(jī)和方式,滿足各種業(yè)務(wù)需求。
缺點(diǎn):
額外的SQL查詢:在
order="BEFORE"的情況下,會(huì)在插入操作前額外執(zhí)行一條SQL語(yǔ)句,可能會(huì)稍微影響性能。復(fù)雜度增加:使用
<selectKey>需要手動(dòng)配置SQL語(yǔ)句和主鍵映射,增加了配置的復(fù)雜度。
總結(jié)
<selectKey>標(biāo)簽在MyBatis中提供了一種靈活的方式來(lái)生成和回填主鍵,適用于各種場(chǎng)景,包括使用數(shù)據(jù)庫(kù)序列、自增主鍵、UUID等。根據(jù)具體需求,可以選擇在插入操作之前或之后生成主鍵,并自動(dòng)將主鍵值回填到對(duì)象中。合理使用<selectKey>可以幫助我們更好地管理數(shù)據(jù)庫(kù)中的主鍵,確保數(shù)據(jù)的一致性和完整性。
到此這篇關(guān)于MyBatis中selectKey標(biāo)簽及主鍵回填實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis selectKey標(biāo)簽 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis insert語(yǔ)句返回主鍵和selectKey標(biāo)簽方式
- mybatis?selectKey賦值未生效的原因分析
- Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解
- mybatis?獲取更新(update)記錄的id之<selectKey>用法說(shuō)明
- mybatis的selectKey作用詳解
- Mybatis?selectKey 如何返回新增用戶的id值
- MyBatis如何使用selectKey返回主鍵的值
- Mybatis插入時(shí)返回自增主鍵方式(selectKey和useGeneratedKeys)
- Mybatis @SelectKey用法解讀
- Mybatis示例之SelectKey的應(yīng)用
相關(guān)文章
Java中BM(Boyer-Moore)算法的圖解與實(shí)現(xiàn)
本文主要介紹了兩個(gè)大的部分,第一部分通過(guò)圖解的方式講解BM算法,第二部分則代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)易的BM算法,感興趣的小伙伴可以學(xué)習(xí)一下2022-05-05
springBoot集成redis(jedis)的實(shí)現(xiàn)示例
Redis是我們Java開(kāi)發(fā)中,使用頻次非常高的一個(gè)nosql數(shù)據(jù)庫(kù),本文主要介紹了springBoot集成redis(jedis)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理
這篇文章主要介紹了springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面
這篇文章主要介紹了詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java調(diào)用打印機(jī)的2種方式舉例(無(wú)驅(qū)/有驅(qū))
我們平時(shí)使用某些軟件或者在超市購(gòu)物的時(shí)候都會(huì)發(fā)現(xiàn)可以使用打印機(jī)進(jìn)行打印,這篇文章主要給大家介紹了關(guān)于Java調(diào)用打印機(jī)的2種方式,分別是無(wú)驅(qū)/有驅(qū)的相關(guān)資料,需要的朋友可以參考下2023-11-11
IntelliJ?IDEA?2022.1.1?沒(méi)有CVS的過(guò)程分析
這篇文章主要介紹了IntelliJ?IDEA?2022.1.1?沒(méi)有CVS的過(guò)程解析,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
SpringMVC+MyBatis實(shí)現(xiàn)多數(shù)據(jù)源切換
在企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中,經(jīng)常需要處理來(lái)自不同數(shù)據(jù)庫(kù)的數(shù)據(jù),為了滿足這一需求,我們可以通過(guò)配置多個(gè)數(shù)據(jù)源來(lái)實(shí)現(xiàn)對(duì)不同數(shù)據(jù)庫(kù)的訪問(wèn),下面我們來(lái)看看具體實(shí)現(xiàn)吧2025-01-01
Java中枚舉的實(shí)現(xiàn)與應(yīng)用詳解
這篇文章主要介紹了Java中枚舉的實(shí)現(xiàn)與應(yīng)用詳解,EnumTest中還有一個(gè)VALUES數(shù)組,里面存儲(chǔ)著所有的枚舉實(shí)例,調(diào)用values方法時(shí)返回VALUES數(shù)組的clone,需要的朋友可以參考下2023-12-12
Spring?boot?使用QQ郵箱進(jìn)行一個(gè)驗(yàn)證登入功能
這篇文章主要介紹了Spring?boot?使用QQ郵箱進(jìn)行一個(gè)驗(yàn)證登入,主要包括qq郵箱開(kāi)啟權(quán)限和創(chuàng)建發(fā)送驗(yàn)證碼的請(qǐng)求Controller,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10

