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

Mybatis插入數(shù)據(jù)后自增id獲取方式

 更新時(shí)間:2024年09月20日 16:30:51   作者:二掌柜,酒來!  
在MyBatis中,獲取自增主鍵可以通過useGeneratedKeys屬性或selectKey節(jié)點(diǎn)實(shí)現(xiàn),useGeneratedKeys設(shè)置時(shí),需設(shè)置keyProperty指定主鍵字段,數(shù)據(jù)庫表也要相應(yīng)設(shè)置,selectKey節(jié)點(diǎn)可在插入操作后,通過特定SQL查詢獲得主鍵

需求

我們需要把插入數(shù)據(jù)后的id(有數(shù)據(jù)庫自增主鍵生成)返回來,以便我們下一次操作。

like this

/**
 * 測試插入后獲取id
 */
@Test
public void testinsertStudentCacheId(){
    Student student=new Student("helloworld",17,85);
    System.out.println("插入前:student="+student);
    dao.insertStudentCacheId(student);
    System.out.println("插入后:student id="+student.getId());
}

了解一下mybatis基本信息

mybatis 可配置的屬性

<?xml version="1.0" encoding="UTF-8" ?>   
<!DOCTYPE mapper   
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"  
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> 

<!-- mapper 為根元素節(jié)點(diǎn), 一個(gè)namespace對(duì)應(yīng)一個(gè)dao -->
<!-- 
Mapper元素只有一個(gè)屬性namespace,它有兩個(gè)作用:`一是用于區(qū)分不同的mapper`(在不同的mapper文件里,子元素的id可以相同,mybatis通過namespace和子元素的id聯(lián)合區(qū)分),`二是與接口關(guān)聯(lián)`(應(yīng)用程序通過接口訪問mybatis時(shí),mybatis通過接口的完整名稱查找對(duì)應(yīng)的mapper配置,因此namespace的命名務(wù)必小心一定要某接口同名)。
-->
<mapper namespace="com.dy.dao.UserDao">
    
    <!-- 
    cache- 配置本定命名空間的緩存。
        type- cache實(shí)現(xiàn)類,默認(rèn)為PERPETUAL,可以使用自定義的cache實(shí)現(xiàn)類(別名或完整類名皆可)
        eviction- 回收算法,默認(rèn)為LRU,可選的算法有:
            LRU– 最近最少使用的:移除最長時(shí)間不被使用的對(duì)象。
            FIFO– 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來移除它們。
            SOFT– 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對(duì)象。
            WEAK– 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對(duì)象。
        flushInterval- 刷新間隔,默認(rèn)為1個(gè)小時(shí),單位毫秒
        size- 緩存大小,默認(rèn)大小1024,單位為引用數(shù)
        readOnly- 只讀
    -->
    <cache type="PERPETUAL" eviction="LRU" flushInterval="60000"  
        size="512" readOnly="true" />
    
    <!-- 
    cache-ref–從其他命名空間引用緩存配置。
        如果你不想定義自己的cache,可以使用cache-ref引用別的cache。因?yàn)槊總€(gè)cache都以namespace為id,所以cache-ref只需要配置一個(gè)namespace屬性就可以了。需要注意的是,如果cache-ref和cache都配置了,以cache為準(zhǔn)。
    -->
    <cache-ref namespace="com.someone.application.data.SomeMapper"/>
    
    <insert
      <!-- 1. id (必須配置)
        id是命名空間中的唯一標(biāo)識(shí)符,可被用來代表這條語句。 
        一個(gè)命名空間(namespace) 對(duì)應(yīng)一個(gè)dao接口, 
        這個(gè)id也應(yīng)該對(duì)應(yīng)dao里面的某個(gè)方法(相當(dāng)于方法的實(shí)現(xiàn)),因此id 應(yīng)該與方法名一致 -->
      
      id="insertUser"
      
      <!-- 2. parameterType (可選配置, 默認(rèn)為mybatis自動(dòng)選擇處理)
        將要傳入語句的參數(shù)的完全限定類名或別名, 如果不配置,mybatis會(huì)通過ParameterHandler 根據(jù)參數(shù)類型默認(rèn)選擇合適的typeHandler進(jìn)行處理
        parameterType 主要指定參數(shù)類型,可以是int, short, long, string等類型,也可以是復(fù)雜類型(如對(duì)象) -->
      
      parameterType="com.demo.User"
      
      <!-- 3. flushCache (可選配置,默認(rèn)配置為true)
        將其設(shè)置為 true,任何時(shí)候只要語句被調(diào)用,都會(huì)導(dǎo)致本地緩存和二級(jí)緩存都會(huì)被清空,默認(rèn)值:true(對(duì)應(yīng)插入、更新和刪除語句) -->
      
      flushCache="true"
      
      <!-- 4. statementType (可選配置,默認(rèn)配置為PREPARED)
        STATEMENT,PREPARED 或 CALLABLE 的一個(gè)。這會(huì)讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認(rèn)值:PREPARED。 -->
      
      statementType="PREPARED"
      
      <!-- 5. keyProperty (可選配置, 默認(rèn)為unset)
        (僅對(duì) insert 和 update 有用)唯一標(biāo)記一個(gè)屬性,MyBatis 會(huì)通過 getGeneratedKeys 的返回值或者通過 insert 語句的 selectKey 子元素設(shè)置它的鍵值,默認(rèn):unset。如果希望得到多個(gè)生成的列,也可以是逗號(hào)分隔的屬性名稱列表。 -->
      
      keyProperty=""
      
      <!-- 6. keyColumn     (可選配置)
        (僅對(duì) insert 和 update 有用)通過生成的鍵值設(shè)置表中的列名,這個(gè)設(shè)置僅在某些數(shù)據(jù)庫(像 PostgreSQL)是必須的,當(dāng)主鍵列不是表中的第一列的時(shí)候需要設(shè)置。如果希望得到多個(gè)生成的列,也可以是逗號(hào)分隔的屬性名稱列表。 -->
      
      keyColumn=""
      
      <!-- 7. useGeneratedKeys (可選配置, 默認(rèn)為false)
        (僅對(duì) insert 和 update 有用)這會(huì)令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關(guān)系數(shù)據(jù)庫管理系統(tǒng)的自動(dòng)遞增字段),默認(rèn)值:false。  -->
      
      useGeneratedKeys="false"
      
      <!-- 8. timeout  (可選配置, 默認(rèn)為unset, 依賴驅(qū)動(dòng))
        這個(gè)設(shè)置是在拋出異常之前,驅(qū)動(dòng)程序等待數(shù)據(jù)庫返回請(qǐng)求結(jié)果的秒數(shù)。默認(rèn)值為 unset(依賴驅(qū)動(dòng))。 -->
      timeout="20">

    <update
      id="updateUser"
      parameterType="com.demo.User"
      flushCache="true"
      statementType="PREPARED"
      timeout="20">

    <delete
      id="deleteUser"
      parameterType="com.demo.User"
      flushCache="true"
      statementType="PREPARED"
      timeout="20">
</mapper>

很明顯啊,keyProperty、keyColumn、useGeneratedKeys 這個(gè)三個(gè)屬性就是我們實(shí)現(xiàn)需求的切入點(diǎn)

開始實(shí)現(xiàn)

方法一 useGeneratedKeys 設(shè)置主鍵自增

    <insert id="insertStudentCacheId" useGeneratedKeys="true" keyProperty="id" parameterType="Student">
        insert into student(name,age,score) values(#{name},#{age},#{score})
    </insert>

需要注意的地方:

  • useGeneratedKeys="true"表示設(shè)置屬性自增,數(shù)據(jù)庫表字段需要設(shè)置
  • keyProperty="id"設(shè)置主鍵的字段
  • parameterType="Student"設(shè)置傳入的類型
  • 注意:雖然有返回類型,但是我們不需要手動(dòng)設(shè)置返回的類型,這個(gè)是由框架幫我們實(shí)現(xiàn)的,所以對(duì)應(yīng)的接口方法也是沒有返回值的,會(huì)自動(dòng)修改我們插入的對(duì)象,設(shè)置id值。所以mapper返回值是影響行數(shù)。
  • 實(shí)體類中id屬性字段一定需要set以及get方法

方法二 selectKey 查詢主鍵

selectKey 介紹

<selectKey
        <!-- selectKey 語句結(jié)果應(yīng)該被設(shè)置的目標(biāo)屬性。如果希望得到多個(gè)生成的列,也可以是逗號(hào)分隔的屬性名稱列表。 -->
        keyProperty="id"
        <!-- 結(jié)果的類型。MyBatis 通??梢酝扑愠鰜恚菫榱烁哟_定寫上也不會(huì)有什么問題。MyBatis 允許任何簡單類型用作主鍵的類型,包括字符串。如果希望作用于多個(gè)生成的列,則可以使用一個(gè)包含期望屬性的 Object 或一個(gè) Map。 -->
        resultType="int"
        <!-- 這可以被設(shè)置為 BEFORE 或 AFTER。如果設(shè)置為 BEFORE,那么它會(huì)首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語句。如果設(shè)置為 AFTER,那么先執(zhí)行插入語句,然后是 selectKey 元素 - 這和像 Oracle 的數(shù)據(jù)庫相似,在插入語句內(nèi)部可能有嵌入索引調(diào)用。 -->
        order="BEFORE"
        <!-- 與前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 語句的映射類型,分別代表 PreparedStatement 和 CallableStatement 類型。 -->
        statementType="PREPARED">
  • selectKey給了你一個(gè)簡單的行為在你的數(shù)據(jù)庫中來處理自動(dòng)生成的主鍵,而不需要使你的Java代碼變得復(fù)雜。
  • selectKey節(jié)點(diǎn)生成的KeyGenerator優(yōu)先級(jí)高于statement節(jié)點(diǎn)的useGeneratedKeys屬性生成的KeyGenerator對(duì)象,也就是說配置了SelectKey子節(jié)點(diǎn)就不需要再配置useGeneratedKeys屬性了。

獲取主鍵操作

    <insert id="insertStudentCacheId" parameterType="Student">
        insert into student(name,age,score) values(#{name},#{age},#{score})
        <!-- 指定結(jié)果類型resultType,keyProperty是屬性,自動(dòng)返回到屬性id中,order是次序,after是指獲取id是在于插入后 -->
        <selectKey resultType="int" keyProperty="id" order="AFTER">
            select @@identity
        </selectKey>
    </insert>

或者

    <insert id="insertStudentCacheId" parameterType="Student">
        insert into student(name,age,score) values(#{name},#{age},#{score})
        <!-- 指定結(jié)果類型resultType,keyProperty是屬性,自動(dòng)返回到屬性id中,order是次序,after是指獲取id是在于插入后 -->
        <selectKey resultType="int" keyProperty="id" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
    </insert>

注意要點(diǎn):

  • 最外層的沒有返回屬性(resultType),但是里面的是有返回值類型的。
  • order="AFTER"表示先執(zhí)行插入,之后才執(zhí)行selectkey語句的。
  • select @@identity和select LAST_INSERT_ID()都表示選出剛剛插入的最后一條數(shù)據(jù)的id。
  • 實(shí)體類中id屬性字段一定需要set以及get方法
  • 此時(shí),接口中仍不需要有返回值,框架會(huì)自動(dòng)將值注入到我們insert的那個(gè)對(duì)象中,我們可以直接使用就可以了。

同樣,我們的接口中可以有返回值,但是這個(gè)返回值不是id,而是表示插入后影響的行數(shù),此時(shí)sql中仍和上面一樣,不需要寫返回值。

總結(jié)

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

相關(guān)文章

  • Java實(shí)現(xiàn)企業(yè)發(fā)放的獎(jiǎng)金根據(jù)利潤提成問題

    Java實(shí)現(xiàn)企業(yè)發(fā)放的獎(jiǎng)金根據(jù)利潤提成問題

    這篇文章主要介紹了請(qǐng)利用數(shù)軸來分界,定位。注意定義時(shí)需把獎(jiǎng)金定義成長整型,需要的朋友可以參考下
    2017-02-02
  • springboot+vue實(shí)現(xiàn)阿里云oss大文件分片上傳的示例代碼

    springboot+vue實(shí)現(xiàn)阿里云oss大文件分片上傳的示例代碼

    阿里云推出了直傳,本文主要介紹了springboot+vue實(shí)現(xiàn)阿里云oss大文件分片上傳的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Java集合包中的fail fast機(jī)制詳解

    Java集合包中的fail fast機(jī)制詳解

    這篇文章主要介紹了Java集合包中的fail fast機(jī)制詳解,當(dāng)我們使用iterator迭代器遍歷一個(gè)集合的過程中,如果其它線程,或者它自己向這個(gè)集合新增或刪除了一個(gè)key-value,那么當(dāng)前線程就會(huì)拋出ConcurrentModificationException異常,需要的朋友可以參考下
    2023-12-12
  • java線程之用Thread類創(chuàng)建線程的方法

    java線程之用Thread類創(chuàng)建線程的方法

    本篇文章介紹了,Thread類創(chuàng)建線程的方法。需要的朋友參考下
    2013-05-05
  • Java可視化之實(shí)現(xiàn)文本的加密和解密

    Java可視化之實(shí)現(xiàn)文本的加密和解密

    這篇文章主要介紹了Java可視化之實(shí)現(xiàn)文本的加密和解密,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • spring的IoC和DI詳解

    spring的IoC和DI詳解

    這篇文章主要介紹了spring的IoC和DI詳解,還是挺不錯(cuò)的,這里分享給加,需要的朋友可以參考下。
    2017-11-11
  • ElasticSearch學(xué)習(xí)之Es索引Api操作

    ElasticSearch學(xué)習(xí)之Es索引Api操作

    這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之Es索引Api操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • SpringBoot中controller深層詳細(xì)講解

    SpringBoot中controller深層詳細(xì)講解

    這篇文章主要介紹了SpringBoot在Controller層接收參數(shù)的常用方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 在idea環(huán)境下構(gòu)建springCloud項(xiàng)目

    在idea環(huán)境下構(gòu)建springCloud項(xiàng)目

    本篇文章主要介紹了在idea環(huán)境下構(gòu)建springCloud項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • 一文詳解Mybatis-plus的介紹與使用

    一文詳解Mybatis-plus的介紹與使用

    Mybatis-Plus?是?MyBatis?的一個(gè)增強(qiáng)工具,專門針對(duì)于傳統(tǒng)MyBatis開發(fā)中sql需要手動(dòng)進(jìn)行映射配置繁瑣缺點(diǎn)的一款框架技術(shù)。本文將為大家詳細(xì)講講Mybatis-plus的介紹與使用,感興趣的可以了解一下
    2022-07-07

最新評(píng)論