MyBatis中useGenerateKeys的使用解析
MyBatis useGenerateKeys的使用
需求
使用MyBatis往MySQL數(shù)據(jù)庫(kù)中插入一條記錄后,需要返回該條記錄的自增主鍵值。
方法:在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>
注意:此處可能會(huì)有坑:
如果在<insert>的右邊尖括號(hào)之后有空格,在啟動(dòng)時(shí)可能會(huì)報(bào):元素類(lèi)型 "insert" 必須后跟屬性規(guī)范 ">" 或 "/>",并且,在作新增操作時(shí)會(huì)一直增不進(jìn)去而報(bào)SQL語(yǔ)法錯(cuò)誤,碰到這類(lèi)問(wèn)題就把<insert>標(biāo)簽整體在敲一邊就可以了
如上所示,我們?cè)趇nsert中指定了keyProperty="userId",其中userId代表插入的User對(duì)象的主鍵屬性。
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);    
}  
測(cè)試:
Java代碼
User user = new User();  
user.setUserName("chenzhou");  
user.setPassword("xxxx");  
user.setComment("測(cè)試插入數(shù)據(jù)返回主鍵功能");  
  
System.out.println("插入前主鍵為:"+user.getUserId());  
userDao.insertAndGetId(user);//插入操作  
System.out.println("插入后主鍵為:"+user.getUserId());  
輸出:
1.插入前主鍵為:0
2.插入后主鍵為:15
查詢(xún)數(shù)據(jù)庫(kù):

如上所示,剛剛插入的記錄主鍵id為15
小結(jié)一下吧
用了這個(gè)useGenerateKeys="true"后,不用再在寫(xiě)一句關(guān)于select的SQL(降低數(shù)據(jù)庫(kù)的壓力)而直接能夠得到剛剛插進(jìn)去的那個(gè)主鍵,但是——這個(gè)屬性只能用在主鍵能自增長(zhǎng)的數(shù)據(jù)庫(kù)里面比如MySQL可以用,但是oracle就不能用了!
對(duì)于oracle返回自增主鍵(oracle序列)如下
keyProperty:將查詢(xún)到主鍵值設(shè)置到parameterType指定的對(duì)象的哪個(gè)屬性order:相對(duì)于insert語(yǔ)句來(lái)說(shuō)它的執(zhí)行順序,只要不是自增主鍵,那么就設(shè)置為beforeresultType:指定返回的結(jié)果類(lèi)型
MyBatis keyProperty和useGenerateKeys
用了這個(gè)useGenerateKeys="true"后,不用再在寫(xiě)一句關(guān)于select的SQL(降低數(shù)據(jù)庫(kù)的壓力)而直接能夠得到剛剛插進(jìn)去的那個(gè)主鍵,但是——這個(gè)屬性只能用在主鍵能自增長(zhǎng)的數(shù)據(jù)庫(kù)里面比如MySQL可以用,但是oracle就不能用了!
這倆個(gè)屬性好像只能在insert語(yǔ)句中去使用
意思就是你在controller語(yǔ)句中執(zhí)行完一個(gè)insert語(yǔ)句后,會(huì)有一條記錄插入到了數(shù)據(jù)庫(kù)中,然后主鍵進(jìn)行了自增,正常情況下應(yīng)該是再有一條語(yǔ)句去數(shù)據(jù)庫(kù)中找到這個(gè)id,但是此時(shí)不用了,直接就可以拿到這個(gè)id了
看例子吧
User user = new User();  
user.setUserName("chenzhou");  
user.setPassword("xxxx");  
user.setComment("測(cè)試插入數(shù)據(jù)返回主鍵功能");  
 
System.out.println("插入前主鍵為:"+user.getUserId());  
userDao.insertAndGetId(user);//插入操作  
System.out.println("插入后主鍵為:"+user.getUserId());
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
 java實(shí)現(xiàn)emqx設(shè)備上下線(xiàn)監(jiān)聽(tīng)詳解
這篇文章主要為大家介紹了java實(shí)現(xiàn)emqx設(shè)備上下線(xiàn)監(jiān)聽(tīng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
 使用純java config來(lái)配置spring mvc方式
這篇文章主要介紹了使用純java config來(lái)配置spring mvc方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
 windows如何使用bat腳本后臺(tái)啟動(dòng)/停止和重啟jar包服務(wù)
這篇文章主要介紹了windows使用bat腳本后臺(tái)啟動(dòng)/停止和重啟jar包服務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
 Java實(shí)現(xiàn)的時(shí)間戳與date對(duì)象相互轉(zhuǎn)換功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的時(shí)間戳與date對(duì)象相互轉(zhuǎn)換功能,結(jié)合具體實(shí)例形式分析了java日期與時(shí)間戳類(lèi)型的表示與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
 spring?cloud?配置阿里數(shù)據(jù)庫(kù)連接池?druid的示例代碼
這篇文章主要介紹了spring?cloud?配置阿里數(shù)據(jù)庫(kù)連接池?druid,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03

