Mybatis批量插入返回插入成功后的主鍵id操作
我們都知道Mybatis在插入單條數(shù)據(jù)的時(shí)候有兩種方式返回自增主鍵:
1、對(duì)于支持生成自增主鍵的數(shù)據(jù)庫(kù):增加 useGenerateKeys和keyProperty ,<insert>標(biāo)簽屬性。
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 useGeneratedKeys='true' keyProperty='id'> insert into Author (username,password,email,bio) values (#{username},#{password},#{email},#{bio})</insert> 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 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> 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í)返回自增主鍵的。
但是在本地測(cè)試的時(shí)候使用上述方式確實(shí)不能返回自增id,而且還報(bào)錯(cuò)(不認(rèn)識(shí)keyProperty中指定的Id屬性),然后在網(wǎng)上找相關(guān)資料。終于在Stackoverflow上面找到了一些信息。
解決辦法:1、升級(jí)Mybatis版本到3.3.1。官方在這個(gè)版本中加入了批量新增返回主鍵id的功能
2、在Dao中不能使用@param注解。
3、Mapper.xml中使用list變量(parameterType='java.util.List')接受Dao中的參數(shù)集合。
下面是具體代碼過(guò)程,可供參考mapper.xml層代碼
<!-- 批量新增 --> <insert parameterType='java.util.List' useGeneratedKeys='true' keyProperty='id' > INSERT INTO <include refid='t_shop_resource' /> (relation_id, summary_id, relation_type) VALUES <foreach collection='list' index='index' item='shopResource' separator=','> ( #{shopResource.relationId}, #{shopResource.summaryId}, #{shopResource.relationType} ) </foreach> </insert>
dao實(shí)現(xiàn)層代碼
public List<ShopResource> batchinsertCallId(List<ShopResource> shopResourceList) { this.getSqlSession().insert(getStatement(SQL_BATCH_INSERT_CALL_ID), shopResourceList); return shopResourceList;// 重點(diǎn)介紹 }
補(bǔ)充:MyBatis 插入的同時(shí)獲取主鍵id
有時(shí)候進(jìn)行一些多步操作的時(shí)候就需要得到最新插入一條記錄的id號(hào),那么如何在插入的同時(shí)返回id號(hào)
Mapper代碼:<insert parameterType='com.yj.pojo.Feeds' useGeneratedKeys='true' keyProperty='id'> insert into feeds (id, title, content, pic, video, auther_id, comments, favours, likes, cover_select, views, set_time, kind) values (#{id,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR}, #{content,jdbcType=VARCHAR}, #{pic,jdbcType=VARCHAR}, #{video,jdbcType=VARCHAR}, #{autherId,jdbcType=VARCHAR}, #{comments,jdbcType=INTEGER}, #{favours,jdbcType=INTEGER}, #{likes,jdbcType=INTEGER}, #{coverSelect,jdbcType=INTEGER}, #{views,jdbcType=INTEGER}, #{setTime,jdbcType=VARCHAR}, #{kind,jdbcType=VARCHAR}) </insert>service層:
當(dāng)設(shè)置了useGeneratedKeys='true' keyProperty='id'后,它會(huì)在你插入數(shù)據(jù)庫(kù)的同時(shí),將這個(gè)對(duì)象的id值改為最新的那個(gè)id,然后我們只需要取出他就可以了
數(shù)據(jù)庫(kù)
輸出
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章:
1. MariaDB10.5.6的安裝與使用詳解2. Mysql入門(mén)系列:安排預(yù)防性的維護(hù)MYSQL數(shù)據(jù)庫(kù)服務(wù)器3. Oracle數(shù)據(jù)庫(kù)管理腳本介紹4. 數(shù)據(jù)技術(shù)求職點(diǎn)評(píng):Oracle DBA面試題5. DB2 V9.1 復(fù)制技術(shù)新特性及改進(jìn)展示(1)6. Oracle9i初始化參數(shù)中文說(shuō)明107. Mysql入門(mén)系列:需要避免的MYSQL客戶機(jī)程序設(shè)計(jì)錯(cuò)誤8. Mysql入門(mén)系列:對(duì)MYSQL查詢中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼9. CentOS下更新SQLite版本10. MySQL 字符串函數(shù):字符串截取
