mybatis插入數(shù)據(jù)后返回自增主鍵ID的兩種實現(xiàn)方式
mybatis插入數(shù)據(jù)后返回自增主鍵ID
開發(fā)過程中我們經(jīng)常性的會用到許多的中間表,mybatis插入數(shù)據(jù)后返回自增主鍵的兩種方式,
用于數(shù)據(jù)之間的對應和關(guān)聯(lián),這個時候我們關(guān)聯(lián)最多的就是ID,我們在一張表中插入數(shù)據(jù)后級聯(lián)增加到關(guān)聯(lián)表中,我們數(shù)值的mybatis在插入數(shù)據(jù)后返回的是插入成功的條數(shù),那么這個時候我們想要得到相應的新增數(shù)據(jù)的ID,該怎么辦呢?
下面我們介紹二種方式來實現(xiàn),一種是在xml文件種設(shè)置屬性,另外一種就是使用注解來實現(xiàn)。
整體兩種方法流程
1.使用注解@SelectKey,繼承原生的方法insert來實現(xiàn)
這種方法是使用注解,不使用xml方法,使用繼承原生的方法insert來實現(xiàn),在注解里面寫號SQL以及每個字段綁定的變量即可。
注解的方法為
@Override
@Insert(" INSERT INTO `air_quality_index` (`districtId`, `monitorTime`, `Pm10`,`Pm25`,`monitoringStation`) VALUES (#{districtId}, NOW(), #{Pm10},#{Pm25},#{monitoringStation}))
@SelectKey(statement="select currval('air_quality_index_id_seq')"),keyProperty = "id",before=false,resultType = Long.class)
int insert(User user);@SelectKey(statement="select currval('air_quality_index_id_seq')"),keyProperty = "id",before=false,resultType = Long.class)其中select currval('air_quality_index_id_seq')")就是pgsql插入后返回的自增id,這種方式需要把數(shù)據(jù)庫表的id設(shè)置成自增ID,這樣注解就生效了
在使用的時候直接用
result = getBaseMapper().insert(user);
最后也得到了這個 自增的ID,當然了,我這個用的是pgsql,如果是mysql,在執(zhí)行select LAST_INSERT_ID()得到的結(jié)果那么注解就得改一下:
@SelectKey(statement="select LAST_INSERT_ID()",keyProperty = "id",before = false,resultType = Long.class)
其中select LAST_INSERT_ID()就是mysql插入數(shù)據(jù)后,獲取的當前的自增id。
2.在xml中定義useGeneratedKeys為true,返回主鍵id的值
keyProperty和keyColum分別代表
數(shù)據(jù)庫記錄主鍵字段和java對象成員屬性名:在XML文件中要設(shè)置userGeneratedKeys="true" keyProperty="id"
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
@Insert(" INSERT INTO `air_quality_index` (`districtId`, `monitorTime`, `Pm10`,`Pm25`,`monitoringStation`) VALUES (#{districtId}, NOW(), #{Pm10},#{Pm25},#{monitoringStation}))
</insert>mybatis自動生成主鍵,返回自增主鍵 insert語句
對于表的主鍵自動生成的 insert語句 , 在不需要返回自增主鍵時 , 就和普通的insert語句沒有區(qū)別 , 在需要的返回的時候 , 情況稍微有點不一樣 , 故在此記錄一下 . 在MyBatis中 , 有兩種方式編寫SQL , 一種XML方式 , 一種是注解方式 .
首先在MYSQL中新建一張表 , 建表語句如下
CREATE TABLE `sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶id', `user_name` varchar(64) DEFAULT NULL COMMENT '用戶名', `password` varchar(64) DEFAULT NULL COMMENT '密碼', `email` varchar(100) DEFAULT NULL COMMENT '郵箱', `info` text COMMENT '簡介', `create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';
在使用主鍵自增的時候 , 插入數(shù)據(jù)庫后可能需要得到自增的主鍵值 , 然后使用這個值進行一些其他的操作 .
有些數(shù)據(jù)庫提供主鍵自增(MYSQL , SQLSERVER) , 有些不提供(ORACLE) , 而是使用序列得到一個值 , 然后將這個值賦給 id , 再講數(shù)據(jù)插入.
1.XML方式
- 1.1返回自增主鍵
<insert id="insert1" useGeneratedKeys="true" keyProperty="id">
insert into sys_user(user_name,password,email,info,create_time)
values(#{userName},#{password},#{email},#{info},#{createTime})
</insert>使用useGeneratedKeys設(shè)置為true后 , MyBatis會使用JDBC的getGeneratedKeys方法取出由數(shù)據(jù)庫內(nèi)部生成的主鍵 .
獲得主鍵值之后將其賦給keyProperty配置的 id 屬性 .
當需要設(shè)置多個屬性時 , 使用逗號隔開 , 這種情況下 還需要配置 keyColumn屬性 , 按順序指定數(shù)據(jù)庫的列 , 這里列的值會和 keyProperty 配置的屬性一一對應 .
由于要使用數(shù)據(jù)庫返回的主鍵值 , 所以SQL上下兩部分的列中去掉了 id 列和對于的 #{id} 屬性
- 1.2返回非自增主鍵
采用 <selectKey>標簽獲取主鍵的值 , 這種方式對提供和不提供主鍵自增功能的數(shù)據(jù)庫同樣適用
<insert id="insert2">
insert into sys_user(user_name,password,email,info,create_time)
values(#{userName},#{password},#{email},#{info},#{createTime})
<selectKey keyColumn="id" resultType="int" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>selectKey標簽的 keyColumn,keyProperty和上面useGeneratedKeys的用法和含義一樣 , 這里的resultType用于設(shè)置返回值類型.
order 屬性和數(shù)據(jù)庫相關(guān) , 在MYSQL 中 , order是AFTER , 因為當前及記錄的主鍵值在insert語句執(zhí)行成功之后才能拿到 , 而在ORACLE中,oder是BEFORE , 因為ORACLE需要先從序列取到值 , 再將其作為主鍵插入到數(shù)據(jù)庫
2.注解方式
- 2.1返回自增主鍵
@Insert("insert into sys_user(user_name,password,email,info,create_time)"
+"values(#{userName},#{password},#{email},#{info},#{createTime})")
@Options(keyColumn="id",keyProperty="id",useGeneratedKeys=true)
int insert(SysUser user);insert方法上除了 @Insert 注解之外 , 多了一個 @Option 注解 , 在這個注解上配置了useGeneratedKeys 和 keyProperty屬性,用法和 XML 的方式一樣 , 當需要配置多個列的時候 , 這個注解也提供了 keyColumn 屬性 , 可以像XML中那樣配置使用 .
- 2.2返回非自增
@Insert("insert into sys_user(user_name,password,email,info,create_time)"
+"values(#{userName},#{password},#{email},#{info},#{createTime})")
@SelectKey(statement="SELECT LAST_INSERT_ID()",
keyProperty="id",
resultType=Integer.class,
before = false)
int insert(SysUser user);和XML的方式對比 , 只是XML中的order屬性換成了 before屬性 , before = true時 , 功能和order = before一樣 , before = false時, 功能和order = after一樣
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決Springboot全局異常處理與AOP日志處理中@AfterThrowing失效問題
這篇文章主要介紹了解決Springboot全局異常處理與AOP日志處理中@AfterThrowing失效問題,文中介紹了兩種失效場景,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-05-05
Java傳入用戶名和密碼并自動提交表單實現(xiàn)登錄到其他系統(tǒng)的實例代碼
這篇文章主要介紹了Java傳入用戶名和密碼并自動提交表單實現(xiàn)登錄到其他系統(tǒng),非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-01-01
java枚舉enum,根據(jù)value值獲取key鍵的操作
這篇文章主要介紹了java枚舉enum,根據(jù)value值獲取key鍵的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對的操作方法
這篇文章主要介紹了MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對的操作代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
SpringBoot RestTemplate 簡單包裝解析
這篇文章主要介紹了SpringBoot RestTemplate 簡單包裝解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08

