最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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)文章

  • Java8通過Function獲取字段名的步驟

    Java8通過Function獲取字段名的步驟

    這篇文章主要介紹了Java8通過Function獲取字段名,需要的朋友可以參考下
    2020-04-04
  • springboot實(shí)現(xiàn)定時(shí)任務(wù)的四種方式小結(jié)

    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窗口的解決方案

    這篇文章主要介紹了idea中啟動項(xiàng)目彈出 IDEA out of memory窗口的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot Feign使用教程超全面講解

    SpringBoot Feign使用教程超全面講解

    現(xiàn)在的微服務(wù)項(xiàng)目不少都使用的是springboot+Feign構(gòu)建的項(xiàng)目,微服務(wù)之間的調(diào)用都離不開feign來進(jìn)行遠(yuǎn)程調(diào)用,這篇文章主要介紹了SpringBoot Feign使用教程,需要的朋友可以參考下
    2022-11-11
  • Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之?dāng)?shù)組

    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)登錄

    SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄

    微信的登錄功能是用戶注冊和使用微信的必經(jīng)之路之一,而微信授權(quán)登錄更是方便了用戶的登錄操作,本文主要介紹了SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄,感興趣的可以了解一下
    2023-09-09
  • 使用Java對PDF添加水印的操作代碼

    使用Java對PDF添加水印的操作代碼

    在當(dāng)今數(shù)字化辦公環(huán)境中,PDF 文檔作為信息交流和存儲的重要載體,其安全性和版權(quán)保護(hù)變得尤為關(guān)鍵,企業(yè)常常需要對內(nèi)部敏感文檔或?qū)ν獍l(fā)布的資料添加水印,以防止未經(jīng)授權(quán)的使用,本文將為您揭示這一問題的解決方案,深入探討如何使用Java對PDF添加水印,需要的朋友可以參考下
    2025-10-10
  • springboot自定義攔截器簡單使用及舉例

    springboot自定義攔截器簡單使用及舉例

    Spring Boot攔截器是AOP的一種實(shí)現(xiàn),專門攔截對控制層的請求,主要應(yīng)用于判斷用戶權(quán)限,攔截webSocket請求,下面這篇文章主要給大家介紹了關(guān)于springboot自定義攔截器簡單使用及舉例的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • java web用servlet監(jiān)聽器實(shí)現(xiàn)顯示在線人數(shù)

    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)

    javaweb如何實(shí)現(xiàn)請求和響應(yīng)

    這篇文章主要為大家詳細(xì)介紹了javaweb如何實(shí)現(xiàn)請求和響應(yīng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論

天等县| 长沙县| 怀宁县| 萨嘎县| 会东县| 保康县| 盖州市| 青龙| 团风县| 公安县| 九江市| 商河县| 麦盖提县| 霞浦县| 武汉市| 铜鼓县| 晋城| 鄂托克前旗| 潼关县| 若尔盖县| 基隆市| 孟津县| 湄潭县| 宜川县| 东乌| 大兴区| 开平市| 永州市| 道真| 钟祥市| 都江堰市| 武强县| 凌海市| 岳阳县| 灵石县| 南安市| 开封县| 邛崃市| 教育| 姚安县| 嘉祥县|