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

SpringBoot+MyBatis進行XML中循環(huán)處理List參數的終極指南

 更新時間:2025年07月06日 09:56:29   作者:一勺菠蘿丶  
這篇文章主要為大家詳細介紹了SpringBoot整合MyBatis進行XML中循環(huán)處理List參數的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下

重要提醒:使用@Param注解時,務必導入正確的包!

import org.apache.ibatis.annotations.Param;

很多開發(fā)者容易錯誤導入Spring的@Param,導致參數綁定失?。?/p>

一、為什么需要傳遞List參數?

最常見的場景是動態(tài)構建IN查詢

SELECT * FROM users WHERE id IN (1, 2, 3, 4)

當我們需要根據前端傳入的多個值查詢時,就需要將List集合作為參數傳遞給Mapper。

二、基礎版:MyBatis原生List傳參

1. Mapper接口定義(注意@Param導入)

// !??!必須導入MyBatis的@Param包?。?!
import org.apache.ibatis.annotations.Param;

public interface UserMapper {
    // 使用@Param注解指定參數名
    List<User> selectByIds(@Param("idList") List<Long> idList);
}

2. XML映射文件實現(xiàn)

<select id="selectByIds" resultType="User">
    SELECT * FROM users
    WHERE id IN
    <foreach collection="idList" item="id" 
             open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

核心標簽解析:

屬性說明示例值
collection傳入的集合參數名idList
item循環(huán)中當前元素的別名id
open循環(huán)開始前的字符串(
separator元素間的分隔符,
close循環(huán)結束后的字符串)

3. 實際生成的SQL

當傳入List<Long> ids = Arrays.asList(1L, 2L, 3L)時:

SELECT * FROM users WHERE id IN (1, 2, 3)

三、避坑重點:@Param的正確使用

常見錯誤1:導入錯誤包

// ? 錯誤:導入了Spring的Param包
import org.springframework.data.repository.query.Param;

// ? 正確:必須使用MyBatis的Param包
import org.apache.ibatis.annotations.Param;

常見錯誤2:忘記添加@Param注解

// ? 錯誤:缺少@Param注解會導致XML中無法識別參數
List<User> selectByIds(List<Long> idList);

// ? 正確:必須添加@Param注解
List<User> selectByIds(@Param("idList") List<Long> idList);

四、MyBatis Plus的優(yōu)雅實現(xiàn)

1. 使用QueryWrapper(無需XML)

public List<User> getUsersByIds(List<Long> ids) {
    return userMapper.selectList(
        new QueryWrapper<User>().in("id", ids)
    );
}

2. Lambda表達式寫法(推薦)

public List<User> getUsersByIds(List<Long> ids) {
    return userMapper.selectList(
        Wrappers.<User>lambdaQuery()
            .in(User::getId, ids)
    );
}

注意:MyBatis Plus的Wrapper方式不需要@Param注解

五、擴展應用場景

場景1:List處理

// Mapper
List<User> selectByNames(@Param("nameList") List<String> nameList);

// XML
<foreach collection="nameList" item="name" open="(" separator="," close=")">
    #{name}
</foreach>

場景2:List<實體對象>

// Mapper
List<User> selectByConditions(@Param("userList") List<User> userList);

// XML
<foreach collection="userList" item="user" separator=" OR ">
    (name = #{user.name} AND age > #{user.age})
</foreach>

場景3:多List參數

// Mapper
List<User> searchUsers(@Param("ids") List<Long> ids, 
                      @Param("names") List<String> names);

// XML
<where>
    <if test="ids != null and !ids.isEmpty()">
        id IN
        <foreach collection="ids" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </if>
    <if test="names != null and !names.isEmpty()">
        AND name IN
        <foreach collection="names" item="name" open="(" separator="," close=")">
            #{name}
        </foreach>
    </if>
</where>

六、特殊類型處理技巧

1. 枚舉類型處理

// Mapper
List<User> selectByStatus(@Param("statusList") List<UserStatus> statusList);

// XML
<foreach collection="statusList" item="status" open="(" separator="," close=")">
    #{status, typeHandler=org.apache.ibatis.type.EnumTypeHandler}
</foreach>

2. 日期范圍查詢

// Mapper
List<User> selectByDates(@Param("dateList") List<Date> dates);

// XML
<foreach collection="dateList" item="date" separator=" OR ">
    create_time BETWEEN #{date} AND DATE_ADD(#{date}, INTERVAL 1 DAY)
</foreach>

七、性能優(yōu)化與避坑指南

1. 空集合安全處理

<select id="safeSelect">
    SELECT * FROM users
    <where>
        <if test="idList != null and !idList.isEmpty()">
            id IN
            <foreach collection="idList" ... />
        </if>
    </where>
</select>

2. 大數據量分批查詢

// 每500條執(zhí)行一次查詢
public List<User> batchSelect(List<Long> allIds) {
    List<User> result = new ArrayList<>();
    int batchSize = 500;
    
    for (int i = 0; i < allIds.size(); i += batchSize) {
        List<Long> batchIds = allIds.subList(i, Math.min(i + batchSize, allIds.size()));
        result.addAll(userMapper.selectByIds(batchIds));
    }
    return result;
}

3. SQL注入防護

<!-- 安全寫法:使用#{}預編譯 -->
<foreach collection="names" item="name">
    #{name}  <!-- 安全 -->
</foreach>

<!-- 危險寫法:${}直接拼接 -->
<foreach collection="names" item="name">
    '${name}' <!-- 存在SQL注入風險! -->
</foreach>

八、完整可運行示例

Controller

@RestController
@RequestMapping("/users")
public class UserController {
    
    @PostMapping("/by-ids")
    public List<User> getUsersByIds(@RequestBody List<Long> ids) {
        return userService.getUsersByIds(ids);
    }
}

Service

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserMapper userMapper;

    public List<User> getUsersByIds(List<Long> ids) {
        if (ids == null || ids.isEmpty()) {
            return Collections.emptyList();
        }
        // 超過1000條自動分批
        return ids.size() > 1000 ? batchSelect(ids) : userMapper.selectByIds(ids);
    }
}

Mapper XML

<mapper namespace="com.example.mapper.UserMapper">
    
    <select id="selectByIds" resultType="User">
        SELECT id, name, email 
        FROM users
        <where>
            <if test="idList != null and !idList.isEmpty()">
                id IN
                <foreach collection="idList" item="id" 
                         open="(" separator="," close=")">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>
</mapper>

總結:核心要點回顧

1.必須使用正確的@Param包 import org.apache.ibatis.annotations.Param;

2.XML循環(huán)核心語法

<foreach collection="參數名" item="元素名" 
         open="開始符" separator="分隔符" close="結束符">
     #{元素名}
</foreach>

3.最佳實踐選擇

  • 簡單查詢:MyBatis Plus Wrapper
  • 復雜SQL:MyBatis XML + foreach
  • 超大數據:分批查詢

4.安全防護

  • 始終使用#{}防止SQL注入
  • 空集合檢查避免全表掃描

5.特殊類型處理

  • 枚舉:添加typeHandler
  • 日期:指定jdbcType=TIMESTAMP

最后提醒: 當遇到參數綁定問題時,首先檢查@Param導入的包是否正確,這是最常見的錯誤根源!

到此這篇關于SpringBoot+MyBatis進行XML中循環(huán)處理List參數的終極指南的文章就介紹到這了,更多相關SpringBoot處理List參數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java基礎詳解之集合框架工具Collections

    Java基礎詳解之集合框架工具Collections

    這篇文章主要介紹了Java基礎詳解之集合框架工具Collections,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot項目 文件上傳臨時目標被刪除異常的處理方案

    SpringBoot項目 文件上傳臨時目標被刪除異常的處理方案

    這篇文章主要介紹了SpringBoot項目 文件上傳臨時目標被刪除異常的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java實現(xiàn)入參數據批量數據校驗詳解

    Java實現(xiàn)入參數據批量數據校驗詳解

    在業(yè)務處理中一般入參是單條數據,這樣數據校驗比較容易,但是這種方法對于集合數據的校驗不適用,下面我們就來看看如何對入參數據進行批量數據校驗吧
    2024-02-02
  • Mybatis使用Collection屬性的示例代碼

    Mybatis使用Collection屬性的示例代碼

    本文主要介紹了Mybatis使用Collection屬性的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Spring StateMachine 使用小結

    Spring StateMachine 使用小結

    Spring StateMachine是一個用于管理復雜狀態(tài)流轉的框架,本文就來介紹一下Spring StateMachine 使用,具有一定的參考價值,感興趣的可以了解一下
    2025-11-11
  • 深入淺析hbase的優(yōu)點

    深入淺析hbase的優(yōu)點

    本文講述了HBase的特征和它的優(yōu)點,并簡要回顧了行鍵設計的重點之處,它還向你展示了如何在本地配置HBase環(huán)境,使用命令創(chuàng)建表、插入數據、檢索指定行以及最后如何進行scan操作,感興趣的朋友一起看看吧
    2017-09-09
  • spring Security配置攔截規(guī)則小結

    spring Security配置攔截規(guī)則小結

    本文介紹了使用Spring Security解決后臺管理系統(tǒng)在訪問靜態(tài)資源如圖片時需要登錄驗證的問題,通過配置攔截規(guī)則,將靜態(tài)資源路徑添加到白名單,感興趣的可以了解一下
    2025-09-09
  • JavaFX實現(xiàn)UI美觀效果代碼實例

    JavaFX實現(xiàn)UI美觀效果代碼實例

    這篇文章主要介紹了JavaFX實現(xiàn)UI美觀效果代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • MyBatis動態(tài)SQL與緩存原理深入分析

    MyBatis動態(tài)SQL與緩存原理深入分析

    這篇文章主要介紹了MyBatis動態(tài)SQL與緩存原理,Mybatis框架的動態(tài)SQL技術是一種根據特定條件動態(tài)拼裝SQL語句的功能,它存在的意義是為了解決拼接SQL語句字符串時的痛點問題
    2023-02-02
  • Java注解與反射原理說明

    Java注解與反射原理說明

    今天小編就為大家分享一篇關于Java注解與反射原理說明,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

烟台市| 沈丘县| 鄂托克前旗| 澳门| 兴海县| 阿拉善盟| 托克托县| 偏关县| 甘洛县| 年辖:市辖区| 大关县| 云和县| 合阳县| 静宁县| 磐安县| 祁阳县| 左权县| 于都县| 西林县| 花垣县| 虞城县| 鹤壁市| 靖江市| 南雄市| 监利县| 嘉定区| 通化县| 锡林浩特市| 山东省| 曲周县| 江门市| 偏关县| 甘洛县| 江源县| 肇源县| 黄浦区| 高平市| 荣昌县| 湟中县| 濮阳市| 孟村|