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

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

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

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的結(jié)果沒法保存,如果入?yún)⑹莻€Map類型,就沒有這個限制。

說明

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

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

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

測試代碼

//數(shù)據(jù)庫中已經(jīng)存在該ID,但是countryname=China
Country country = new Country();
country.setId(35);
country.setCountryname("中國");
country.setCountrycode("CN");
//由于存在,這里會update
int result = countryMapper.saveOrUpdate(country);
//查詢結(jié)果,判斷是否已經(jīng)改變
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);
//查詢結(jié)果
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麻煩,其他支持自增的還是很容易)。

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

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

相關(guān)文章

  • 淺談Java數(shù)組的一些使用方法及堆棧存儲

    淺談Java數(shù)組的一些使用方法及堆棧存儲

    下面小編就為大家?guī)硪黄獪\談Java數(shù)組的一些使用方法及堆棧存儲。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 再也不用怕! 讓你徹底搞明白Java內(nèi)存分布

    再也不用怕! 讓你徹底搞明白Java內(nèi)存分布

    做Java的大都沒有c++ 的那種分配內(nèi)存的煩惱,因為Java 幫我們管理內(nèi)存,但是這并不代表我們不需要了解Java的內(nèi)存結(jié)構(gòu),因為線上經(jīng)常出現(xiàn)內(nèi)存的問題,今天聊一下內(nèi)存的問題,需要的朋友可以參考下
    2021-06-06
  • Spring Boot 之HelloWorld開發(fā)案例

    Spring Boot 之HelloWorld開發(fā)案例

    這篇文章主要介紹了Spring Boot 之HelloWorld開發(fā)案例,需要的朋友可以參考下
    2017-04-04
  • Java排序算法之桶排序詳解

    Java排序算法之桶排序詳解

    這篇文章主要介紹了Java排序算法之桶排序詳解,桶排序是將數(shù)組中的元素放到一個一個的桶中,每個桶(bucket)代表一個區(qū)間,里面可以承載一個或者多個元素,然后將桶內(nèi)的元素進(jìn)行排序,再按順序遍歷桶,輸出桶內(nèi)元素,需要的朋友可以參考下
    2023-10-10
  • 總結(jié)一些Java常用的加密算法

    總結(jié)一些Java常用的加密算法

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java加密算法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 如何用websocket+webRtc后端實現(xiàn)視頻通話

    如何用websocket+webRtc后端實現(xiàn)視頻通話

    WebRTC 和WebSocket是兩種不同的技術(shù),雖然它們都用于在瀏覽器之間進(jìn)行通信,但它們的設(shè)計目標(biāo)和使用場景有所不同,這篇文章主要介紹了如何用websocket+webRtc后端實現(xiàn)視頻通話的相關(guān)資料,需要的朋友可以參考下
    2025-06-06
  • java常見的序列化方式

    java常見的序列化方式

    這篇文章主要為大家詳細(xì)介紹了java中兩種常見的序列化方式,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java的validation參數(shù)校驗代碼實例

    Java的validation參數(shù)校驗代碼實例

    這篇文章主要介紹了Java的validation參數(shù)校驗代碼實例,Validation參數(shù)校驗是指在程序運行中對傳進(jìn)來的參數(shù)進(jìn)行合法性檢查,以保證程序的正確性和安全性,需要的朋友可以參考下
    2023-10-10
  • drools規(guī)則動態(tài)化實踐解析

    drools規(guī)則動態(tài)化實踐解析

    這篇文章主要為大家介紹了drools規(guī)則動態(tài)化實踐解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • SpringBoot中實現(xiàn)分布式的Session共享的詳細(xì)教程

    SpringBoot中實現(xiàn)分布式的Session共享的詳細(xì)教程

    這篇文章主要介紹了SpringBoot中實現(xiàn)分布式的Session共享,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06

最新評論

蒲江县| 固始县| 营口市| 宁明县| 柳林县| 搜索| 明溪县| 江陵县| 新乡县| 禹城市| 阜宁县| 左权县| 麻栗坡县| 察雅县| 弥勒县| 漳浦县| 牙克石市| 泊头市| 名山县| 平邑县| 探索| 成都市| 友谊县| 杂多县| 武鸣县| 图们市| 连南| 皮山县| 榆树市| 襄城县| 贡嘎县| 张家口市| 庆阳市| 青川县| 囊谦县| 牡丹江市| 张掖市| 沈阳市| 宁都县| 乌拉特中旗| 顺昌县|