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

詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵

 更新時間:2017年01月03日 08:16:22   作者:星云博客園  
這篇文章主要介紹了詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵,有興趣的可以了解一下。

最近在搞一個電商系統(tǒng)中由于業(yè)務(wù)需求,需要在插入一條產(chǎn)品信息后返回產(chǎn)品Id,剛開始遇到一些坑,這里做下筆記,以防今后忘記。

類似下面這段代碼一樣獲取插入后的主鍵

User user = new User(); 
user.setUserName("chenzhou"); 
user.setPassword("xxxx"); 
user.setComment("測試插入數(shù)據(jù)返回主鍵功能"); 
 
System.out.println("插入前主鍵為:"+user.getUserId()); 
userDao.insertAndGetId(user);//插入操作 
System.out.println("插入后主鍵為:"+user.getUserId()); 

經(jīng)過查詢網(wǎng)上資料,發(fā)現(xiàn)大致有兩種方式。

方式一:

在實(shí)體類的映射文件 "*Mapper.xml" 這樣寫:

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
  insert into user(userName,password,comment)
  values(#{userName},#{password},#{comment})
</insert>

Tips:

useGeneratedKeys="true" 表示給主鍵設(shè)置自增長

keyProperty="userId"  表示將自增長后的Id賦值給實(shí)體類中的userId字段。

parameterType="com.chenzhou.mybatis.User" 這個屬性指向傳遞的參數(shù)實(shí)體類

這里提醒下,<insert></insert> 中沒有resultType屬性,不要亂加。

實(shí)體類中uerId 要有g(shù)etter() and setter(); 方法

由于我在MySQL數(shù)據(jù)庫中建表時候已經(jīng)設(shè)置了字段自增長,故最終我選擇了第二種方式。

第二種方式:

同樣在實(shí)體類的映射文件 "*Mapper.xml" 但是要這樣寫:

  <!-- 插入一個商品 -->
  <insert id="insertProduct" parameterType="domain.model.ProductBean" >
    <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">
     SELECT LAST_INSERT_ID()
   </selectKey>
    INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});
  </insert>

Tips:

<insert></insert> 中沒有resultType屬性,但是<selectKey></selectKey> 標(biāo)簽是有的。

order="AFTER" 表示先執(zhí)行插入語句,之后再執(zhí)行查詢語句。

可被設(shè)置為 BEFORE 或 AFTER。

如果設(shè)置為 BEFORE,那么它會首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語句。

如果設(shè)置為 AFTER,那么先執(zhí)行插入語句,然后是 selectKey 元素-這和如 Oracle 數(shù)據(jù)庫相似,可以在插入語句中嵌入序列調(diào)用
keyProperty="userId"  表示將自增長后的Id賦值給實(shí)體類中的userId字段。

SELECT LAST_INSERT_ID() 表示MySQL語法中查詢出剛剛插入的記錄自增長Id.

實(shí)體類中uerId 要有g(shù)etter() and setter(); 方法

實(shí)現(xiàn)需求,上面那些就足夠了。

這里如果有興趣的,請繼續(xù)聽我講一個Mybatis中可能誤入的坑。

為什么Mybatis 中修改添加方法為有返回值后,雖然提示插入數(shù)據(jù)庫成功并且也能讀取插入的數(shù)據(jù),但是當(dāng)你打開數(shù)據(jù)庫后就是看不到插入的數(shù)據(jù)?

如果在實(shí)現(xiàn)上述需求時,想插入后返回主鍵的話,切記不要這樣寫。

  @Override
  public Long insertProduct(ProductBean productBean) {
    // TODO Auto-generated method stub
    SqlSession session = MybatisJDBCUtil.currentSession();

    ProductIDao productIDao = session.getMapper(ProductIDao.class);// 這里*.class
                                    // 必須對應(yīng)DAO的接口層
    return productIDao.insertProduct(productBean);
    
  }

Why?

因?yàn)槿绻闶窍裆厦孢@樣寫,那么執(zhí)行后返回的也不是你想要的主鍵Id,而是執(zhí)行數(shù)據(jù)庫語句后受影響的行數(shù)。

而且,當(dāng)你執(zhí)行后你會發(fā)現(xiàn)提示插入成功,你用代碼也可以讀取出插入的數(shù)據(jù),但是永遠(yuǎn)只有一條記錄。

并且,你打開數(shù)據(jù)庫會發(fā)現(xiàn),數(shù)據(jù)庫中沒有插入成功任何數(shù)據(jù)。

我在這里郁悶了N久,終于發(fā)現(xiàn)了關(guān)鍵所在。

有返回值和沒返回值的區(qū)別在于:

有返回值的只是對數(shù)據(jù)庫只讀模式訪問數(shù)據(jù)庫,對數(shù)據(jù)庫數(shù)據(jù)不會有任何修改,比如各種方式的查詢。

無返回值的則會以讀寫模式訪問數(shù)據(jù)庫,會對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行修改,比如刪除,增加。

除此之外,根據(jù)個人理解應(yīng)該mybatis在執(zhí)行插入語句時會先緩存到構(gòu)造的一個類似session集合中,然后才去調(diào)用底層驅(qū)動去操作修改數(shù)據(jù)庫。

session.commit();    
MybatisJDBCUtil.closeSession();

沒有返回值得才有上面這兩條語句,也就是說執(zhí)行了這兩條語句才會真正執(zhí)行插入到數(shù)據(jù)庫,對數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行修改。

相反,有返回值的就沒有執(zhí)行這兩條語句,所以只是在自己構(gòu)造的session中執(zhí)行了添加語句,但是并沒有提交到數(shù)據(jù)庫中,故數(shù)據(jù)庫中是沒有任何記錄的。

這也就解釋了為什么Mybatis 中修改添加方法為有返回值后,雖然提示插入數(shù)據(jù)庫成功,但是當(dāng)你打開數(shù)據(jù)庫看不到插入的數(shù)據(jù)。

Mybatis中插入語句方法種不要有返回值,像這樣寫是正確的。

  @Override
  public void insertProduct(ProductBean productBean) {
    // TODO Auto-generated method stub
    SqlSession session = MybatisJDBCUtil.currentSession();

    ProductIDao productIDao = session.getMapper(ProductIDao.class);// 這里*.class
                                   // 必須對應(yīng)DAO的接口層
    productIDao.insertProduct(productBean);
    
    session.commit(); 
    
    MybatisJDBCUtil.closeSession();  
  }

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

相關(guān)文章

  • 微信小程序 springboot后臺如何獲取用戶的openid

    微信小程序 springboot后臺如何獲取用戶的openid

    這篇文章主要介紹了微信小程序 springboot后臺如何獲取用戶的openid,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot整合mybatis-plus快速入門超詳細(xì)教程

    SpringBoot整合mybatis-plus快速入門超詳細(xì)教程

    mybatis-plus 是一個 Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,本文給大家分享SpringBoot整合mybatis-plus快速入門超詳細(xì)教程,一起看看吧
    2021-09-09
  • SpringBoot Mybatis Plus公共字段自動填充功能

    SpringBoot Mybatis Plus公共字段自動填充功能

    這篇文章主要介紹了SpringBoot Mybatis Plus公共字段自動填充功能的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Scala方法與函數(shù)使用和定義詳解

    Scala方法與函數(shù)使用和定義詳解

    這個章節(jié)會很燒腦,需要認(rèn)真研讀,我會盡量寫的詳細(xì)一些。 方法和函數(shù),看似是兩個概念,其實(shí)他嚴(yán)格來說也是兩個概念,但我們大可以理解成是同一個概念,在使用時只有語法上的細(xì)微差別,是很類似的,都理解為function即可
    2022-12-12
  • java中的Io(input與output)操作總結(jié)(二)

    java中的Io(input與output)操作總結(jié)(二)

    這一節(jié)我們來討論關(guān)于文件自身的操作包括:創(chuàng)建文件對象、創(chuàng)建和刪除文件、文件的判斷和測試、創(chuàng)建目錄、獲取文件信息、列出文件系統(tǒng)的根目錄、列出目錄下的所有文件,等等,感興趣的朋友可以了解下
    2013-01-01
  • 淺談java中的路徑表示

    淺談java中的路徑表示

    下面小編就為大家?guī)硪黄獪\談java中的路徑表示。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • SpringBoot實(shí)現(xiàn)自動配置的示例代碼

    SpringBoot實(shí)現(xiàn)自動配置的示例代碼

    本文主要介紹了SpringBoot實(shí)現(xiàn)自動配置的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • 一文搞懂Java中的序列化與反序列化

    一文搞懂Java中的序列化與反序列化

    序列化是將對象轉(zhuǎn)換成二進(jìn)制字節(jié)流的過程;反序列化是從二進(jìn)制字節(jié)流中恢復(fù)對象的過程。文中降通過示例詳解二者的使用與區(qū)別,需要的可以參考一下
    2022-08-08
  • Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法

    Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法

    這篇文章主要介紹了Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法,主要用到了IOException類,需要的朋友可以參考下
    2016-03-03
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):循環(huán)鏈表和棧

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):循環(huán)鏈表和棧

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表、棧的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Java數(shù)據(jù)結(jié)構(gòu)中循環(huán)鏈表、棧、的功能、定義及使用方法,需要的朋友可以參考下
    2021-08-08

最新評論

阿拉善左旗| 望谟县| 博兴县| 深水埗区| 云南省| 乡城县| 盐城市| 康马县| 云林县| 抚顺县| 贵港市| 日土县| 乡城县| 安乡县| 临安市| 青河县| 黄龙县| 肇州县| 石家庄市| 双鸭山市| 柳河县| 扶余县| 乌拉特中旗| 邢台市| 尼勒克县| 凤山市| 麻城市| 澎湖县| 凌云县| 阳谷县| 大同县| 城固县| 白山市| 巨野县| 苗栗县| 汕尾市| 青浦区| 岫岩| 颍上县| 玛曲县| 瑞金市|