詳解MyBatis中主鍵回填的兩種實(shí)現(xiàn)方式
主鍵回填其實(shí)是一個非常常見的需求,特別是在數(shù)據(jù)添加的過程中,我們經(jīng)常需要添加完數(shù)據(jù)之后,需要獲取剛剛添加的數(shù)據(jù) id,無論是 Jdbc 還是各種各樣的數(shù)據(jù)庫框架都對此提供了相關(guān)的支持,本文我就來和和大家分享下數(shù)據(jù)庫主鍵回填在 MyBatis 中的兩種實(shí)現(xiàn)思路。
原生寫法
框架來源于我們學(xué)過的基礎(chǔ)知識,主鍵回填實(shí)際上是一個在 JDBC 中就被支持的寫法,有的小伙伴可能不知道這一點(diǎn),因此這里我先來說說在 JDBC 中如何實(shí)現(xiàn)主鍵回填。
JDBC 中實(shí)現(xiàn)主鍵回填其實(shí)非常容易,主要是在構(gòu)造 PreparedStatement 時指定需要主鍵回填,然后在插入成功后,查詢剛剛插入數(shù)據(jù)的 id ,示例代碼如下:
public int insert(Person person) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; con = DBUtils.getConnection(); ps = con.prepareStatement("INSERT INTO person(username,password,money) VALUES(?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS); ps.setObject(1, person.getUsername()); ps.setObject(2, person.getPassword()); ps.setObject(3, person.getMoney()); int i = ps.executeUpdate(); rs = ps.getGeneratedKeys(); int id = -1; if (rs.next()) { id = rs.getInt(1); } return id; }
和普通的插入 SQL 不同之處主要體現(xiàn)在兩個地方:
- 第一個是構(gòu)造 PreparedStatement 時,多了一個參數(shù),指定了需要主鍵回填。
- 在更新操作執(zhí)行完成之后,調(diào)用 getGeneratedKeys ,然后又會獲取到一個 ResultSet 對象,從這個游標(biāo)集中就可以獲取到剛剛插入數(shù)據(jù)的id。
這個是原生的寫法,在 MyBatis 中,對此需求提供了兩種不同的實(shí)現(xiàn)方案,下面分別來看。
框架寫法
一般情況下,主鍵有兩種生成方式:
- 主鍵自增長
- 自定義主鍵(一般可以使用UUID,或者類UUID)
如果是第二種,主鍵一般是在Java代碼中生成,然后傳入數(shù)據(jù)庫執(zhí)行插入操作,如果是第一個主鍵自增長,此時,Java 可能需要知道數(shù)據(jù)添加成功后的主鍵。
MyBatis 的基本用法就無需多說了,這也不是本文的重點(diǎn),我們還是來看看 MyBatis 中主鍵回填的兩種不同實(shí)現(xiàn)方式吧!
方式一
第一種方式比較簡單,也是松哥推薦的一種實(shí)現(xiàn)方式:
<insert id="insertBook" useGeneratedKeys="true" keyProperty="id"> insert into t_book (b_name,author) values (#{name},#{author}); </insert>
這種方式比較簡單,就是在插入節(jié)點(diǎn)上添加 useGeneratedKeys 屬性,同時設(shè)置接收回傳主鍵的屬性。配置完成后,我們執(zhí)行一個插入操作,插入時傳入一個對象,插入完成后,這個對象的 id 就會被自動賦值,值就是剛剛插入成功的id。
推薦大家使用這種方式,原因很簡單,這種方式實(shí)現(xiàn)簡便省事。
方式二
第二種方式則是利用MySQL自帶的 last_insert_id() 函數(shù)查詢剛剛插入的id,示例代碼如下:
<insert id="insertBook"> <selectKey keyProperty="id" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> insert into t_book (b_name,author) values (#{name},#{author}); </insert>
這種方式是在 insert 節(jié)點(diǎn)中添加 selectKey 來實(shí)現(xiàn)主鍵回填,實(shí)際上這種方式的功能更加豐富,因?yàn)?selectKey 節(jié)點(diǎn)中的 SQL 我們既可以在插入之前執(zhí)行,也可以在插入之后執(zhí)行(通過設(shè)置節(jié)點(diǎn)的 Order 屬性為 AFTER 或者 BEFORE 可以實(shí)現(xiàn)),具體什么時候執(zhí)行,還是要看具體的需求,如果是做主鍵回填,我們當(dāng)然需要在插入 SQL 執(zhí)行之后執(zhí)行 selectKey 節(jié)點(diǎn)中的 SQL。
注意第二種方式一樣也要通過設(shè)置 keyProperty 來指定將查詢到的數(shù)據(jù)綁定到哪個屬性上。
總結(jié)
好了,本文向大家介紹了 MyBatis 中主鍵回填的兩種方式,大家有沒有 get 到呢?有問題歡迎留言討論。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- mybatis-plus指定字段模糊查詢的實(shí)現(xiàn)方法
- springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁并帶條件模糊查詢功能
- MyBatis中模糊查詢使用CONCAT('%',#{str},'%')出錯的解決
- Mybatis?mysql模糊查詢方式(CONCAT多個字段)及bug
- mybatis?使用concat?模糊查詢方式
- Java Fluent Mybatis 聚合查詢與apply方法詳解流程篇
- mybatis多層嵌套resultMap及返回自定義參數(shù)詳解
- Mybatis insert方法主鍵回填和自定義操作
- Mybatis模糊查詢之三種定義參數(shù)方法和聚合查詢、主鍵回填實(shí)現(xiàn)方法
相關(guān)文章
Spring Security實(shí)現(xiàn)動態(tài)路由權(quán)限控制方式
這篇文章主要介紹了Spring Security實(shí)現(xiàn)動態(tài)路由權(quán)限控制方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08二叉樹基本操作之遞歸和非遞歸遍歷、分支節(jié)點(diǎn)數(shù)詳解
這篇文章主要介紹了二叉樹基本操作之遞歸和非遞歸遍歷、分支節(jié)點(diǎn)數(shù)詳解,二叉樹是由n(n>=0)個結(jié)點(diǎn)的有限集合構(gòu)成,此集合或者為空集,或者由一個根結(jié)點(diǎn)及兩棵互不相交的左右子樹組成,并且左右子樹都是二叉樹,需要的朋友可以參考下2023-09-09Spring?Cloud?OpenFeign模版化客戶端搭建過程
OpenFeign是一個顯示聲明式的WebService客戶端。使用OpenFeign能讓編寫Web Service客戶端更加簡單,這篇文章主要介紹了Spring?Cloud?OpenFeign模版化客戶端,需要的朋友可以參考下2022-06-06