mybatis条件构造器及其常用的条件筛选

50 阅读2分钟

条件构造器

QueryWrapper (普通方式)

JavaQueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三")
            .between("age", 20, 30)
            .like("email", "test");
List<User> users = userMapper.selectList(queryWrapper);

LambdaQueryWrapper (Lambda 表达式方式,推荐)

JavaLambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName, "张三")
                 .between(User::getAge, 20, 30)
                 .like(User::getEmail, "test");
List<User> users = userMapper.selectList(lambdaQueryWrapper);

更新操作

// 条件更新
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "张三")
             .set("age", 30)
             .set("email", "new@email.com");
userMapper.update(null, updateWrapper);
​
// Lambda 方式
LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(User::getName, "张三")
                  .set(User::getAge, 30)
                  .set(User::getEmail, "new@email.com");
userMapper.update(null, lambdaUpdateWrapper);

分页查询

// 配置分页插件
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
​
// 使用分页
Page<User> page = new Page<>(1, 10); // 当前页,每页大小
Page<User> userPage = userMapper.selectPage(page, queryWrapper);
List<User> records = userPage.getRecords();
long total = userPage.getTotal();

逻辑删除配置

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted  # 逻辑删除字段名
      logic-delete-value: 1       # 逻辑已删除值
      logic-not-delete-value: 0   # 逻辑未删除值

常见条件方法

类似的将对应的参数传入构造器,把构造器在传入方法中让他进行查询。

使用的是链式调用所以后面加很多.().()

1. 等值查询 (eq)

.eq(User::getName, "张三")

相当于 SQL: name = '张三'

2.不等查询 (ne)

.ne(User::getName, "张三")

相当于 SQL: name != '张三'

3. 大于 (gt)

.gt(User::getAge, 18)

相当于 SQL: age > 18

4. 大于等于 (ge)

.ge(User::getAge, 18)

相当于 SQL: age >= 18

5. 小于 (lt)

.lt(User::getAge, 60)

7. 区间查询 (between)

.between(User::getAge, 20, 30)

相当于 SQL: age BETWEEN 20 AND 30

8. 不在区间 (notBetween)

.notBetween(User::getAge, 20, 30)

相当于 SQL: age NOT BETWEEN 20 AND 30

9. 模糊查询 (like)

.like(User::getEmail, "test")

相当于 SQL: email LIKE '%test%'

10. 左模糊 (likeLeft)

.likeLeft(User::getEmail, "test")

相当于 SQL: email LIKE '%test'

11. 右模糊 (likeRight)

.likeRight(User::getEmail, "test")

相当于 SQL: email LIKE 'test%'

12. 不模糊匹配 (notLike)

.notLike(User::getEmail, "test")

相当于 SQL: email NOT LIKE '%test%'

13. 包含 (in)

.in(User::getAge, Arrays.asList(18, 20, 22))

相当于 SQL: age IN (18, 20, 22)

14. 不包含 (notIn)

.notIn(User::getAge, Arrays.asList(18, 20, 22))

相当于 SQL: age NOT IN (18, 20, 22)

15. 为空 (isNull)

.isNull(User::getEmail)

相当于 SQL: email IS NULL

16. 不为空 (isNotNull)

.isNotNull(User::getEmail)

相当于 SQL: email IS NOT NULL

17. 分组 (groupBy)

.groupBy(User::getDeptId)

相当于 SQL: GROUP BY dept_id

18. 排序 (orderBy)

Java.orderByAsc(User::getAge)  // 升序
.orderByDesc(User::getSalary) // 降序

相当于 SQL: ORDER BY age ASC, salary DESC

19. 或条件 (or)

.or().eq(User::getName, "张三").eq(User::getName, "李四")

相当于 SQL: OR (name = '张三' AND name = '李四')

20. 嵌套条件 (nested)

.nested(wq -> wq.eq(User::getName, "张三").or().eq(User::getName, "李四"))

相当于 SQL: (name = '张三' OR name = '李四')

更新操作特有方法

1. 设置值 (set)

.set(User::getAge, 30)
.set(User::getEmail, "new@example.com")

相当于 SQL: SET age = 30, email = 'new@example.com'

2. 自增 (setSql)

.setSql("age = age + 1")

相当于 SQL: SET age = age + 1

3. 自减 (setSql)

.setSql("stock = stock - 1")

相当于 SQL: SET stock = stock - 1