9. MyBatisPlus实现复杂查询

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);
}

MyBatisPlus是一个Java持久化框架,它提供了一些方法和工具来帮助实现复杂查询。其中,QueryWrapper是一个条件构造器,可以用于构建复杂查询条件。通过使用QueryWrapper,可以实现各种条件的组合和筛选。 QueryWrapper中的一些常用方法包括: 1. ge、gt、le、lt、isNull、isNotNull:用于比较字段的大小关系或判断字段是否为null。 2. eq、ne:用于判断字段是否等于或不等于指定的值。 3. between、notBetween:用于判断字段是否在指定的范围内。 4. allEq:用于判断多个字段是否都等于指定的值。 5. like、notLike、likeLeft、likeRight:用于模糊查询,判断字段是否包含指定的字符串。 6. in、notIn、inSql、notinSql、exists、notExists:用于判断字段是否在指定的集合中或者通过子查询的方式进行判断。 7. or、and:用于构建多个条件之间的逻辑关系。 8. orderBy、orderByDesc、orderByAsc:用于指定查询结果的排序方式。 9. last:用于追加自定义的SQL语句。 10. 指定要查询的列:可以通过select方法指定查询的列。 11. set、setSql:用于更新操作,设置更新的字段及值。 通过组合使用这些方法,可以构建出复杂查询条件,满足不同的查询需求。具体的使用方法可以参考MyBatisPlus的官方文档或源码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [9. MyBatisPlus实现复杂查询](https://blog.csdn.net/weixin_45267102/article/details/109142346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [MybatisPlus较全常用复杂查询引例(limit、orderby、groupby、having、like...)](https://blog.csdn.net/FHlang/article/details/111053977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值