9. MyBatisPlus实现复杂查询

本文介绍了使用 MyBatisPlus 进行复杂查询的方法,包括条件构造器的使用、各种查询条件的应用,如等值查询、范围查询、模糊查询等,并展示了如何进行排序、分组及结果限制。

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

MyBatisPlus实现复杂查询

在这里插入图片描述

1. wapper介绍

  • Wrapper : 条件构造抽象类,最顶端父类。
    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件。
      • QueryWrapperEntity 对象封装操作类,不是用lambda语法
      • UpdateWrapper : Update 条件封装,用于Entity对象更新操作。
      • AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
      • LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
      • LambdaUpdateWrapper : Lambda 更新封装Wrapper

在这里插入图片描述

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class QueryWrapperTests {

        @Autowired
        private UserMapper userMapper;
    }

2. AbstractWrapper

  1. 注意:以下条件构造器的方法入参中的 column均表示数据库字段
  2. 以下查询条件都是在AbstractWrapper中定义的。
2.1 ge、gt、le、lt、isNull、isNotNull
    /**
     * ge 大于等于
     * gt 大于
     * le 小于等于
     * lt 小于
     * isNull 是null
     * isNotNull 不是nul
     * 执行的也是逻辑删除
     */
    @Test
    public void testDelete() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNull("create_time").ge("age", 21).isNotNull("email");
        
        int result = userMapper.delete(queryWrapper);
        System.out.println("result = " + result);
    }
2.2 eq、ne

**注意:**seletOne返回的是一条实体记录,当出现多条时会报错

    /**
     * selectOne返回的是一条实体记录,当出现多条时会报错
     * eq 等于
     * ne 不等于
     */
    @Test
    public void testSelectOne(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name","Sandy");
        
        User user = userMapper.selectOne(queryWrapper);
        System.out.println("user = " + user);
    }
2.3 between、notBetween
   /**
     * between 包含大小边界
     */
    @Test
    public void testSelectCount(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        
        queryWrapper.between("age",22,30);
        
        Integer count = userMapper.selectCount(queryWrapper);
        System.out.println("count = " + count);
    }
2.4 allEq
    /**
     * allEq等于所有
     * select id,name,age,email,create_time,update_time,version,deleted from user where deleted=0 and name= 'HeMiao'and age = 28
     */
    @Test
    public void testSelctList(){

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        Map<String,Object> map = new HashMap<>();
        map.put("name","HeMiao");
        map.put("age",28);
        
        queryWrapper.allEq(map);
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }
2.5 like、notLike、likeLeft、likeRight

selectMaps返回Map集合列表

    /**
     * like
     * notLike
     * likeLeft
     * likeRight
     */
    @Test
    public void testSelectMaps(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name","2");
        
        List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
        maps.forEach(System.out::println);
    }
2.6 in、notIn、inSql、notinSql、exists、notExists

in、notIn:

inSql、notinSql:可以实现子查询

  • 例: inSql("age", "1,2,3,4,5,6")—>age in (1,2,3,4,5,6)
  • 例: inSql("id", "select id from table where id < 3")—>id in (select id from table where id < 3)
2.7 or、and
  1. **注意:**这里使用的是 UpdateWrapper
  2. 不调用or则默认为使用 and
@Test
public void testUpdate1() {

    //修改值
    User user = new User();
    user.setAge(99);
    user.setName("Andy");

    //修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .or()
        .between("age", 20, 30);

    int result = userMapper.update(user, userUpdateWrapper);

    System.out.println(result);
}
2.8 嵌套or、嵌套and

这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号

@Test
public void testUpdate2() {


    //修改值
    User user = new User();
    user.setAge(99);
    user.setName("Andy");

    //修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .or(i -> i.eq("name", "李白").ne("age", 20));

    int result = userMapper.update(user, userUpdateWrapper);

    System.out.println(result);
}
2.9 orderBy、orderByDesc、orderByAsc
   /**
     * orderBy
     * orderByDesc 降序
     * orderBYAsc  升序
     */
    @Test
    public void testSelectListOrderBy(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id");
        
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }
2.10 last
  1. 直接拼接到 sql 的最后
  2. 注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用。
@Test
public void testSelectListLast() {

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.last("limit 1");

    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}
2.11 指定要查询的列
  • queryWrapper.select("id","name","age");
   @Test
    public void testSelectListColumn(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        
        queryWrapper.select("id","name","age");
        
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }
2.12 set、setSql

最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段

@Test
public void testUpdateSet() {

    //修改值
    User user = new User();
    user.setAge(99);

    //修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .set("name", "老李头")//除了可以查询还可以使用set设置修改的字段
        .setSql(" email = '123@qq.com'");//可以有子查询

    int result = userMapper.update(user, userUpdateWrapper);
}

你给的 package com.app.service.impl; import java.util.List; import java.util.Map; import com.app.service.UsersService; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.app.dao.UsersDao; import com.app.entity.UsersEntity; import com.app.utils.PageUtils; import com.app.utils.Query; /** 系统用户服务实现类 使用 MyBatis-Plus 3.5.3 + Spring Boot 3.5.3 + Java 17 @author */ @Service(“userService”) public class UsersServiceImpl extends ServiceImpl<UsersDao, UsersEntity> implements UsersService { /** 分页查询用户数据(基础版) @param params 查询参数 @return 分页工具对象 */ @Override public PageUtils queryPage(Map<String, Object> params) { // 创建分页对象(使用新版本Page类) Page page = new Query(params).getPage(); // 使用QueryWrapper替代过时的EntityWrapper QueryWrapper queryWrapper = new QueryWrapper<>(); // 执行分页查询 Page resultPage = baseMapper.selectPage(page, queryWrapper); return new PageUtils(resultPage); } /** 自定义条件查询用户列表 @param wrapper 查询条件包装器 @return 用户实体列表 */ @Override public List selectListView(Wrapper wrapper) { return baseMapper.selectListView(wrapper); } /** 分页查询用户数据(增强版) @param params 查询参数 @param wrapper 自定义查询条件 @return 分页工具对象 */ @Override public PageUtils queryPage(Map<String, Object> params, Wrapper wrapper) { // 创建分页对象(新版本构造方式) Page page = new Query(params).getPage(); // 执行分页查询(使用条件构造器) Page resultPage = baseMapper.selectListView(page, wrapper); return new PageUtils(resultPage); } } 出现了类“UsersServiceImpl”必须声明为抽象,或为实现“UsersService”中的抽象方法“selectList(Wrapper)”方法未从其超类重写方法不兼容的类型。实际为 Page&#39;,需要 &#39;com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.app.entity.UsersEntity>&#39;无法解析构造函数 ‘PageUtils(Page)‘方法未从其超类重写方法’com.app.service.impl.UsersServiceImpl’ 中的 ‘queryPage(Map<String, Object>, Wrapper)’ 与 ‘com.app.service.UsersService’ 中的 ‘queryPage(Map<String, Object>, Wrapper)’ 冲突;返回类型不兼容不兼容的类型。实际为 Page’,需要 &#39;com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.app.entity.UsersEntity>‘不兼容的类型。实际为 java.util.List<com.app.entity.UsersEntity>’,需要 &#39;com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.app.entity.UsersEntity>&#39;无法解析构造函数 ‘PageUtils(Page)’ UsersService的代码如下package com.app.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.app.entity.UsersEntity; import com.baomidou.mybatisplus.core.metadata.IPage; import java.util.List; import java.util.Map; /** * 系统用户服务接口 */ public interface UsersService extends IService<UsersEntity> { /** * 分页查询用户 * @param params 查询参数 * @param wrapper 查询条件 * @return 分页结果 */ IPage<UsersEntity> queryPage(Map<String, Object> params, Wrapper<UsersEntity> wrapper); /** * 查询用户列表 * @param wrapper 查询条件 * @return 用户列表 */ List<UsersEntity> selectList(Wrapper<UsersEntity> wrapper); }
07-12
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值