欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis插入數(shù)據(jù)后返回自增主鍵ID的兩種實(shí)現(xiàn)方式

 更新時(shí)間:2024年05月18日 09:31:42   作者:隨碼去  
這篇文章主要介紹了mybatis插入數(shù)據(jù)后返回自增主鍵ID的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

mybatis插入數(shù)據(jù)后返回自增主鍵ID

開發(fā)過程中我們經(jīng)常性的會(huì)用到許多的中間表,mybatis插入數(shù)據(jù)后返回自增主鍵的兩種方式,

用于數(shù)據(jù)之間的對應(yīng)和關(guān)聯(lián),這個(gè)時(shí)候我們關(guān)聯(lián)最多的就是ID,我們在一張表中插入數(shù)據(jù)后級(jí)聯(lián)增加到關(guān)聯(lián)表中,我們數(shù)值的mybatis在插入數(shù)據(jù)后返回的是插入成功的條數(shù),那么這個(gè)時(shí)候我們想要得到相應(yīng)的新增數(shù)據(jù)的ID,該怎么辦呢?

下面我們介紹二種方式來實(shí)現(xiàn),一種是在xml文件種設(shè)置屬性,另外一種就是使用注解來實(shí)現(xiàn)。

整體兩種方法流程

1.使用注解@SelectKey,繼承原生的方法insert來實(shí)現(xiàn)

這種方法是使用注解,不使用xml方法,使用繼承原生的方法insert來實(shí)現(xiàn),在注解里面寫號(hào)SQL以及每個(gè)字段綁定的變量即可。

注解的方法為

@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,這樣注解就生效了

在使用的時(shí)候直接用

result = getBaseMapper().insert(user);

最后也得到了這個(gè) 自增的ID,當(dāng)然了,我這個(gè)用的是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ù)后,獲取的當(dāng)前的自增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自動(dòng)生成主鍵,返回自增主鍵 insert語句

對于表的主鍵自動(dòng)生成的 insert語句 , 在不需要返回自增主鍵時(shí) , 就和普通的insert語句沒有區(qū)別 , 在需要的返回的時(shí)候 , 情況稍微有點(diǎn)不一樣 , 故在此記錄一下 . 在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)建時(shí)間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';

在使用主鍵自增的時(shí)候 ,  插入數(shù)據(jù)庫后可能需要得到自增的主鍵值 , 然后使用這個(gè)值進(jìn)行一些其他的操作 .

有些數(shù)據(jù)庫提供主鍵自增(MYSQL , SQLSERVER) , 有些不提供(ORACLE) , 而是使用序列得到一個(gè)值 , 然后將這個(gè)值賦給 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會(huì)使用JDBC的getGeneratedKeys方法取出由數(shù)據(jù)庫內(nèi)部生成的主鍵 .

獲得主鍵值之后將其賦給keyProperty配置的 id 屬性 .

當(dāng)需要設(shè)置多個(gè)屬性時(shí) , 使用逗號(hào)隔開 , 這種情況下 還需要配置 keyColumn屬性 , 按順序指定數(shù)據(jù)庫的列 , 這里列的值會(huì)和 keyProperty 配置的屬性一一對應(yīng) .

由于要使用數(shù)據(jù)庫返回的主鍵值 , 所以SQL上下兩部分的列中去掉了 id 列和對于的 #{id} 屬性

  • 1.2返回非自增主鍵

采用 <selectKey>標(biāo)簽獲取主鍵的值 , 這種方式對提供和不提供主鍵自增功能的數(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標(biāo)簽的 keyColumn,keyProperty和上面useGeneratedKeys的用法和含義一樣 , 這里的resultType用于設(shè)置返回值類型.

order 屬性和數(shù)據(jù)庫相關(guān) , 在MYSQL 中 , order是AFTER , 因?yàn)楫?dāng)前及記錄的主鍵值在insert語句執(zhí)行成功之后才能拿到 , 而在ORACLE中,oder是BEFORE , 因?yàn)镺RACLE需要先從序列取到值 , 再將其作為主鍵插入到數(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 注解之外 , 多了一個(gè) @Option 注解 , 在這個(gè)注解上配置了useGeneratedKeys 和 keyProperty屬性,用法和 XML 的方式一樣 , 當(dāng)需要配置多個(gè)列的時(shí)候 , 這個(gè)注解也提供了 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時(shí) , 功能和order = before一樣 , before = false時(shí), 功能和order = after一樣

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的方法詳解

    Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的方法詳解

    簡單說,ElasticSearch(簡稱 ES)是搜索引擎,是結(jié)構(gòu)化數(shù)據(jù)的分布式搜索引擎。下面這篇文章主要給大家介紹了關(guān)于Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-05-05
  • SpringBoot中最常用的5個(gè)內(nèi)置對象使用方法

    SpringBoot中最常用的5個(gè)內(nèi)置對象使用方法

    這篇文章主要給大家介紹了關(guān)于SpringBoot中最常用的5個(gè)內(nèi)置對象使用的相關(guān)資料,在學(xué)習(xí)springboot的過程中,發(fā)現(xiàn)了springboot非常多的優(yōu)點(diǎn)和特性,需要的朋友可以參考下
    2023-08-08
  • Java利用Hutool-Script封裝JS腳本執(zhí)行

    Java利用Hutool-Script封裝JS腳本執(zhí)行

    在?Java?開發(fā)中,有時(shí)需要?jiǎng)討B(tài)執(zhí)行腳本代碼,比如?JavaScript?腳本,來實(shí)現(xiàn)一些靈活的業(yè)務(wù)邏輯,下面我們就來看看如何利用Hutool-Script模塊對Java的腳本執(zhí)行功能進(jìn)行封裝吧
    2025-02-02
  • NIO深入理解FileChannel使用方法原理

    NIO深入理解FileChannel使用方法原理

    這篇文章主要為大家介紹了NIO深入理解FileChannel的源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Spring?Boot在Web應(yīng)用中基于JdbcRealm安全驗(yàn)證過程

    Spring?Boot在Web應(yīng)用中基于JdbcRealm安全驗(yàn)證過程

    這篇文章主要為大家介紹了Spring?Boot在Web應(yīng)用中基于JdbcRealm安全驗(yàn)證過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-02-02
  • 使用SpringBoot簡單了解Druid的監(jiān)控系統(tǒng)的配置方法

    使用SpringBoot簡單了解Druid的監(jiān)控系統(tǒng)的配置方法

    這篇文章主要介紹了使用SpringBoot簡單了解Druid的監(jiān)控系統(tǒng)的配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Spring中注解方式的異步請求

    Spring中注解方式的異步請求

    今天給大家整理了Spring中注解方式的異步請求的知識(shí)點(diǎn),對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 如何通過zuul添加或修改請求參數(shù)

    如何通過zuul添加或修改請求參數(shù)

    這篇文章主要介紹了如何通過zuul添加或修改請求參數(shù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java list去重操作實(shí)現(xiàn)方式

    java list去重操作實(shí)現(xiàn)方式

    本文主要介紹了java list 去重的方法,其中有帶類型寫法和不帶類型寫法,并舉例測試,具有一定參考借鑒價(jià)值,希望能對有需要的小伙伴有所幫助
    2016-07-07
  • RocketMQTemplate 注入失敗的解決

    RocketMQTemplate 注入失敗的解決

    這篇文章主要介紹了RocketMQTemplate 注入失敗的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論