Mybatis:对foreach拼接的条件添加小括号

郎家岭伯爵 2023年04月24日 869次浏览

背景

在某些场景下,在 Mybtis 中使用 foreach 元素循环遍历,同时使用 OGNL 表达式来构造动态 SQL 语句。

如果需要对构造的 SQL 条件用小括号包起来,以达到 WHERE (column1 = value1 OR column2 = value2) AND column3 = value3 这样的效果可以怎么操作呢?

实现

针对这种应用场景,仍然是使用 OGNL 表达式来实现。

OGNL(Object-Graph Navigation Language)是一种基于 Java 对象图的导航语言,它可以用来访问和操作 Java 对象的属性和方法。在 MyBatis 中,OGNL 被广泛应用于动态 SQL 语句的构造中,可以通过 OGNL 表达式来引用 Java 对象的属性和方法,从而实现动态 SQL 语句的构造。

Mapper接口类

在 Mapper 的接口类中定义如下方法:

import org.apache.ibatis.annotations.Param;
import java.util.List;

public interface YourMapper {

    List<YourResultType> selectByList(
        @Param("list") List<String> list,
        @Param("value3") YourValueType value3
    );
}

Mapper.xml

对应的 Mybatis 配置可以这样写:

<select id="selectByList" resultType="YourResultType">
  SELECT * FROM your_table
  <where>
    <foreach collection="list" item="item" separator=" OR " open="(" close=")">
      column1 = #{item.value} OR column2 = #{item.value}
    </foreach>
    AND column3 = #{value3}
  </where>
</select>

在这个配置中,foreach 元素的 openclose 属性分别指定了括号的开头和结尾,separator 属性指定了每个循环项之间的分隔符。

这样,当 list 参数中有多个元素时,MyBatis 将会根据配置自动拼接出带有小括号的条件语句。

扩展:where条件中拼接in语句

如果需要在 where 条件中拼接 in 语句,并且需要用 foreach 把 List 中的元素循环出来。那么我们可以使用如下写法:

<select id="selectByList" resultType="YourResultType">
  SELECT * FROM your_table
  <where>
    column3 = #{value3}
    AND column1 IN
    <foreach collection="list" item="item" open="(" separator="," close=")">
      #{item}
    </foreach>
  </where>
</select>
  • #{item} 来获取 list 中的元素值。

总结

本文介绍了如何在 foreach 拼接的 SQL 里添加小括号。