Mybatis使用useGeneratedKeys獲取自增主鍵
一、useGeneratedKeys 是什么 ?
關(guān)于useGeneratedKeys
,官方的說(shuō)法是,這個(gè)參數(shù)的作用是:"允許 JDBC 支持自動(dòng)生成主鍵,需要驅(qū)動(dòng)兼容",如何理解這句話的含義?
其原意是。對(duì)于支持自動(dòng)生成記錄主鍵的數(shù)據(jù)庫(kù),如 MySQL 和 SQL Server,此時(shí)將 useGeneratedKeys 參數(shù)的值設(shè)置為 true,則進(jìn)行 INSERT 操作后,數(shù)據(jù)庫(kù)自動(dòng)生成的主鍵會(huì)填充到 Java 實(shí)體屬性中,我們可以從 Java 實(shí)體屬性中獲得數(shù)據(jù)庫(kù)自動(dòng)生成的主鍵 ID。
二、如何使用?
配置useGeneratedKeys
,可以通過(guò)以下方式實(shí)現(xiàn):
- 配置全局配置文件
- 在 xml 映射器中配置 useGeneratedKeys 參數(shù)
- 在接口映射器中設(shè)置 useGeneratedKeys 參數(shù)
2.1 在 mybatis 的全局配置文件中配置
application.yml 配置文件
通過(guò) configLocation 指定 mybatis 的配置文件 mybatis-config.xml
# MyBatis configuration mybatis: # Search for the specified package alias typeAliasesPackage: com.ruoyi.**.domain # Configure mapper scan to find all mapper.xml mapping files mapperLocations: classpath*:mapper/**/*Mapper.xml # Load the global configuration file configLocation: classpath:mybatis/mybatis-config.xml
mybatis-config.xml
通過(guò)<setting name="useGeneratedKeys" value="true" />
激活useGeneratedKeys
.
<?xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="cacheEnabled" value="true" /> <!-- global mapper enables caching --> <setting name="useGeneratedKeys" value="true" /> <!-- Allow JDBC to support automatic generation of primary keys --> <setting name="defaultExecutorType" value="REUSE" /> <!-- configure the default executor --> <setting name="logImpl" value="SLF4J" /> <!-- Specify the specific implementation of the log used by MyBatis --> <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> <!– CamelCase naming–>--> </settings> </configuration>
注意:在settings
元素中設(shè)置的全局 useGeneratedKeys
參數(shù)對(duì) xml 后綴的 mapper 無(wú)效。如果你想在 xml 后綴的 mapper 中添加記錄后返回主鍵 ID,你必須在 xml 后綴的 mapper 中明確設(shè)置useGeneratedKeys
參數(shù)的值為 true。
2.2 在 xml mapper 中配置 useGeneratedKeys 參數(shù)。
Mapper.xml
<insert id="addBigdataGroup" parameterType="BigdataGroup" useGeneratedKeys="true" keyProperty="groupId" keyColumn="group_id"> insert into bigdata_group ( group_id, group_name, comment, business_line, create_by, remark, create_time) values(#{groupId}, #{groupName}, #{comment}, #{businessLine}, #{createBy}, #{remark}, sysdate() ); </insert>
parameterType
傳入?yún)?shù)類型
keyProperty
JAVA 對(duì)象中的屬性名稱
keyColumn
數(shù)據(jù)庫(kù)字段名稱
keyProperty與keyColumn的關(guān)系圖示(來(lái)自網(wǎng)絡(luò)).png
再次說(shuō)明:在 xml mapper 中配置的 useGeneratedKeys 參數(shù)只影響 xml mapper,設(shè)置元素中設(shè)置的全局 useGeneratedKeys 參數(shù)值對(duì) xml mapper 沒(méi)有影響。
2.3 在 interface mapper 中設(shè)置 useGeneratedKeys 參數(shù)
設(shè)置 useGeneratedKeys 為 true,返回由數(shù)據(jù)庫(kù)自動(dòng)生成的記錄主鍵 id。
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") @Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())") Integer insertOneTest(Test test);
注意:在 interface mapper 中設(shè)置的 useGeneratedKeys
參數(shù)將覆蓋 mybatis 配置文件中 setting 元素內(nèi)所配置的useGeneratedKeys
的值。
另外筆者的實(shí)踐中,keyProperty = "id"
并未生效,需要設(shè)置為keyProperty = "test.id"
;即參數(shù)的名稱 + . + 主鍵屬性名。 讀者老師需結(jié)合自己的環(huán)境試一試。
三、遇到的問(wèn)題
在配置了獲得主鍵 ID 后,但返回的結(jié)果并沒(méi)有像預(yù)期的那樣返回新插入數(shù)據(jù)庫(kù)行的主鍵的真實(shí)數(shù)據(jù)。但返回的居然1
。
代碼示例如下:
- Mybatis 側(cè)
import java.util.List; public interface BigdataMapper { List<BigdataGroup> getBigdataGroup(); int addBigdataGroup(BigdataGroup bigdataGroup); }
- service 側(cè)
public int addBigdataGroup(BigdataGroup bigdataGroup) { bigdataGroup.setCreateBy(SecurityUtils.getUsername()); int update = bigdataMapper. addBigdataGroup(bigdataGroup); log.info("update: {}", update); return update; }
- xml file側(cè)
<insert id="addBigdataGroup" parameterType="BigdataGroup" useGeneratedKeys="true" keyProperty="groupId" keyColumn="group_id"> insert into bigdata_group ( group_id, group_name, comment, business_line, create_by, remark, create_time) values(#{groupId}, #{groupName}, #{comment}, #{businessLine}, #{createBy}, #{remark}, sysdate() ); </insert>
- 打印結(jié)果
按理說(shuō),返回的結(jié)果應(yīng)該是插入后主鍵中的真實(shí)數(shù)據(jù),但返回結(jié)果是1
。
注意:真實(shí)的 id 已經(jīng)被注入到參數(shù)傳遞對(duì)象的主鍵的相應(yīng)屬性中,方法的返回值實(shí)際表示的是插入的行數(shù),因?yàn)椴迦肓?1 條記錄,所以返回值是 1;如果要獲得新添加數(shù)據(jù)的自增ID,那么只需要讀取對(duì)象中對(duì)應(yīng)的自增ID屬性的值。
修改獲取主鍵值的方式:
public int addBigdataGroup(BigdataGroup bigdataGroup) { bigdataGroup.setCreateBy(SecurityUtils.getUsername()); int update = bigdataMapper. addBigdataGroup(bigdataGroup); log.info("update: {}", update); // Add the following code int group_id = bigdataGroup. getGroupId(); log.info("group_id: {}", group_id); // stop here return update; }
結(jié)語(yǔ)
以上就是Mybatis使用useGeneratedKeys獲取自增主鍵的詳細(xì)內(nèi)容,更多關(guān)于Mybatis useGeneratedKeys自增主鍵的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- MyBatis-Plus如何解決主鍵自增問(wèn)題
- MybatisPlus使用@TableId主鍵id自增長(zhǎng)無(wú)效的解決
- 如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id
- 詳解mybatis插入數(shù)據(jù)后返回自增主鍵ID的問(wèn)題
- Mybatis-plus實(shí)現(xiàn)主鍵自增和自動(dòng)注入時(shí)間的示例代碼
- MyBatis插入時(shí)獲取自增主鍵方法
- 利用Java的MyBatis框架獲取MySQL中插入記錄時(shí)的自增主鍵
- MyBatis主鍵自增的兩種實(shí)現(xiàn)方法
相關(guān)文章
深入學(xué)習(xí)JAVA GC日志的相關(guān)知識(shí)
JVM 在Java應(yīng)用程序優(yōu)化中是不可缺少的一大重項(xiàng),如何合理配置Java參數(shù),如何驗(yàn)證配置參數(shù)的有效性,從GC日志中可以獲得很重要的提示。下面小編就帶大家來(lái)一起學(xué)習(xí)一下吧2019-06-06Java并發(fā)編程如何降低鎖粒度并實(shí)現(xiàn)性能優(yōu)化
這篇文章主要介紹了Java并發(fā)編程如何降低鎖粒度并實(shí)現(xiàn)性能優(yōu)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08關(guān)于通過(guò)Java連接mysql對(duì)反斜杠”\“轉(zhuǎn)義的測(cè)試詳解
這篇文章主要給大家介紹了關(guān)于通過(guò)Java連接mysql對(duì)反斜杠”\“轉(zhuǎn)義的測(cè)試的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家理解反斜杠”\“轉(zhuǎn)義具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06elasticsearch構(gòu)造Client實(shí)現(xiàn)java客戶端調(diào)用接口示例分析
這篇文章主要為大家介紹了elasticsearch構(gòu)造Client實(shí)現(xiàn)java客戶端調(diào)用接口示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04LibrarySystem圖書管理系統(tǒng)開發(fā)(一)
這篇文章主要為大家詳細(xì)介紹了LibrarySystem圖書管理系統(tǒng)開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Java使用PDFBox實(shí)現(xiàn)操作PDF文檔
這篇文章主要為大家詳細(xì)介紹了Java如何使用PDFBox實(shí)現(xiàn)操作PDF文檔,例如添加本地圖片、添加網(wǎng)絡(luò)圖片、圖片寬高自適應(yīng)、圖片水平垂直居中對(duì)齊等功能,需要的可以了解下2024-03-03Java運(yùn)用SWT插件編寫桌面記事本應(yīng)用程序
這篇文章主要為大家介紹了一個(gè)Java項(xiàng)目實(shí)戰(zhàn),一步步教你實(shí)現(xiàn)記事本,步驟很詳細(xì),運(yùn)用SWT插件手把手編寫記事本,感興趣的小伙伴們可以參考一下2016-01-01