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

Mybatis批量更新對(duì)象數(shù)據(jù)的兩種實(shí)現(xiàn)方式

 更新時(shí)間:2024年08月05日 09:28:02   作者:何中應(yīng)  
這篇文章主要介紹了Mybatis批量更新對(duì)象數(shù)據(jù)的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

說(shuō)明:

遇到一次需要批量修改對(duì)象的場(chǎng)景。

傳遞一個(gè)對(duì)象集合,需要根據(jù)對(duì)象ID批量修改數(shù)據(jù)庫(kù)數(shù)據(jù),使用的是MyBatis框架。查了一些資料,總結(jié)出兩種實(shí)現(xiàn)方式。

創(chuàng)建Demo

首先,創(chuàng)建一個(gè)簡(jiǎn)單的Demo;

(User,用戶(hù)對(duì)象)

import lombok.Data;
import java.io.Serializable;

@Data
public class User implements Serializable {
    
    private String id;

    private String username;

    private String password;
}

(UserController,用戶(hù)控制器)

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserMapper userMapper;

    /**
     * 根據(jù)ID查詢(xún)用戶(hù)
     * @param id
     * @return
     */
    @GetMapping("/getUser/{id}")
    public String getUser(@PathVariable("id") String id){
        return userMapper.getUser(id).toString();
    }
}

(UserMapper,用戶(hù)數(shù)據(jù)訪問(wèn)接口)

import com.hezy.pojo.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {

    User getUser(String id);
}

數(shù)據(jù)庫(kù)數(shù)據(jù),tb_user

項(xiàng)目啟動(dòng),測(cè)試一下接口,沒(méi)得問(wèn)題;

批量更新

創(chuàng)建一個(gè)新的接口,用于觸發(fā)批量更新對(duì)象的代碼,內(nèi)容是傳遞一個(gè)List集合對(duì)象給Mapper處理;

    @GetMapping("/updateUser")
    public void updateUser(){
        ArrayList<User> users = new ArrayList<>();

        User user1 = new User();
        user1.setId("1");
        user1.setUsername("zhangsan_fix");

        User user2 = new User();
        user2.setId("2");
        user2.setUsername("lisi_fix");
        user2.setPassword("654321_fix");

        users.add(user1);
        users.add(user2);
        userMapper.updateUser(users);
    }

接下來(lái),重點(diǎn)是Mapper.xml中的Statement要怎么寫(xiě),繼續(xù)往下看

方式一

首先,我們可以使用動(dòng)態(tài)SQL,如下:

    <update id="updateUser">
        <foreach collection="users" item="user" separator=";">
            update tb_user
            <set>
                <if test="user.username != null and user.username != ''">
                    username = #{user.username},
                </if>
                <if test="user.password != null and user.password != ''">
                    password = #{user.password}
                </if>
            </set>
            where id = #{user.id}
        </foreach>
    </update>

我們把拼接后的SQL打印出來(lái),會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題。SQL中,分號(hào)(;)表示一條語(yǔ)句的結(jié)束,使用上面的方式拼接出來(lái)的方式,是多條SQL。

因此產(chǎn)生了一個(gè)問(wèn)題,Mybatis中一個(gè)Statement標(biāo)簽中可以有多條SQL嗎?

答案是默認(rèn)不可以,所以上面的代碼報(bào)錯(cuò)了。

需要在數(shù)據(jù)庫(kù)連接后面加上&allowMultiQueries=true配置,如下:

再次執(zhí)行,修改成功了,這是第一種方式;

查看日志發(fā)現(xiàn),Updates:1,就是說(shuō)如果需要返回更新的記錄條數(shù),那么這種方式返回的更新條數(shù)會(huì)是1,不能體現(xiàn)出數(shù)據(jù)庫(kù)真實(shí)發(fā)生變化的記錄條數(shù);

另外,將多條SQL合成一條執(zhí)行,有SQL注入的風(fēng)險(xiǎn)

方式二

第二種方式是用一條SQL的方式來(lái)實(shí)現(xiàn),如下:

	<update id="updateUser">
	    update tb_user
	    set
	    
	    username = case
	    <foreach collection="users" item="user">
	        when id = #{user.id}
	        <choose>
	            <when test="user.username != null and user.username != ''">then #{user.username}</when>
	            <otherwise>then username</otherwise>
	        </choose>
	    </foreach>
	    end,
	
	    password = case
	    <foreach collection="users" item="user">
	        when id = #{user.id}
	        <choose>
	            <when test="user.password != null and user.password != ''">then #{user.password}</when>
	            <otherwise>then password</otherwise>
	        </choose>
	    </foreach>
	    end
	
	    where
	    <foreach collection="users" item="user" separator="or">
	        id = #{user.id}
	    </foreach>
	</update>

看著有些復(fù)雜,拼接后的SQL如下:

	update tb_user
	set
	    username = case
	                   when id = '1' then 'zhangsan_fix'
	                   when id = '2' then 'lisi_fix'
	    end,
	
	    password = case
	                   when id = '1' then password
	                   when id = '2' then '654321_fix'
	    end
	where id = '1'
	   or id = '2';

這種方式不需要加額外的配置,執(zhí)行測(cè)試;

查看數(shù)據(jù)庫(kù),沒(méi)得問(wèn)題,批量修改完成了;

總結(jié)

本文介紹了Mybatis框架下,批量更新對(duì)象的兩種方法:

  • 方法一:將多條更新語(yǔ)句合成一條執(zhí)行,需要在數(shù)據(jù)庫(kù)鏈接后面增加配置,不能體現(xiàn)真實(shí)修改的記錄條數(shù),有SQL注入的風(fēng)險(xiǎn);
  • 方法二:使用case then 關(guān)鍵字實(shí)現(xiàn),SQL復(fù)雜,行數(shù)多,降低了可閱讀性;

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot調(diào)用第三方WebService接口的兩種方法

    SpringBoot調(diào)用第三方WebService接口的兩種方法

    本文主要介紹了SpringBoot調(diào)用第三方WebService接口的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 解決沒(méi)有@RunWith 和 @SpringBootTest注解或失效問(wèn)題

    解決沒(méi)有@RunWith 和 @SpringBootTest注解或失效問(wèn)題

    這篇文章主要介紹了解決沒(méi)有@RunWith 和 @SpringBootTest注解或失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • MyBatis詳細(xì)講解DAO代理的使用

    MyBatis詳細(xì)講解DAO代理的使用

    MyBatis允許只聲明一個(gè)dao接口,而無(wú)需寫(xiě)dao實(shí)現(xiàn)類(lèi)的方式實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。前提是必須保證Mapper文件中的<mapper>標(biāo)簽的namespace屬性值必須要和dao接口的類(lèi)路徑一致,MyBatis容器會(huì)自動(dòng)通過(guò)動(dòng)態(tài)代理生成接口的實(shí)現(xiàn)類(lèi)
    2022-04-04
  • java之this關(guān)鍵字用法實(shí)例分析

    java之this關(guān)鍵字用法實(shí)例分析

    這篇文章主要介紹了java之this關(guān)鍵字用法實(shí)例分析,較為詳細(xì)的講述了Java中this關(guān)鍵字的用法及適用范圍,并附帶實(shí)例程序加以說(shuō)明,需要的朋友可以參考下
    2014-09-09
  • Java中保留兩位小數(shù)的四種方法實(shí)現(xiàn)實(shí)例

    Java中保留兩位小數(shù)的四種方法實(shí)現(xiàn)實(shí)例

    今天小編就為大家分享一篇關(guān)于Java中保留兩位小數(shù)的四種方法實(shí)現(xiàn)實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Spring?Boot?集成Elasticsearch模塊實(shí)現(xiàn)簡(jiǎn)單查詢(xún)功能

    Spring?Boot?集成Elasticsearch模塊實(shí)現(xiàn)簡(jiǎn)單查詢(xún)功能

    本文講解了Spring?Boot集成Elasticsearch采用的是ES模板的方式實(shí)現(xiàn)基礎(chǔ)查詢(xún),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-06-06
  • SpringBoot+Vue+Element-ui實(shí)現(xiàn)前后端分離

    SpringBoot+Vue+Element-ui實(shí)現(xiàn)前后端分離

    使用前后端分離的方式,可以減少代碼耦合,本文主要介紹了SpringBoot+Vue+Element-ui實(shí)現(xiàn)前后端分離,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java實(shí)現(xiàn)多數(shù)據(jù)源切換方式

    java實(shí)現(xiàn)多數(shù)據(jù)源切換方式

    本文介紹實(shí)現(xiàn)多數(shù)據(jù)源切換的四步方法:導(dǎo)入依賴(lài)、配置文件、啟動(dòng)類(lèi)注解、使用@DS標(biāo)記mapper和服務(wù)層,通過(guò)注解實(shí)現(xiàn)數(shù)據(jù)源動(dòng)態(tài)切換,適用于實(shí)際開(kāi)發(fā)中的多數(shù)據(jù)源場(chǎng)景
    2025-08-08
  • Java輸出打印工具類(lèi)封裝的實(shí)例

    Java輸出打印工具類(lèi)封裝的實(shí)例

    下面小編就為大家?guī)?lái)一篇Java輸出打印工具類(lèi)封裝的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • mybatis?實(shí)現(xiàn)字段大小寫(xiě)賦值

    mybatis?實(shí)現(xiàn)字段大小寫(xiě)賦值

    這篇文章主要介紹了mybatis?實(shí)現(xiàn)字段大小寫(xiě)賦值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論

隆回县| 鹰潭市| 临湘市| 元阳县| 中阳县| 临夏县| 杂多县| 甘孜县| 奎屯市| 托克逊县| 大名县| 云阳县| 永吉县| 元朗区| 顺义区| 南投市| 浮山县| 南溪县| 青龙| 上栗县| 曲靖市| 特克斯县| 抚远县| 平罗县| 昆山市| 峨眉山市| 东阿县| 鹰潭市| 辰溪县| 祁阳县| 阿图什市| 大化| 马公市| 离岛区| 奉贤区| 泾源县| 南昌县| 平阳县| 永春县| 垣曲县| 广安市|