欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis插入數(shù)據(jù)不返回主鍵id的可能原因及解決方式

 更新時(shí)間:2023年08月31日 17:00:48   作者:宋崢清  
這篇文章主要介紹了mybatis插入數(shù)據(jù)不返回主鍵id的可能原因及解決方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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ā)工具)

    這篇文章主要介紹了解決本機(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ī)

    這篇文章主要介紹了使用springboot打包成zip部署,并實(shí)現(xiàn)優(yōu)雅停機(jī),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Nacos簡介最新收藏版

    Nacos簡介最新收藏版

    Nacos?是阿里巴巴推出來的一個(gè)新開源項(xiàng)目,這是一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái),Nacos?幫助您更敏捷和容易地構(gòu)建、交付和管理微服務(wù)平臺(tái),對Nacos相關(guān)基本知識感興趣的朋友一起看看吧
    2023-08-08
  • 解決引用slf4j中Logger.info只打印出文字沒有數(shù)據(jù)的問題

    解決引用slf4j中Logger.info只打印出文字沒有數(shù)據(jù)的問題

    這篇文章主要介紹了解決引用slf4j中Logger.info只打印出文字沒有數(shù)據(jù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot自定義對象參數(shù)超詳細(xì)介紹作用

    SpringBoot自定義對象參數(shù)超詳細(xì)介紹作用

    SpringBoot通過自定義對象參數(shù),可以實(shí)現(xiàn)自動(dòng)類型轉(zhuǎn)換與格式化,并可以級聯(lián)封裝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • Java串口通信入門

    Java串口通信入門

    串口通信是一種用于在計(jì)算機(jī)和外部設(shè)備之間進(jìn)行數(shù)據(jù)交換的通信方式,本文主要介紹了Java串口通信入門,并提供一個(gè)簡單的示例來演示如何在Java中進(jìn)行串口通信,感興趣的可以了解一下
    2023-11-11
  • Java基礎(chǔ)之Maven詳解

    Java基礎(chǔ)之Maven詳解

    這篇文章主要介紹了Java基礎(chǔ)之Maven詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring事務(wù)中@Transactional注解不生效的原因分析與解決

    Spring事務(wù)中@Transactional注解不生效的原因分析與解決

    在Spring框架中,@Transactional注解是管理數(shù)據(jù)庫事務(wù)的核心方式,本文將深入分析事務(wù)自調(diào)用的底層原理,解釋為什么事務(wù)不生效,并提供多種解決方案,希望對大家有所幫助
    2025-03-03
  • Springcloud eureka搭建高可用集群過程圖解

    Springcloud eureka搭建高可用集群過程圖解

    這篇文章主要介紹了Springcloud eureka搭建高可用集群過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 解讀SpringMVC?請求參數(shù)接收

    解讀SpringMVC?請求參數(shù)接收

    這篇文章主要介紹了SpringMVC請求參數(shù)接收的相關(guān)操作,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07

最新評論