這是mybatis系列第六篇,沒看前文的建議先去【Java冢狐】公眾號中查看前文,方便理解和掌握,
前面五篇把MyBatis的基本用法基本介紹完畢了,強烈推薦大家先把前面五篇看完實際操作完再來看接下來的內容,
增刪改回傳值說明
mybatis中對db執行增刪改操作,不管是新增、洗掉、還是修改,其本質都是使用jdbc中對應的方法,即java.sql.Statement的executeUpdate的方法,或者java.sql.PreparedStatement的executeUpdate方法,
所以問題的關鍵在于掌握這兩個方法的內容,而這兩個方法的引數不一致但是回傳值都是int,用來表示影響的行數,
而Mybatis的回傳值再支持int的基礎上,還支持Integer、long、Long、boolean、Boolean、void多種型別,可謂是大大加強了編程的靈活性和多樣性,
但是聰明的小伙伴肯定知道,MyBatis能支持這么多種的型別,其實就是mybatis在內部將int型別轉換成其他型別而已,沒有什么高深的東西、
了解了增刪改查的回傳值后,下一步我們再去看一看jdbc和mybatis是如何獲取主鍵的,
jdbc獲取主鍵的幾種方式
在聊jdbc獲取主鍵的方式之前,我們先來回想一下資料庫的主鍵是怎么樣生成的,
那mysql舉例:在mysql中當我們向表中插入資料的時候,如果不指定主鍵(id),那么mysql會自動生成id,但是在一些業務中我們后續會需要這個id,此時我們就要想辦法去獲取這個id,尤其是這種自動生成的自增id,
要想要清楚的了解,就需要先看看jdbc是如何實作的
方式1:jdbc內置的方式
用法
獲取主鍵的需求,jdbc的開發人員就已經想到了,并且也開發了相應的api來幫助我們編程,具體看 java.sql.Statement類中的getGeneratedKeys方法
從這個方法中我們得知這個方法會回傳一個結果集,從這個結果集中可以獲取自增主鍵的值,但是在使用這個方法有個前提,那就是執行sql的時候需要做一個設定,
如果是通過java.sql.Statement執行sql,需要呼叫下面這個方法:
int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException
注意上面這個方法的第二個引數需要設定為java.sql.Statement.RETURN_GENERATED_KEYS,表示需要回傳自增列的值,
不過多數情況下,我們會使用java.sql.PreparedStatement物件來執行sql,如果想獲取自增值,創建這個物件需要設定第2個引數的值,如下:
PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
然后我們就可以通過getGeneratedKeys回傳的ResultSet物件獲取自動增長的值了,如下:
ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
if (generatedKeys!=null && generatedKeys.next()) {
log.info("自增值為:{}", generatedKeys.getInt(1));
}
方式2:插入之后查詢獲取
用法
當然除了jdbc想到了我們這個需求,mysql資料庫也想到了這個需求也有對應的陳述句來幫助我們在插入資料后獲取最新插入記錄的id值,如下所示
SELECT LAST_INSERT_ID()
所以我們可以在插入之后,立即使用當前連接發送上面這條sql去獲取自增列的值就可以,這種方法相對來說十分的簡單和方便,但是也存在著一些問題,就是在高并發多執行緒的情況 ,可能會出現嚴重的問題,所以一般來說不建議使用,
方式3:插入之前獲取
最后一種方法就是在插入之前獲取,
oracle不知道大家有沒有玩過,oracle中沒有mysql中自動增長列,但是oracle有個功能可以實作自動增長,這個功能就是序列,序列就相當于一個自增器一樣,有個初始值,每次遞增的步長,當然這個序列提供了一些功能給我們使用,可以獲取序列的當前值、下一個值,使用方式如下:
- 先定義一個序列
- 獲取下一個值:SELECT 序列名.NEXTVAL FROM dual;
mybatis獲取主鍵的3種方式
既然jdbc有三種方法,那么mybatis也有相應的幾種方法,
方式1:內部使用jdbc內置的方式
用法
mybatis這個方式內部采用的是上面說的jdbc內置的方式,
我們需要在Mapper xml中進行配置,如:
<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個關鍵引數必須要設定:
- useGeneratedKeys:設定為true
- keyProperty:引數物件中的屬性名稱,最后插入成功之后,mybatis會通過反射將自增值設定給keyProperty指定的這個屬性
方式2:插入后查詢獲取主鍵
用法
這個方式和上面介紹的jdbc的第二種方式一樣,插入之后通過查詢獲取主鍵的值然后填充給指定的屬性,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>
關鍵代碼是selectKey元素包含的部分,這個元素內部可以包含一個sql,這個sql可以在插入之前或者插入之后運行(之前還是之后通過order屬性配置),然后會將sql運行的結果設定給keyProperty指定的屬性,selectKey元素有3個屬性需要指定:
- keyProperty:引數物件中的屬性名稱,最后插入成功之后,mybatis會通過反射將自增值設定給keyProperty指定的這個屬性
- order:指定selectKey元素中的sql是在插入之前運行還是插入之后運行,可選值(BEFORE|AFTER),這種方式中我們選擇AFTER
- resultType:keyProperty指定的屬性對應的型別,如上面的id對應的型別是java.lang.Long,我們直接寫的是別名long
方式3:插入前查詢獲取主鍵
用法
這個方式和上面介紹的jdbc的第3種方式一樣,會在插入之前先通過一個查詢獲取主鍵的值然后填充給指定的屬性,然后在執行插入,mapper xml配置如下:
<insert id="insertUser3" parameterType="zhonghu.mybatis.chat01.UserModel">
<selectKey keyProperty="id" order="BEFORE" resultType="long">
<![CDATA[ 獲取主鍵的select陳述句 ]]>
</selectKey>
<![CDATA[
INSERT INTO user (name,age,salary) VALUES (#{name},#{age},#{salary})
]]>
</insert>
關鍵代碼是selectKey元素包含的部分,這個元素內部可以包含一個sql,這個sql可以在插入之前或者插入之后運行(之前還是之后通過order屬性配置),然后會將sql運行的結果設定給keyProperty指定的屬性,selectKey元素有3個屬性需要指定:
- keyProperty:引數物件中的屬性名稱,最后插入成功之后,mybatis會通過反射將自增值設定給keyProperty指定的這個屬性
- order:指定selectKey元素中的sql是在插入之前運行還是插入之后運行,可選值(BEFORE|AFTER),這種方式中我們選擇BEFORE
- resultType:keyProperty指定的屬性對應的型別,如上面的id對應的型別是java.lang.Long,我們直接寫的是別名long
總結
本篇文章著重介紹了mybatis中一些增刪改查的高級使用方法,尤其是獲取主鍵的方法,在此進行了jdbc和mybatis對比介紹了三種方法,
最后
- 如果覺得看完有識訓,希望能關注一下,順便給我點個贊,這將會是我更新的最大動力,感謝各位的支持
- 歡迎各位關注我的公眾號【java冢狐】,專注于java和計算機基礎知識,保證讓你看完有所識訓,不信你打我
- 求一鍵三連:點贊、轉發、在看,
- 如果看完有不同的意見或者建議,歡迎多多評論一起交流,感謝各位的支持以及厚愛,
——我是冢狐,和你一樣熱愛編程,
歡迎關注公眾號“Java冢狐”獲取最新訊息
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259923.html
標籤:其他
