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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實現(xiàn)emqx設(shè)備上下線監(jiān)聽詳解
這篇文章主要為大家介紹了java實現(xiàn)emqx設(shè)備上下線監(jiān)聽詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07windows如何使用bat腳本后臺啟動/停止和重啟jar包服務(wù)
這篇文章主要介紹了windows使用bat腳本后臺啟動/停止和重啟jar包服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Java實現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能示例
這篇文章主要介紹了Java實現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能,結(jié)合具體實例形式分析了java日期與時間戳類型的表示與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-06-06spring?cloud?配置阿里數(shù)據(jù)庫連接池?druid的示例代碼
這篇文章主要介紹了spring?cloud?配置阿里數(shù)據(jù)庫連接池?druid,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03