Mybatis插入時(shí)返回自增主鍵方式(selectKey和useGeneratedKeys)
Mybatis插入時(shí)返回自增主鍵
通過(guò)selectKey在插入操作前或者操作后獲取key值,做為字段插入或返回字段。(此段代碼獲取的序列值id作為字段值插入到實(shí)體類(lèi)中返回)
<insert id="insert">
 <selectKey keyProperty="id" resultType="int" order="AFTER">
  SELECT id FROM myTable
 </selectKey> 
 INSERT INTO myTable VALUES(#{id}, #{name})
</insert>
useGeneratedKeys
如果數(shù)據(jù)庫(kù)支持自增長(zhǎng)主鍵字段(比如mysql、sql server)設(shè)置useGeneratedKeys=”true”和keyProperty="Id",id 是表的主鍵名,這樣就可以插入主鍵id值
oracle則不支持自增長(zhǎng)id,設(shè)置useGeneratedKey=”false”,如果設(shè)置true則會(huì)有報(bào)錯(cuò)信息。通過(guò)nextval函數(shù),如SEQ_table.Nextval生成id
<insert id="addCover" parameterType="java.util.Map" useGeneratedKeys="true" keyProperty="Id">
 insert into cover(title,path,update_time)
 values(#{title},#{path},#{update_time}) 
</insert> 
int addCover(Map<String,Object> map);
Mybatis批量插入返回自增主鍵
我們都知道Mybatis在插入單條數(shù)據(jù)的時(shí)候有兩種方式返回自增主鍵:
1、對(duì)于支持生成自增主鍵的數(shù)據(jù)庫(kù):useGenerateKeys和keyProperty。
2、不支持生成自增主鍵的數(shù)據(jù)庫(kù):<selectKey>。
但是怎對(duì)批量插入數(shù)據(jù)返回自增主鍵的解決方式網(wǎng)上看到的還是比較少,至少百度的結(jié)果比較少。
Mybatis官網(wǎng)資料提供如下:
First, if your database supports auto-generated key fields (e.g. MySQL and SQL Server), then you can simply set useGeneratedKeys="true" and set the keyProperty to the target property and you're done. For example, if the Authortable above had used an auto-generated column type for the id, the statement would be modified as follows:
<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username,password,email,bio)
  values (#{username},#{password},#{email},#{bio})
</insert>
If your database also supports multi-row insert, you can pass a list or an array of Authors and retrieve the auto-generated keys.
<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>
從官網(wǎng)資料可以看出Mybatis是支持批量插入時(shí)返回自增主鍵的。(百度上說(shuō)不支持的,多打臉 開(kāi)玩笑的)
但是在本地測(cè)試的時(shí)候使用上述方式確實(shí)不能返回自增id,而且還報(bào)錯(cuò)(不認(rèn)識(shí)keyProperty中指定的Id屬性),然后在網(wǎng)上找相關(guān)資料。終于在Stackoverflow上面找到了一些信息。
解決辦法
1、升級(jí)Mybatis版本到3.3.1。
2、在Dao中不能使用@param注解。
3、Mapper.xml中使用list變量接受Dao中的集合。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MyBatis insert語(yǔ)句返回主鍵和selectKey標(biāo)簽方式
 - mybatis?selectKey賦值未生效的原因分析
 - Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解
 - mybatis?獲取更新(update)記錄的id之<selectKey>用法說(shuō)明
 - mybatis的selectKey作用詳解
 - Mybatis?selectKey 如何返回新增用戶(hù)的id值
 - MyBatis如何使用selectKey返回主鍵的值
 - Mybatis @SelectKey用法解讀
 - Mybatis示例之SelectKey的應(yīng)用
 - MyBatis中selectKey標(biāo)簽及主鍵回填實(shí)現(xiàn)
 
相關(guān)文章
 Springboot傳輸數(shù)據(jù)時(shí)日期格式化問(wèn)題
這篇文章主要介紹了Springboot傳輸數(shù)據(jù)時(shí)日期格式化問(wèn)題,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
 Java多線(xiàn)程 BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型詳解
這篇文章主要介紹了Java多線(xiàn)程 BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
 SpringCloud分布式項(xiàng)目下feign的使用示例詳解
這篇文章主要介紹了SpringCloud分布式項(xiàng)目下feign的使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
 Java中的InputStreamReader和OutputStreamWriter源碼分析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文通過(guò)示例代碼給大家解析了Java中的InputStreamReader和OutputStreamWriter知識(shí),需要的的朋友參考下吧2017-05-05
 Java數(shù)據(jù)結(jié)構(gòu)順序表用法詳解
順序表是計(jì)算機(jī)內(nèi)存中以數(shù)組的形式保存的線(xiàn)性表,線(xiàn)性表的順序存儲(chǔ)是指用一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線(xiàn)性表中的各個(gè)元素、使得線(xiàn)性表中在邏輯結(jié)構(gòu)上相鄰的數(shù)據(jù)元素存儲(chǔ)在相鄰的物理存儲(chǔ)單元中,即通過(guò)數(shù)據(jù)元素物理存儲(chǔ)的相鄰關(guān)系來(lái)反映數(shù)據(jù)元素之間邏輯上的相鄰關(guān)系2021-10-10
 在SpringBoot項(xiàng)目中獲取Request的四種方法
這篇文章主要為大家詳細(xì)介紹了SpringBoot項(xiàng)目中獲取Request的四種方法,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2023-11-11
 Java中線(xiàn)程狀態(tài)+線(xiàn)程安全問(wèn)題+synchronized的用法詳解
這篇文章主要介紹了Java中線(xiàn)程狀態(tài)+線(xiàn)程安全問(wèn)題+synchronized的用法詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04

