mybatis中foreach的解释

本文详细介绍了MyBatis框架中foreach元素的应用场景及配置属性,并通过三个具体实例展示了如何利用foreach进行SQL构建,包括单参数List、单参数数组以及多参数封装成Map的情况。

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

下面分别来看看上述三种情况的示例代码:

1.单参数List的类型: 
    <select id="dynamicForeachTest" resultType="Blog"> 
       select * from t_blog where id in 
        <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> 
           #{item} 
        </foreach> 
    </select> 
上述collection的值为list,对应的Mapper是这样的 
public List<Blog> dynamicForeachTest(List<Integer> ids); 
测试代码: 
   @Test 
    public void dynamicForeachTest() { 
        SqlSession session = Util.getSqlSessionFactory().openSession(); 
        BlogMapper blogMapper = session.getMapper(BlogMapper.class); 
       List<Integer> ids = new ArrayList<Integer>(); 
        ids.add(1); 
        ids.add(3); 
        ids.add(6); 
        List<Blog> blogs = blogMapper.dynamicForeachTest(ids); 
       for (Blog blog : blogs) 
            System.out.println(blog); 
        session.close(); 
    } 
2.单参数array数组的类型: 
    <select id="dynamicForeach2Test"resultType="Blog"> 
        select * from t_blog where id in 
        <foreach collection="array" index="index" item="item" open="(" separator=","close=")"> 
            #{item} 
        </foreach> 
    </select> 
上述collection为array,对应的Mapper代码: 
public List<Blog> dynamicForeach2Test(int[]ids); 
对应的测试代码: 
    @Test 
    public void dynamicForeach2Test() { 
        SqlSession session = Util.getSqlSessionFactory().openSession(); 
        BlogMapper blogMapper= session.getMapper(BlogMapper.class); 
        int[] ids = new int[] {1,3,6,9}; 
        List<Blog> blogs = blogMapper.dynamicForeach2Test(ids); 
        for (Blog blog : blogs) 
           System.out.println(blog); 
        session.close(); 
    } 
3.自己把参数封装成Map的类型 
    <select id="dynamicForeach3Test" resultType="Blog"> 
       select * from t_blog where title like "%"#{title}"%" and id in 
        <foreach collection="ids" index="index" item="item" open="(" separator=","close=")"> 
            #{item} 
        </foreach> 
    </select> 
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码: 
publicList<Blog> dynamicForeach3Test(Map<String, Object> params); 
对应测试代码: 
    @Test 
    public void dynamicForeach3Test() { 
        SqlSession session = Util.getSqlSessionFactory().openSession(); 
       BlogMapper blogMapper = session.getMapper(BlogMapper.class); 
        final List<Integer> ids = new ArrayList<Integer>(); 
        ids.add(1); 
        ids.add(2); 
       ids.add(3); 
        ids.add(6); 
        ids.add(7); 
        ids.add(9); 
        Map<String, Object> params = new HashMap<String, Object>(); 
       params.put("ids", ids); 
        params.put("title", "中国"); 
        List<Blog> blogs = blogMapper.dynamicForeach3Test(params); 
        for (Blog blog: blogs) 
            System.out.println(blog); 
        session.close(); 
    } 

### MyBatis 中 `foreach` 标签的使用方法 #### 基本语法结构 在MyBatis中,`<foreach>`标签用于遍历集合并构建动态SQL语句。基本语法如下: ```xml <foreach collection="collection" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> ``` 此标签通过指定`collection`属性来定义要迭代的数据源,可以是数组、列表(List)或其他类型的集合对象[^2]。 #### 属性解释 - **collection**: 集合名称,在传递给Mapper接口的方法参数中定义。 - **item**: 表示当前循环项的变量名。 - **index**(可选): 当前索引位置,默认不设置也可以正常使用。 - **open** 和 **close**: 定义生成字符串前后附加的内容,通常用来包裹整个表达式的括号等符号。 - **separator**: 各元素间的分隔符,比如逗号`,`表示各成员间用逗号连接[^4]。 #### 实际应用案例展示 ##### 批量查询操作 当需要根据多个ID获取记录时,可以通过`<foreach>`实现IN子句的功能: ```xml <select id="foreach_test" parameterType="map" resultType="com.pojo.Blog"> select * from Blog <where> <if test="ids != null and ids.size() > 0"> <!-- 判断是否为空 --> AND ( <foreach collection="ids" item="id" open="(" separator="OR " close=")"> id=#{id} </foreach> ) </if> </where> </select> ``` 这段代码展示了如何安全地处理可能存在的空集合并防止潜在的SQL注入风险[^3]。 ##### 批量删除功能 对于批量删除场景,则可以直接利用`<foreach>`构造DELETE语句内的条件部分: ```xml <delete id="delete" parameterType="java.util.List"> DELETE FROM account WHERE id IN ( <foreach collection="list" item="id" separator=","> #{id} </foreach> ); </delete> ``` 这里假设传入的是一个名为`list`的字符串列表作为待删账户ID集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值