MyBatis中useGenerateKeys的使用解析
MyBatis useGenerateKeys的使用
需求
使用MyBatis往MySQL數(shù)據(jù)庫中插入一條記錄后,需要返回該條記錄的自增主鍵值。
方法:在mapper中指定keyProperty屬性,示例如下:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="userId" parameterType="cn.stu.entity.UserEntity">
insert into user(userName,password,comment)
values(#{userName},#{password},#{comment})
</insert>
注意:此處可能會有坑:
如果在<insert>的右邊尖括號之后有空格,在啟動時可能會報:元素類型 "insert" 必須后跟屬性規(guī)范 ">" 或 "/>",并且,在作新增操作時會一直增不進(jìn)去而報SQL語法錯誤,碰到這類問題就把<insert>標(biāo)簽整體在敲一邊就可以了
如上所示,我們在insert中指定了keyProperty="userId",其中userId代表插入的User對象的主鍵屬性。
User.java
public class User {
private int userId;
private String userName;
private String password;
private String comment;
//setter and getter
}
UserDao.java
public interface UserDao {
public int insertAndGetId(User user);
}
測試:
Java代碼
User user = new User();
user.setUserName("chenzhou");
user.setPassword("xxxx");
user.setComment("測試插入數(shù)據(jù)返回主鍵功能");
System.out.println("插入前主鍵為:"+user.getUserId());
userDao.insertAndGetId(user);//插入操作
System.out.println("插入后主鍵為:"+user.getUserId());
輸出:
1.插入前主鍵為:0
2.插入后主鍵為:15
查詢數(shù)據(jù)庫:

如上所示,剛剛插入的記錄主鍵id為15
小結(jié)一下吧
用了這個useGenerateKeys="true"后,不用再在寫一句關(guān)于select的SQL(降低數(shù)據(jù)庫的壓力)而直接能夠得到剛剛插進(jìn)去的那個主鍵,但是——這個屬性只能用在主鍵能自增長的數(shù)據(jù)庫里面比如MySQL可以用,但是oracle就不能用了!
對于oracle返回自增主鍵(oracle序列)如下
keyProperty:將查詢到主鍵值設(shè)置到parameterType指定的對象的哪個屬性order:相對于insert語句來說它的執(zhí)行順序,只要不是自增主鍵,那么就設(shè)置為beforeresultType:指定返回的結(jié)果類型
MyBatis keyProperty和useGenerateKeys
用了這個useGenerateKeys="true"后,不用再在寫一句關(guān)于select的SQL(降低數(shù)據(jù)庫的壓力)而直接能夠得到剛剛插進(jìn)去的那個主鍵,但是——這個屬性只能用在主鍵能自增長的數(shù)據(jù)庫里面比如MySQL可以用,但是oracle就不能用了!
這倆個屬性好像只能在insert語句中去使用
意思就是你在controller語句中執(zhí)行完一個insert語句后,會有一條記錄插入到了數(shù)據(jù)庫中,然后主鍵進(jìn)行了自增,正常情況下應(yīng)該是再有一條語句去數(shù)據(jù)庫中找到這個id,但是此時不用了,直接就可以拿到這個id了
看例子吧
User user = new User();
user.setUserName("chenzhou");
user.setPassword("xxxx");
user.setComment("測試插入數(shù)據(jù)返回主鍵功能");
System.out.println("插入前主鍵為:"+user.getUserId());
userDao.insertAndGetId(user);//插入操作
System.out.println("插入后主鍵為:"+user.getUserId());
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SimpleDateFormat的線程安全問題與解決方案
這篇文章主要介紹了SimpleDateFormat的線程安全問題與解決方案,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03
java正則表達(dá)式匹配網(wǎng)頁所有網(wǎng)址和鏈接文字的示例
這篇文章主要介紹了java正則表達(dá)式匹配網(wǎng)頁所有網(wǎng)址和鏈接文字java正則表達(dá)式匹配,需要的朋友可以參考下2014-03-03
mybatis教程之查詢緩存(一級緩存二級緩存和整合ehcache)
這篇文章主要介紹了mybatis教程之查詢緩存(一級緩存二級緩存和整合ehcache),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
java對象類型轉(zhuǎn)換和多態(tài)性(實(shí)例講解)
下面小編就為大家?guī)硪黄猨ava對象類型轉(zhuǎn)換和多態(tài)性(實(shí)例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
SpringBoot使用Flyway進(jìn)行數(shù)據(jù)庫管理的操作方法
Flyway是一個開源的數(shù)據(jù)庫版本管理工具,并且極力主張“約定大于配置”,簡單、專注、強(qiáng)大。接下來通過本文給大家介紹SpringBoot使用Flyway進(jìn)行數(shù)據(jù)庫管理的方法,感興趣的朋友一起看看吧2021-09-09
Java字節(jié)碼增強(qiáng)技術(shù)知識點(diǎn)詳解
在本篇文章里小編給大家整理的是一篇關(guān)于Java字節(jié)碼增強(qiáng)技術(shù)知識點(diǎn)詳解內(nèi)容,有興趣的朋友可以跟著學(xué)習(xí)下。2021-08-08

