mybatis插入數(shù)據(jù)不返回主鍵id的可能原因及解決方式
mybatis插入數(shù)據(jù)不返回主鍵id原因及解決
mybatis插入數(shù)據(jù)返回主鍵id這個特性很好用,但是不注意細(xì)節(jié)的話很容易拿不到主鍵id,因此這篇文章比較全面的講解下,拿不到主鍵id的可能因素和解決方案。
1.xml是否配置返回主鍵id
普通插入數(shù)據(jù)的xml如下:
<insert id="addUser">
INSERT INTO user(name,age)
VALUES(#{name},#{age})
</insert>這是一個新增用戶的xml如果想要新增后返回用戶id進(jìn)行下一步業(yè)務(wù)操作,有兩個屬性是必不可少的
useGeneratedKeys="true" keyProperty="id"
這兩個屬性意思為:如果表中新增數(shù)據(jù)自增主鍵是【id】的話,就會把主鍵id返回
所以如果沒有返回,或者想要返回?cái)?shù)據(jù)主鍵id,這兩個屬性必不可少
2.dao類入?yún)⒚Q是否額外配置
普通dao類如下:
UserDao 或者 UserMapper類有個新增用戶的方法,以下統(tǒng)稱UserDao(字?jǐn)?shù)少…)
int addUser(User user);
相對應(yīng)的是xml文件中方法:
<insert id="addUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name,age)
VALUES(#{name},#{age})
</insert>參照以上寫法,在添加用戶后,會通過【keyProperty】屬性把用戶id給映射到User類中的id去,這樣子是能拿到id的
但是如果UserDao添加用戶方法是以下這種方式:
多了個@Param注解
int addUser(@Param("user")User user);那么相對應(yīng)xml中的【keyProperty】屬性也需要通過轉(zhuǎn)化為@Param中的名稱去引用id,不然mybatis不知道把返回的id映射到哪個字段去,
正確如下:
<insert id="addUser" useGeneratedKeys="true" keyProperty="user.id">
INSERT INTO user(name,age)
VALUES(#{user.name},#{user.age})
</insert>有種馬虎的寫法是這種,【keyProperty】沒有使用UserDao添加用戶@Param的別名去引用id,所以獲取不到主鍵id:
錯誤的:?。。?!
<insert id="addUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name,age)
VALUES(#{user.name},#{user.age})
</insert>3.排除以上兩種,請檢查獲取主鍵id的業(yè)務(wù)代碼
這個問題導(dǎo)致的可能性比較低,一般來說是不太可能會發(fā)展,但是也架不住的確發(fā)生了(比如我…)
上錯誤業(yè)務(wù)代碼:
//問題代碼
//添加用戶
User user = User.builder().name("小紅").age(18).build();
int userId = userDao.addUser(user);
//將用戶設(shè)置為管理員
roleDao.setManager(userId);
.......乍一看,貌似沒問題,但是…有時(shí)候?qū)慶urd腦子沒有轉(zhuǎn)過來的話,就犯下了這種錯誤
新增用戶后返回的主鍵id,并不是通過userDao.addUser()方法返回來的,這里返回的是數(shù)據(jù)庫數(shù)據(jù)的影響行數(shù),因此一直返回值是1的時(shí)候我驚呆了,一直在想為什么以前dao層這么寫能獲取呢????后面上個廁所再仔細(xì)看代碼就明白了。。。。
新增用戶后立即返回的主鍵id是幫你直接映射到用戶類的id屬性去了,所以是通過userDao.addUser(user);里面的user.getId();才能拿到
正確代碼如下:
//添加用戶
User user = User.builder().name("小紅").age(18).build();
userDao.addUser(user);
//將用戶設(shè)置為管理員
//獲取用戶id
int userId = user.getId();
roleDao.setManager(userId);
.......問題出現(xiàn)的方式形式奇奇怪怪,最重要的還是要保持腦袋的清醒,也側(cè)面說了一件事,寫代碼是個精細(xì)活,半點(diǎn)馬虎都犯不得,犯了就找bug吧~
mybatis插入數(shù)據(jù)后返回自增主鍵ID失敗總結(jié)
問題代碼如下
void insert(@param("user")User user);?<!-- 插入數(shù)據(jù):返回記錄主鍵id值 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id" ?keyColumn="id">
?? ??? ?insert ?into t_user (name,age) values (#{user.name},#{user.age})
</insert>執(zhí)行sql后,user.getId()并沒有返回自增ID,自以為自增配置也沒問題
useGeneratedKeys為true,用來設(shè)置返回主鍵id的值,keyProperty代表 java對象成員屬性名keyColumn代表數(shù)據(jù)庫記錄主鍵字段
最后實(shí)踐發(fā)現(xiàn)因?yàn)閕nsert方法鐘使用了@param注解,keyProperty 應(yīng)該設(shè)置為user.id
r如下
?<!-- 插入數(shù)據(jù):返回記錄主鍵id值 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="user.id" ?keyColumn="id">
?? ??? ?insert ?into t_user (name,age) values (#{user.name},#{user.age})
</insert>或者修改方法和sql
void insert(User user);
?<!-- 插入數(shù)據(jù):返回記錄主鍵id值 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id" ?keyColumn="id">
?? ??? ?insert ?into t_user (name,age) values (#{name},#{age})
</insert>總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot實(shí)現(xiàn)定時(shí)任務(wù)的四種方式小結(jié)
本文主要介紹了springboot實(shí)現(xiàn)定時(shí)任務(wù)的四種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
idea中啟動項(xiàng)目彈出 IDEA out of memory窗口的解決方案
這篇文章主要介紹了idea中啟動項(xiàng)目彈出 IDEA out of memory窗口的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之?dāng)?shù)組
數(shù)組是有序的元素序列,若將有限個類型相同的變量的集合命名,那么這個名稱為數(shù)組名。組成數(shù)組的各個變量稱為數(shù)組的分量,也稱為數(shù)組的元素,有時(shí)也稱為下標(biāo)變量。數(shù)組是在程序設(shè)計(jì)中,為了處理方便, 把具有相同類型的若干元素按有序的形式組織起來的一種形式2022-02-02
SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄
微信的登錄功能是用戶注冊和使用微信的必經(jīng)之路之一,而微信授權(quán)登錄更是方便了用戶的登錄操作,本文主要介紹了SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄,感興趣的可以了解一下2023-09-09
java web用servlet監(jiān)聽器實(shí)現(xiàn)顯示在線人數(shù)
這篇文章主要為大家詳細(xì)介紹了java web用servlet監(jiān)聽器實(shí)現(xiàn)顯示在線人數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
javaweb如何實(shí)現(xiàn)請求和響應(yīng)
這篇文章主要為大家詳細(xì)介紹了javaweb如何實(shí)現(xiàn)請求和響應(yīng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10

