Mybatis中example类实现用and连接不同的Criteria、同个Criteria对象内可用or连接

博客围绕MyBatis展开,介绍了在Service类、Example类和Mapper.xml文件中的相关操作。在Example类新增用or连接的方法、addCriterion方法及Criterion构造方法;在Mapper.xml文件中,separator用于连接不同Criteria对象,choose when可根据条件拼接SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果

SELECT count(0)
 FROM tb_holiday
 WHERE (holiday_type = '0') AND (end_time BETWEEN '2020-01-01 00:00:00.0' AND '2021-01-01 00:00:00.0' OR is_loop = '0');

Service类

service层list方法内

//criteria对象要放在list,才能和xml文件的oredCriteria对应
List<TbHolidayExample1.Criteria> list = tbHolidayExample.getOredCriteria();
            TbHolidayExample1.Criteria criteria1 = tbHolidayExample.createCriteria();
            list.add(criteria1);
            criteria1.andEndTimeBetween(beginDate, endDate);
            //新增方法
            criteria1.orIsLoopEqualTo('0', true);

Example类

新增一个用or连接的方法

//新增:不同Criteria对象之间用and连接,同个对象之间不同查询条件之间可用or连接
        public Criteria orIsLoopEqualTo(Character value, Boolean isOr) {
            addCriterion(value, "is_loop = ", "isLoop", isOr);
            return (Criteria) this;
        }

新增一个addCriterion方法(方法重载-参数调换下位置、调用了新增的Criterion构造方法)

//新增:不同Criteria对象之间用and连接,同个对象之间不同查询条件之间可用or连接
        protected void addCriterion(Object value, String condition, String property, Boolean isOr) {
            if (value == null) {
                throw new RuntimeException("Value for " + property + " cannot be null");
            }
            criteria.add(new Criterion(value, condition, isOr));
        }

新增Criterion构造方法(新增一个参数、需提前在Example类里的Criterion类新增一个布尔类型的orValue变量)

//新增:不同Criteria对象之间用and连接,同个对象之间不同查询条件之间可用or连接
        protected Criterion(Object value, String condition, Boolean isOr) {
            super();
            this.value = value;
            this.condition = condition;
            this.typeHandler = null;
            this.orValue = isOr;
        }

Mapper.xml文件

separator=“and”:表示不同Criteria对象之间用and连接
choose when:表示如果为真则用and或者or拼接的SQL语句

    <sql id="Example_Where_Clause">
        <where>
            <foreach collection="oredCriteria" item="criteria" separator="and">
                <if test="criteria.valid">
                    <trim prefix="(" prefixOverrides="and" suffix=")">
                        <foreach collection="criteria.criteria" item="criterion">
                            <choose>
                                <when test="criterion.noValue">
                                    and ${criterion.condition}
                                </when>
                                <when test="criterion.singleValue">
                                    and ${criterion.condition} #{criterion.value}
                                </when>
                                <when test="criterion.betweenValue">
                                    and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                                </when>
                                <when test="criterion.orValue">
                                    or ${criterion.condition} #{criterion.value}
                                </when>
                                <when test="criterion.listValue">
                                    and ${criterion.condition}
                                    <foreach close=")" collection="criterion.value" item="listItem" open="("
                                             separator=",">
                                        #{listItem}
                                    </foreach>
                                </when>
                            </choose>
                        </foreach>
                    </trim>
                </if>
            </foreach>
        </where>
    </sql>
### MyBatis Example 中使用 `or` 方法进行查询 在 MyBatis 的动态 SQL 查询中,可以通过 `org.apache.ibatis.session.SqlSession` 和 `Example` 来构建复杂的查询条件。其中,`Criteria` 是用于定义查询条件的核心之一,支持多种逻辑运算符,包括 `and` 和 `or`。 #### 使用 `or` 方法的语法说明 当需要组合多个条件并以逻辑 OR 关系连接时,可以调用 `criteria.or()` 来创建一个新的子条件组[^1]。以下是具体的方法描述: - 调用 `example.createCriteria().or()` 可以为当前 Criteria 对象添加新的 OR 子句。 - 每次调用 `or()` 后,都会返回一个新的 Criteria 实例,因此可以在该实例上继续设置其他条件。 #### 示例代码 下面是一个完整的示例,展示如何在 MyBatis Example 中使用 `or` 构建查询条件: ```java import org.apache.ibatis.session.SqlSession; import com.example.mapper.UserMapper; import com.example.model.User; import com.example.model.UserExample; public class MyBatisOrQueryExample { public static void main(String[] args) { try (SqlSession session = SqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); // 创建 Example 对象 UserExample example = new UserExample(); // 开始构建第一个 AND 条件 UserExample.Criteria criteria = example.createCriteria(); criteria.andUsernameLike("John%"); // 姓名以 John 开头 // 添加 OR 条件 UserExample.Criteria orCriteria = example.or(); // 新增一组 OR 条件 orCriteria.andEmailEqualTo("test@example.com"); // 邮箱等于 test@example.com // 执行查询 List<User> users = mapper.selectByExample(example); // 输出结果 for (User user : users) { System.out.println(user.getUsername() + " - " + user.getEmail()); } } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码展示了如何通过 `createCriteria()` 初始化一个标准条件,并通过 `or()` 方法新增另一组 OR 条件。 --- #### 注意事项 1. **多层嵌套**:如果需要更复杂的关系(如 `(A and B) or C`),则需合理利用括号分组的概念,在实际开发中可能涉及多次调用 `or()` 或者手动编写 XML 映射文件。 2. **性能优化**:对于大规模数据表,过多的 OR 条件可能导致索引失效,建议评估查询计划并适当调整设计[^3]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值