mybatisplus中的and 和 or 以及 时间的比较

本文介绍了在MybatisPlus中使用LambdaQueryWrapper进行SQL拼接,特别是处理OR逻辑、AND查询的区别,以及如何在查询中正确运用时间比较函数,如ge()、gt()等。

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

今天拼接了一个使用mybatisplus拼接了一个sql不是很难但是遇见了 or 这种情况,记录一下

sql如下:

                 Integer count =
                        orderTradeService.lambdaQuery()
                                .eq(OrderTrade::getMemberId, uId)
                                .or()
                                .eq(OrderTrade::getNeedMemberId, uId)
                                .eq(OrderTrade::getStatus, 40)
                                .or()
                                .eq(OrderTrade::getStatus, 70)
                                .ge(OrderTrade::getCreateTime,item.getCreateTime())
                                .count();
1、与or 相对应的还有一个and 其实就是我们平时的多字段查询 
and 查询时同时满足a 和 b
 LambdaQueryWrapper<Object> and = new LambdaQueryWrapper<>().eq(A,a).eq(B,b);
or  查询时满足a 或 b
 LambdaQueryWrapper<Object> and = new LambdaQueryWrapper<>().eq(A,a).or().eq(B,b);
2、时间的比较,就是如何拼接比较大小
原符号       <       <=      >       >=      <>
对应函数    lt()     le()    gt()    ge()    ne()
Mybatis-plus写法:  queryWrapper.ge("create_time", localDateTime);
Mybatis写法:       where create_time >= #{localDateTime}

<think>我们正在讨论MyBatis-Plus的LambdaQueryWrapperPageHelper的使用。根据引用[1]引用[2],我们可以提供以下指南: 1. **LambdaQueryWrapper**:MyBatis-Plus提供的链式条件构造器,使用Lambda表达式,避免字段名的魔法值。 2. **PageHelper**:独立的分页插件,通过ThreadLocal机制实现分页,与MyBatis-Plus的分页方式不同。 我们将分别说明两者的使用步骤,并对比它们的特点。 ### 1. MyBatis-Plus LambdaQueryWrapper 使用指南 LambdaQueryWrapper 是 MyBatis-Plus 提供的查询条件构造器,支持 Lambda 表达式,可避免字段名写错的问题。 #### 基本使用 ```java // 注入Mapper @Autowired private UserMapper userMapper; // 示例:查询年龄大于18且名字包含"张"的用户列表 List<User> userList = userMapper.selectList( new LambdaQueryWrapper<User>() .ge(User::getAge, 18) // age >= 18 .like(User::getName, "张") // name like '%张%' .orderByDesc(User::getCreateTime) // 按创建时间倒序 ); ``` #### 复杂条件 ```java // 组合条件:年龄大于18或小于12,且状态为启用 List<User> userList = userMapper.selectList( new LambdaQueryWrapper<User>() .and(wq -> wq .ge(User::getAge, 18) .or() .lt(User::getAge, 12) ) .eq(User::getStatus, 1) // status = 1 ); ``` #### 分页查询(使用MyBatis-Plus分页) 需要先配置分页插件(见引用[1]): ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } ``` 然后使用`Page`对象进行分页: ```java // 第2页,每页10条 Page<User> page = new Page<>(2, 10); // 构建查询条件 LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>() .ge(User::getAge, 18) .orderByDesc(User::getCreateTime); // 执行分页查询 Page<User> result = userMapper.selectPage(page, queryWrapper); // 获取结果 List<User> records = result.getRecords(); // 当前页数据 long total = result.getTotal(); // 总记录数 ``` ### 2. PageHelper 使用指南 PageHelper 是独立于 MyBatis-Plus 的分页插件,通过静态方法设置分页参数。 #### 配置依赖 在`pom.xml`中添加: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>最新版本</version> </dependency> ``` #### 基本使用 ```java @Autowired private UserMapper userMapper; // 可以是MyBatis的Mapper或MyBatis-Plus的Mapper public PageInfo<User> listUsers(int pageNum, int pageSize) { // 设置分页参数(紧跟在查询语句前调用) PageHelper.startPage(pageNum, pageSize); // 执行查询(无需再传入分页参数) List<User> users = userMapper.selectList(null); // 这里可以是任意查询方法 // 用PageInfo包装结果 return new PageInfo<>(users); } ``` #### 复杂查询支持 PageHelper 支持复杂SQL,包括嵌套查询(引用[1]提到PageHelper对复杂SQL支持更好): ```java PageHelper.startPage(1, 10); List<User> users = userMapper.selectComplexQuery(); // 复杂SQL查询 PageInfo<User> pageInfo = new PageInfo<>(users); ``` ### 3. 对比总结 | 特性 | MyBatis-Plus 分页 | PageHelper | |---------------------|---------------------------------------|--------------------------------| | 依赖 | 需集成MyBatis-Plus | 独立JAR包 | | 启动方式 | 构造`Page`对象传参 | `PageHelper.startPage()`静态方法 | | 返回值 | `IPage`接口对象 | `PageInfo`包装List | | 复杂SQL支持 | 有限制(如嵌套查询可能失效) | 支持更复杂SQL场景 | | 多数据源支持 | 需要特殊配置 | 天然支持 | | 与ORM集成 | 深度集成条件构造器 | 兼容任何MyBatis用法 | > 注意:MyBatis-Plus 3.5.7版本后优化了分页插件(引用[2]),但复杂SQL场景仍推荐PageHelper。 ### 最佳实践建议 - **简单查询**:优先使用MyBatis-Plus的LambdaQueryWrapper + 内置分页,代码更简洁。 - **复杂SQL(如嵌套查询、多表连接)**:使用PageHelper避免分页失效问题[^1]。 - **多数据源**:PageHelper天然支持多数据源分页,而MyBatis-Plus需要额外配置分页插件[^1]。 §§相关问题§§ 1. MyBatis-Plus LambdaQueryWrapper 如何实现动态条件查询? 2. PageHelper 分页原理是什么? 3. 如何解决 MyBatis-Plus 分页在复杂SQL场景下失效的问题?</think>### MyBatis-Plus LambdaQueryWrapper 与 PageHelper 使用指南 #### 一、LambdaQueryWrapper 使用说明 LambdaQueryWrapper 是 MyBatis-Plus 提供的类型安全查询构造器,使用 Lambda 表达式避免字段名的魔法值(magic strings),提升代码可读性可维护性。 **基础用法示例**: ```java // 查询年龄大于18的用户 List<User> users = userMapper.selectList( new LambdaQueryWrapper<User>() .gt(User::getAge, 18) // age > 18 .like(User::getName, "张") // name LIKE '%张%' .orderByDesc(User::getCreateTime) // 按创建时间倒序 ); // 复杂条件组合 List<User> users = userMapper.selectList( new LambdaQueryWrapper<User>() .and(wq -> wq .eq(User::getStatus, 1) // status = 1 .or() .isNotNull(User::getEmail) // email IS NOT NULL ) .select(User::getId, User::getName) // 仅查询指定字段 ); ``` **核心特性**: 1. 类型安全:通过 `实体类::字段` 方式引用字段 2. 链式调用:支持 `and`/`or` 条件组合 3. 条件方法: - `eq()`:等于 - `gt()`:大于 - `lt()`:小于 - `like()`:模糊匹配 - `in()`:IN 查询 - `orderByAsc()`/`orderByDesc()`:排序 4. 支持嵌套查询(需注意性能)[^1] #### 二、PageHelper 分页使用指南 PageHelper 是独立的 MyBatis 分页插件,通过 ThreadLocal 机制实现分页参数传递。 **配置步骤**: 1. 添加依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>最新版本</version> </dependency> ``` 2. 基础分页查询: ```java // 设置分页参数(第2页,每页10条) PageHelper.startPage(2, 10); // 执行查询(紧跟startPage()) List<User> users = userMapper.selectList(null); // 用PageInfo包装结果 PageInfo<User> pageInfo = new PageInfo<>(users); // 获取分页数据 pageInfo.getList(); // 当前页数据 pageInfo.getTotal(); // 总记录数 pageInfo.getPages(); // 总页数 ``` **复杂场景处理**: ```java // 多表关联查询分页 PageHelper.startPage(1, 5, "u.create_time DESC"); List<Map<String, Object>> result = userMapper.selectUserWithOrders(); // 手动分页(对内存列表分页) List<User> allUsers = getUserList(); PageInfo<User> page = PageHelper.startPage(2, 10).doSelectPageInfo( () -> processData(allUsers) // 处理数据的回调 ); ``` #### 三、对比决策建议 | 场景 | 推荐方案 | 原因 | |--------------------------|------------------------|----------------------------------------------------------------------| | 单表简单分页 | MyBatis-Plus 内置分页 | 深度集成,无需额外依赖[^1] | | 复杂SQL/多表关联分页 | PageHelper | 对复杂SQL支持更好,嵌套查询不易失效[^1] | | 需要多数据源支持 | PageHelper | 天然支持多数据源分页 | | 需要强类型条件构造 | LambdaQueryWrapper | 编译期类型检查,避免字段名错误 | | 需要自定义COUNT查询 | MyBatis-Plus 分页 | 通过`@SqlParser`注解可自定义COUNT语句 | > **最佳实践**:在Spring Boot项目中,可同时配置两种分页方式。简单查询用`IPage`+`LambdaQueryWrapper`,复杂场景切到PageHelper[^1]。 #### 四、常见问题解决 1. **PageHelper分页失效**: - 确保`startPage()`后**立即执行查询** - 避免在`startPage()`查询语句间插入其他数据库操作 - 多数据源时需指定`PageHelper`使用的数据源 2. **LambdaQueryWrapper性能优化**: ```java // 关闭SELECT * (默认开启) new LambdaQueryWrapper<User>() .select(User::getId, User::getName) // 显式指定字段 .last("FOR UPDATE"); // 追加自定义SQL ``` 3. **联合使用示例**: ```java // 用Lambda构造条件 + PageHelper分页 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>() .eq(User::getStatus, 1); PageHelper.startPage(1, 10); List<User> users = userMapper.selectList(wrapper); PageInfo<User> page = new PageInfo<>(users); ``` > 升级到MyBatis-Plus 3.5.7+可获得更好的Lambda表达式支持(引用[2])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值