欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis如何通過xml方式實現(xiàn)SaveOrUpdate

 更新時間:2023年06月01日 15:57:52   作者:isea533  
這篇文章主要講如何通過xml方式實現(xiàn)SaveOrUpdate,但是仍然建議在Service中實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

MyBatis實現(xiàn)SaveOrUpdate

這篇文章主要講如何通過xml方式實現(xiàn)SaveOrUpdate,但是仍然建議在Service中實現(xiàn)。

例子

<insert id="saveOrUpdate" >
  <selectKey keyProperty="count" resultType="int" order="BEFORE">
    select count(*) from country where id = #{id}
  </selectKey>
  <if test="count > 0">
    update country 
    set countryname = #{countryname},countrycode = #{countrycode} 
    where id = #{id}
  </if>
  <if test="count==0">
    insert into country values(#{id},#{countryname},#{countrycode})
  </if>
</insert>

條件限制

根據(jù)不同的判斷邏輯,會有所不同,就上面這個例子而言,就要求實體類中包含count屬性(可以是別的名字)。否則selectKey的結果沒法保存,如果入?yún)⑹莻€Map類型,就沒有這個限制。

說明

從例子來看除了有個限制外,也沒別的麻煩。

通過selectKey做第一次查詢,然后根據(jù)結果進行判斷,所以這里的order="BEFORE"是必須的。

也是因為BEFORE,所以沒法通過<bind>標簽來臨時存儲中間的值,只能在入?yún)⒅性黾訉傩詠泶娣拧?/p>

測試代碼

//數(shù)據(jù)庫中已經存在該ID,但是countryname=China
Country country = new Country();
country.setId(35);
country.setCountryname("中國");
country.setCountrycode("CN");
//由于存在,這里會update
int result = countryMapper.saveOrUpdate(country);
//查詢結果,判斷是否已經改變
Country c2 = countryMapper.selectById(35);
assertEquals("中國",c2.getCountryname());
//id=300的不存在
c2 = countryMapper.selectById(300);
assertNull(c2);
//將id=300
country.setId(300);
//由于id=300不存在,這里會Insert
result = countryMapper.saveOrUpdate(country);
//查詢結果
c2 = countryMapper.selectById(300);
assertNotNull(c2);

輸出日志

DEBUG ==>  Preparing: select count(*) from country where id = ? 
DEBUG ==> Parameters: 35(Integer)
TRACE <==    Columns: C1
TRACE <==        Row: 1
DEBUG <==      Total: 1
DEBUG ==>  Preparing: update country set countryname = ?,countrycode = ? where id = ? 
DEBUG ==> Parameters: 中國(String), CN(String), 35(Integer)
DEBUG <==    Updates: 1
DEBUG ==>  Preparing: select * from country where id = ? 
DEBUG ==> Parameters: 35(Integer)
TRACE <==    Columns: ID, COUNTRYNAME, COUNTRYCODE
TRACE <==        Row: 35, 中國, CN
DEBUG <==      Total: 1
DEBUG ==>  Preparing: select * from country where id = ? 
DEBUG ==> Parameters: 300(Integer)
DEBUG <==      Total: 0
DEBUG ==>  Preparing: select count(*) from country where id = ? 
DEBUG ==> Parameters: 300(Integer)
TRACE <==    Columns: C1
TRACE <==        Row: 0
DEBUG <==      Total: 1
DEBUG ==>  Preparing: insert into country values(?,?,?) 
DEBUG ==> Parameters: 300(Integer), 中國(String), CN(String)
DEBUG <==    Updates: 1
DEBUG ==>  Preparing: select * from country where id = ? 
DEBUG ==> Parameters: 300(Integer)
TRACE <==    Columns: ID, COUNTRYNAME, COUNTRYCODE
TRACE <==        Row: 300, 中國, CN
DEBUG <==      Total: 1

最后

這種方式只是利用了selectKey會多執(zhí)行一次查詢來實現(xiàn)的,但是如果你同時還需要通過selectKey獲取序列或者自增的id,就會麻煩很多(oracle麻煩,其他支持自增的還是很容易)。

建議在復雜情況下,還是選擇在Service中實現(xiàn)更好。

到此這篇關于MyBatis如何通過xml方式實現(xiàn)SaveOrUpdate的文章就介紹到這了,更多相關MyBatis實現(xiàn)SaveOrUpdate內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java web數(shù)據(jù)可視化實現(xiàn)原理解析

    Java web數(shù)據(jù)可視化實現(xiàn)原理解析

    這篇文章主要介紹了Java web數(shù)據(jù)可視化實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java中BigDecimal使用注意避坑指南

    Java中BigDecimal使用注意避坑指南

    Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進行精確的運算,下面這篇文章主要給大家介紹了關于Java中BigDecimal使用注意避坑的相關資料,需要的朋友可以參考下
    2023-02-02
  • Java多線程編程中使用Condition類操作鎖的方法詳解

    Java多線程編程中使用Condition類操作鎖的方法詳解

    Condition是java.util.concurrent.locks包下的類,提供了對線程鎖的更精細的控制方法,下面我們就來看一下Java多線程編程中使用Condition類操作鎖的方法詳解
    2016-07-07
  • Spring Boot Redis客戶端遠程操作實現(xiàn)過程解析

    Spring Boot Redis客戶端遠程操作實現(xiàn)過程解析

    這篇文章主要介紹了Spring Boot Redis客戶端遠程操作實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • SpringFactoriesLoader類作用詳解

    SpringFactoriesLoader類作用詳解

    SpringFactoriesLoader可以加載jar包下META-INF下的spring.factories,把相關接口的實現(xiàn)按照key,value的形式加載到內存,一個接口的多個實現(xiàn)可以按照","進行分割
    2022-10-10
  • 輕松掌握Java代理模式

    輕松掌握Java代理模式

    這篇文章主要幫助大家輕松掌握Java代理模式,什么是靜態(tài)代理?感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java單例的寫法詳解

    Java單例的寫法詳解

    在java中,單例有很多種寫法,面試時,手寫代碼環(huán)節(jié),除了寫算法題,有時候也會讓手寫單例模式,這里記錄一下單例的幾種寫法和優(yōu)缺點。需要的朋友可以參考下
    2021-09-09
  • 簡單了解Java中的可重入鎖

    簡單了解Java中的可重入鎖

    這篇文章主要介紹了簡單了解Java中的可重入鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Spring框架AOP面向切面編程原理全面分析

    Spring框架AOP面向切面編程原理全面分析

    這篇文章主要介紹了Spring框架AOP面向切面編程的全面分析,文中附含詳細的示例代碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • springboot中縮短一個url鏈接的實現(xiàn)

    springboot中縮短一個url鏈接的實現(xiàn)

    縮短 URL 是現(xiàn)代應用程序中常見的需求,通常用于減少長 URL 的長度,使其更易于分享,URL 縮短服務的核心思路是將長 URL 映射到一個唯一的短代碼,本文主要介紹了springboot中縮短一個url鏈接的實現(xiàn),感興趣的可以了解一下
    2024-09-09

最新評論