最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解MyBatis中主鍵回填的兩種實(shí)現(xiàn)方式

 更新時(shí)間:2019年04月24日 09:29:47   作者:江南一點(diǎn)雨  
這篇文章主要介紹了詳解MyBatis中主鍵回填的兩種實(shí)現(xiàn)方式,主鍵回填其實(shí)是一個(gè)非常常見(jiàn)的需求,特別是在數(shù)據(jù)添加的過(guò)程中,我們經(jīng)常需要添加完數(shù)據(jù)之后,需要獲取剛剛添加的數(shù)據(jù) id,有興趣的可以參考一下

主鍵回填其實(shí)是一個(gè)非常常見(jiàn)的需求,特別是在數(shù)據(jù)添加的過(guò)程中,我們經(jīng)常需要添加完數(shù)據(jù)之后,需要獲取剛剛添加的數(shù)據(jù) id,無(wú)論是 Jdbc 還是各種各樣的數(shù)據(jù)庫(kù)框架都對(duì)此提供了相關(guān)的支持,本文我就來(lái)和和大家分享下數(shù)據(jù)庫(kù)主鍵回填在 MyBatis 中的兩種實(shí)現(xiàn)思路。

原生寫法

框架來(lái)源于我們學(xué)過(guò)的基礎(chǔ)知識(shí),主鍵回填實(shí)際上是一個(gè)在 JDBC 中就被支持的寫法,有的小伙伴可能不知道這一點(diǎn),因此這里我先來(lái)說(shuō)說(shuō)在 JDBC 中如何實(shí)現(xiàn)主鍵回填。

JDBC 中實(shí)現(xiàn)主鍵回填其實(shí)非常容易,主要是在構(gòu)造 PreparedStatement 時(shí)指定需要主鍵回填,然后在插入成功后,查詢剛剛插入數(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è)地方:

  • 第一個(gè)是構(gòu)造 PreparedStatement 時(shí),多了一個(gè)參數(shù),指定了需要主鍵回填。
  • 在更新操作執(zhí)行完成之后,調(diào)用 getGeneratedKeys ,然后又會(huì)獲取到一個(gè) ResultSet 對(duì)象,從這個(gè)游標(biāo)集中就可以獲取到剛剛插入數(shù)據(jù)的id。

這個(gè)是原生的寫法,在 MyBatis 中,對(duì)此需求提供了兩種不同的實(shí)現(xiàn)方案,下面分別來(lái)看。

框架寫法

一般情況下,主鍵有兩種生成方式:

  1. 主鍵自增長(zhǎng)
  2. 自定義主鍵(一般可以使用UUID,或者類UUID)

如果是第二種,主鍵一般是在Java代碼中生成,然后傳入數(shù)據(jù)庫(kù)執(zhí)行插入操作,如果是第一個(gè)主鍵自增長(zhǎng),此時(shí),Java 可能需要知道數(shù)據(jù)添加成功后的主鍵。

MyBatis 的基本用法就無(wú)需多說(shuō)了,這也不是本文的重點(diǎn),我們還是來(lái)看看 MyBatis 中主鍵回填的兩種不同實(shí)現(xiàn)方式吧!

方式一

第一種方式比較簡(jiǎn)單,也是松哥推薦的一種實(shí)現(xiàn)方式:

<insert id="insertBook" useGeneratedKeys="true" keyProperty="id">
  insert into t_book (b_name,author) values (#{name},#{author});
</insert>

這種方式比較簡(jiǎn)單,就是在插入節(jié)點(diǎn)上添加 useGeneratedKeys 屬性,同時(shí)設(shè)置接收回傳主鍵的屬性。配置完成后,我們執(zhí)行一個(gè)插入操作,插入時(shí)傳入一個(gè)對(duì)象,插入完成后,這個(gè)對(duì)象的 id 就會(huì)被自動(dòng)賦值,值就是剛剛插入成功的id。

推薦大家使用這種方式,原因很簡(jiǎn)單,這種方式實(shí)現(xiàn)簡(jiǎ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 來(lái)實(shí)現(xiàn)主鍵回填,實(shí)際上這種方式的功能更加豐富,因?yàn)?selectKey 節(jié)點(diǎn)中的 SQL 我們既可以在插入之前執(zhí)行,也可以在插入之后執(zhí)行(通過(guò)設(shè)置節(jié)點(diǎn)的 Order 屬性為 AFTER 或者 BEFORE 可以實(shí)現(xiàn)),具體什么時(shí)候執(zhí)行,還是要看具體的需求,如果是做主鍵回填,我們當(dāng)然需要在插入 SQL 執(zhí)行之后執(zhí)行 selectKey 節(jié)點(diǎn)中的 SQL。

注意第二種方式一樣也要通過(guò)設(shè)置 keyProperty 來(lái)指定將查詢到的數(shù)據(jù)綁定到哪個(gè)屬性上。

總結(jié)

好了,本文向大家介紹了 MyBatis 中主鍵回填的兩種方式,大家有沒(méi)有 get 到呢?有問(wèn)題歡迎留言討論。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java使用雪花id生成算法詳解

    Java使用雪花id生成算法詳解

    SnowFlake算法,是Twitter開(kāi)源的分布式id生成算法,在2014年開(kāi)源,開(kāi)源的版本由scala編寫。其核心思想就是-使用一個(gè)64bit的long型的數(shù)字作為全局唯一id
    2022-12-12
  • Spring MVC 攔截器實(shí)現(xiàn)代碼

    Spring MVC 攔截器實(shí)現(xiàn)代碼

    本篇文章主要介紹了Spring MVC 攔截器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Java多線程并發(fā)編程 并發(fā)三大要素

    Java多線程并發(fā)編程 并發(fā)三大要素

    這篇文章主要介紹了Java多線程并發(fā)編程 并發(fā)三大要素,需要的朋友可以參考下
    2017-05-05
  • MyBatis 如何簡(jiǎn)化的 JDBC(思路詳解)

    MyBatis 如何簡(jiǎn)化的 JDBC(思路詳解)

    MyBatis 是一個(gè) 持久層 框架,用于 簡(jiǎn)化JDBC開(kāi)發(fā),這篇文章主要介紹了MyBatis 如何簡(jiǎn)化的 JDBC(思路詳解),需要的朋友可以參考下
    2023-03-03
  • MyBatis?typeHandler接口的定義和使用

    MyBatis?typeHandler接口的定義和使用

    TypeHandler被稱作類型處理器,MyBatis在設(shè)置預(yù)處理語(yǔ)句中的參數(shù)或從結(jié)果集中取出一個(gè)值時(shí),都會(huì)用類型處理器將Java對(duì)象轉(zhuǎn)化為數(shù)據(jù)庫(kù)支持的類型或者將獲取到數(shù)據(jù)庫(kù)值以合適的方式轉(zhuǎn)換成Java類型,感興趣的同學(xué)可以參考下文
    2023-05-05
  • SpringBoot使用druid配置多數(shù)據(jù)源問(wèn)題

    SpringBoot使用druid配置多數(shù)據(jù)源問(wèn)題

    這篇文章主要介紹了SpringBoot使用druid配置多數(shù)據(jù)源問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java 中的 String對(duì)象為什么是不可變的

    Java 中的 String對(duì)象為什么是不可變的

    String對(duì)象是不可變的,但這僅意味著你無(wú)法通過(guò)調(diào)用它的公有方法來(lái)改變它的值。本文給大家介紹java中的string對(duì)象為什么是不可變的,需要的朋友一起了解了解吧
    2015-10-10
  • 淺析Java迭代器Iterator和Iterable的區(qū)別

    淺析Java迭代器Iterator和Iterable的區(qū)別

    Java語(yǔ)言中,Iterator和Iterable都是用來(lái)遍歷集合類數(shù)據(jù)結(jié)構(gòu)的接口,雖然它們有很多相似的地方,但在具體實(shí)現(xiàn)中卻有著一些不同之處,本文將詳細(xì)分析它們的區(qū)別,并提供相應(yīng)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • 關(guān)于PreparedStatement的setObject作用及說(shuō)明

    關(guān)于PreparedStatement的setObject作用及說(shuō)明

    這篇文章主要介紹了關(guān)于PreparedStatement的setObject作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot使用Mybatis-Generator配置過(guò)程詳解

    SpringBoot使用Mybatis-Generator配置過(guò)程詳解

    這篇文章主要介紹了SpringBoot使用Mybatis-Generator配置過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

封丘县| 教育| 双牌县| 吕梁市| 江西省| 内黄县| 凯里市| 威远县| 平度市| 广丰县| 安庆市| 屯留县| 亚东县| 莲花县| 福泉市| 定远县| 崇文区| 平武县| 乐平市| 阿坝县| 宝丰县| 九寨沟县| 无极县| 张家川| 镇安县| 汝城县| 西平县| 高碑店市| 罗平县| 佳木斯市| 阿拉善盟| 原平市| 屯昌县| 库尔勒市| 闻喜县| 潼关县| 潜江市| 平昌县| 黔江区| 泽普县| 阳信县|