乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      (六) MyBatis從入門到入土——主鍵的獲取

       行者花雕 2021-05-03

      這是mybatis系列第六篇。沒看前文的建議先去【Java冢狐】公眾號(hào)中查看前文,方便理解和掌握。

      前面五篇把MyBatis的基本用法基本介紹完畢了,強(qiáng)烈推薦大家先把前面五篇看完實(shí)際操作完再來(lái)看接下來(lái)的內(nèi)容。

      增刪改返回值說(shuō)明

      mybatis中對(duì)db執(zhí)行增刪改操作,不管是新增、刪除、還是修改,其本質(zhì)都是使用jdbc中對(duì)應(yīng)的方法,即java.sql.Statement的executeUpdate的方法,或者java.sql.PreparedStatement的executeUpdate方法。

      所以問(wèn)題的關(guān)鍵在于掌握這兩個(gè)方法的內(nèi)容,而這兩個(gè)方法的參數(shù)不一致但是返回值都是int,用來(lái)表示影響的行數(shù)。

      而Mybatis的返回值再支持int的基礎(chǔ)上,還支持Integer、long、Long、boolean、Boolean、void多種類型,可謂是大大加強(qiáng)了編程的靈活性和多樣性。

      但是聰明的小伙伴肯定知道,MyBatis能支持這么多種的類型,其實(shí)就是mybatis在內(nèi)部將int類型轉(zhuǎn)換成其他類型而已。沒有什么高深的東西、

      了解了增刪改查的返回值后,下一步我們?cè)偃タ匆豢磈dbc和mybatis是如何獲取主鍵的。

      jdbc獲取主鍵的幾種方式

      在聊jdbc獲取主鍵的方式之前,我們先來(lái)回想一下數(shù)據(jù)庫(kù)的主鍵是怎么樣生成的。

      那mysql舉例:在mysql中當(dāng)我們向表中插入數(shù)據(jù)的時(shí)候,如果不指定主鍵(id),那么mysql會(huì)自動(dòng)生成id,但是在一些業(yè)務(wù)中我們后續(xù)會(huì)需要這個(gè)id,此時(shí)我們就要想辦法去獲取這個(gè)id,尤其是這種自動(dòng)生成的自增id。

      要想要清楚的了解,就需要先看看jdbc是如何實(shí)現(xiàn)的

      方式1:jdbc內(nèi)置的方式

      用法

      獲取主鍵的需求,jdbc的開發(fā)人員就已經(jīng)想到了,并且也開發(fā)了相應(yīng)的api來(lái)幫助我們編程,具體看 java.sql.Statement類中的getGeneratedKeys方法

      從這個(gè)方法中我們得知這個(gè)方法會(huì)返回一個(gè)結(jié)果集,從這個(gè)結(jié)果集中可以獲取自增主鍵的值。但是在使用這個(gè)方法有個(gè)前提,那就是執(zhí)行sql的時(shí)候需要做一個(gè)設(shè)置。

      如果是通過(guò)java.sql.Statement執(zhí)行sql,需要調(diào)用下面這個(gè)方法:

      int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException
      

      注意上面這個(gè)方法的第二個(gè)參數(shù)需要設(shè)置為java.sql.Statement.RETURN_GENERATED_KEYS,表示需要返回自增列的值。

      不過(guò)多數(shù)情況下,我們會(huì)使用java.sql.PreparedStatement對(duì)象來(lái)執(zhí)行sql,如果想獲取自增值,創(chuàng)建這個(gè)對(duì)象需要設(shè)置第2個(gè)參數(shù)的值,如下:

      PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
      

      然后我們就可以通過(guò)getGeneratedKeys返回的ResultSet對(duì)象獲取自動(dòng)增長(zhǎng)的值了,如下:

      ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
      if (generatedKeys!=null && generatedKeys.next()) {
          log.info("自增值為:{}", generatedKeys.getInt(1));
      }
      

      方式2:插入之后查詢獲取

      用法

      當(dāng)然除了jdbc想到了我們這個(gè)需求,mysql數(shù)據(jù)庫(kù)也想到了這個(gè)需求也有對(duì)應(yīng)的語(yǔ)句來(lái)幫助我們?cè)诓迦霐?shù)據(jù)后獲取最新插入記錄的id值,如下所示

      SELECT LAST_INSERT_ID()
      

      所以我們可以在插入之后,立即使用當(dāng)前連接發(fā)送上面這條sql去獲取自增列的值就可以。這種方法相對(duì)來(lái)說(shuō)十分的簡(jiǎn)單和方便,但是也存在著一些問(wèn)題,就是在高并發(fā)多線程的情況 ,可能會(huì)出現(xiàn)嚴(yán)重的問(wèn)題,所以一般來(lái)說(shuō)不建議使用。

      方式3:插入之前獲取

      最后一種方法就是在插入之前獲取。

      oracle不知道大家有沒有玩過(guò),oracle中沒有mysql中自動(dòng)增長(zhǎng)列,但是oracle有個(gè)功能可以實(shí)現(xiàn)自動(dòng)增長(zhǎng),這個(gè)功能就是序列,序列就相當(dāng)于一個(gè)自增器一樣,有個(gè)初始值,每次遞增的步長(zhǎng),當(dāng)然這個(gè)序列提供了一些功能給我們使用,可以獲取序列的當(dāng)前值、下一個(gè)值,使用方式如下:

      • 先定義一個(gè)序列
      • 獲取下一個(gè)值:SELECT 序列名.NEXTVAL FROM dual;

      mybatis獲取主鍵的3種方式

      既然jdbc有三種方法,那么mybatis也有相應(yīng)的幾種方法。

      方式1:內(nèi)部使用jdbc內(nèi)置的方式

      用法

      mybatis這個(gè)方式內(nèi)部采用的是上面說(shuō)的jdbc內(nèi)置的方式。

      我們需要在Mapper xml中進(jìn)行配置,如:

      <insert id="insertUser1" parameterType="zhonghu.mybatis.chat01.UserModel" useGeneratedKeys="true" keyProperty="id">
          <![CDATA[
          INSERT INTO user (name,age,salary) VALUES (#{name},#{age},#{salary})
           ]]>
      </insert>
      

      有2個(gè)關(guān)鍵參數(shù)必須要設(shè)置:

      • useGeneratedKeys:設(shè)置為true
      • keyProperty:參數(shù)對(duì)象中的屬性名稱,最后插入成功之后,mybatis會(huì)通過(guò)反射將自增值設(shè)置給keyProperty指定的這個(gè)屬性

      方式2:插入后查詢獲取主鍵

      用法

      這個(gè)方式和上面介紹的jdbc的第二種方式一樣,插入之后通過(guò)查詢獲取主鍵的值然后填充給指定的屬性,mapper xml配置如下:

      <insert id="insertUser2" parameterType="zhonghu.mybatis.chat01.UserModel">
          <selectKey keyProperty="id" order="AFTER" resultType="long">
          <![CDATA[
          SELECT LAST_INSERT_ID()
           ]]>
          </selectKey>
          <![CDATA[
          INSERT INTO user (name,age,salary) VALUES (#{name},#{age},#{salary})
           ]]>
      </insert>
      

      關(guān)鍵代碼是selectKey元素包含的部分,這個(gè)元素內(nèi)部可以包含一個(gè)sql,這個(gè)sql可以在插入之前或者插入之后運(yùn)行(之前還是之后通過(guò)order屬性配置),然后會(huì)將sql運(yùn)行的結(jié)果設(shè)置給keyProperty指定的屬性,selectKey元素有3個(gè)屬性需要指定:

      • keyProperty:參數(shù)對(duì)象中的屬性名稱,最后插入成功之后,mybatis會(huì)通過(guò)反射將自增值設(shè)置給keyProperty指定的這個(gè)屬性
      • order:指定selectKey元素中的sql是在插入之前運(yùn)行還是插入之后運(yùn)行,可選值(BEFORE|AFTER),這種方式中我們選擇AFTER
      • resultType:keyProperty指定的屬性對(duì)應(yīng)的類型,如上面的id對(duì)應(yīng)的類型是java.lang.Long,我們直接寫的是別名long

      方式3:插入前查詢獲取主鍵

      用法

      這個(gè)方式和上面介紹的jdbc的第3種方式一樣,會(huì)在插入之前先通過(guò)一個(gè)查詢獲取主鍵的值然后填充給指定的屬性,然后在執(zhí)行插入,mapper xml配置如下:

      <insert id="insertUser3" parameterType="zhonghu.mybatis.chat01.UserModel">
          <selectKey keyProperty="id" order="BEFORE" resultType="long">
          <![CDATA[ 獲取主鍵的select語(yǔ)句 ]]>
          </selectKey>
          <![CDATA[
          INSERT INTO user (name,age,salary) VALUES (#{name},#{age},#{salary})
           ]]>
      </insert>
      

      關(guān)鍵代碼是selectKey元素包含的部分,這個(gè)元素內(nèi)部可以包含一個(gè)sql,這個(gè)sql可以在插入之前或者插入之后運(yùn)行(之前還是之后通過(guò)order屬性配置),然后會(huì)將sql運(yùn)行的結(jié)果設(shè)置給keyProperty指定的屬性,selectKey元素有3個(gè)屬性需要指定:

      • keyProperty:參數(shù)對(duì)象中的屬性名稱,最后插入成功之后,mybatis會(huì)通過(guò)反射將自增值設(shè)置給keyProperty指定的這個(gè)屬性
      • order:指定selectKey元素中的sql是在插入之前運(yùn)行還是插入之后運(yùn)行,可選值(BEFORE|AFTER),這種方式中我們選擇BEFORE
      • resultType:keyProperty指定的屬性對(duì)應(yīng)的類型,如上面的id對(duì)應(yīng)的類型是java.lang.Long,我們直接寫的是別名long

      總結(jié)

      本篇文章著重介紹了mybatis中一些增刪改查的高級(jí)使用方法,尤其是獲取主鍵的方法,在此進(jìn)行了jdbc和mybatis對(duì)比介紹了三種方法。

      最后

      • 如果覺得看完有收獲,希望能關(guān)注一下,順便給我點(diǎn)個(gè)贊,這將會(huì)是我更新的最大動(dòng)力,感謝各位的支持
      • 歡迎各位關(guān)注我的公眾號(hào)【java冢狐】,專注于java和計(jì)算機(jī)基礎(chǔ)知識(shí),保證讓你看完有所收獲,不信你打我
      • 求一鍵三連:點(diǎn)贊、轉(zhuǎn)發(fā)、在看。
      • 如果看完有不同的意見或者建議,歡迎多多評(píng)論一起交流。感謝各位的支持以及厚愛。

      ——我是冢狐,和你一樣熱愛編程。

      歡迎關(guān)注公眾號(hào)“Java冢狐”獲取最新消息

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多