mybatis插入數(shù)據(jù)不返回主鍵id的可能原因及解決方式
mybatis插入數(shù)據(jù)不返回主鍵id原因及解決
mybatis插入數(shù)據(jù)返回主鍵id這個(gè)特性很好用,但是不注意細(xì)節(jié)的話很容易拿不到主鍵id,因此這篇文章比較全面的講解下,拿不到主鍵id的可能因素和解決方案。
1.xml是否配置返回主鍵id
普通插入數(shù)據(jù)的xml如下:
<insert id="addUser"> INSERT INTO user(name,age) VALUES(#{name},#{age}) </insert>
這是一個(gè)新增用戶的xml如果想要新增后返回用戶id進(jìn)行下一步業(yè)務(wù)操作,有兩個(gè)屬性是必不可少的
useGeneratedKeys="true" keyProperty="id"
這兩個(gè)屬性意思為:如果表中新增數(shù)據(jù)自增主鍵是【id】的話,就會(huì)把主鍵id返回
所以如果沒有返回,或者想要返回?cái)?shù)據(jù)主鍵id,這兩個(gè)屬性必不可少
2.dao類入?yún)⒚Q是否額外配置
普通dao類如下:
UserDao 或者 UserMapper類有個(gè)新增用戶的方法,以下統(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>
參照以上寫法,在添加用戶后,會(huì)通過【keyProperty】屬性把用戶id給映射到User類中的id去,這樣子是能拿到id的
但是如果UserDao添加用戶方法是以下這種方式:
多了個(gè)@Param注解
int addUser(@Param("user")User user);
那么相對應(yīng)xml中的【keyProperty】屬性也需要通過轉(zhuǎn)化為@Param中的名稱去引用id,不然mybatis不知道把返回的id映射到哪個(gè)字段去,
正確如下:
<insert id="addUser" useGeneratedKeys="true" keyProperty="user.id"> INSERT INTO user(name,age) VALUES(#{user.name},#{user.age}) </insert>
有種馬虎的寫法是這種,【keyProperty】沒有使用UserDao添加用戶@Param的別名去引用id,所以獲取不到主鍵id:
錯(cuò)誤的:?。。?! <insert id="addUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name,age) VALUES(#{user.name},#{user.age}) </insert>
3.排除以上兩種,請檢查獲取主鍵id的業(yè)務(wù)代碼
這個(gè)問題導(dǎo)致的可能性比較低,一般來說是不太可能會(huì)發(fā)展,但是也架不住的確發(fā)生了(比如我…)
上錯(cuò)誤業(yè)務(wù)代碼:
//問題代碼 //添加用戶 User user = User.builder().name("小紅").age(18).build(); int userId = userDao.addUser(user); //將用戶設(shè)置為管理員 roleDao.setManager(userId); .......
乍一看,貌似沒問題,但是…有時(shí)候?qū)慶urd腦子沒有轉(zhuǎn)過來的話,就犯下了這種錯(cuò)誤
新增用戶后返回的主鍵id,并不是通過userDao.addUser()方法返回來的,這里返回的是數(shù)據(jù)庫數(shù)據(jù)的影響行數(shù),因此一直返回值是1的時(shí)候我驚呆了,一直在想為什么以前dao層這么寫能獲取呢????后面上個(gè)廁所再仔細(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è)面說了一件事,寫代碼是個(gè)精細(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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決本機(jī)安裝的JDK8,啟動(dòng)IDEA2019沒反應(yīng)的問題(開發(fā)工具)
這篇文章主要介紹了解決本機(jī)安裝的JDK8啟動(dòng)IDEA2019沒反應(yīng)的問題(開發(fā)工具),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10使用springboot打包成zip部署,并實(shí)現(xiàn)優(yōu)雅停機(jī)
這篇文章主要介紹了使用springboot打包成zip部署,并實(shí)現(xiàn)優(yōu)雅停機(jī),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08解決引用slf4j中Logger.info只打印出文字沒有數(shù)據(jù)的問題
這篇文章主要介紹了解決引用slf4j中Logger.info只打印出文字沒有數(shù)據(jù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12SpringBoot自定義對象參數(shù)超詳細(xì)介紹作用
SpringBoot通過自定義對象參數(shù),可以實(shí)現(xiàn)自動(dòng)類型轉(zhuǎn)換與格式化,并可以級聯(lián)封裝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09Spring事務(wù)中@Transactional注解不生效的原因分析與解決
在Spring框架中,@Transactional注解是管理數(shù)據(jù)庫事務(wù)的核心方式,本文將深入分析事務(wù)自調(diào)用的底層原理,解釋為什么事務(wù)不生效,并提供多種解決方案,希望對大家有所幫助2025-03-03