mybatisplus使用进阶之条件构造器以及分页查询使用详解

上一篇文章中简单的整合了spring boot 与mybatisplus,本篇文章主要介绍一下mybatisplus中条件构造器以及分页插件的使用.

1.条件构造器

QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 和父类AbstractWrapper中提供了许多的操作sql的方法。mybatisplus提供这些实体包装器,用于处理 sql 拼接,排序,实体参数查询等!。

条件参数说明:

查询方式说明
andAND 语句,拼接 + AND 字段=值
orOR 语句,拼接 + OR 字段=值
eq等于=
allEq基于 map 内容等于=
ne不等于<>
gt大于>
ge大于等于>=
lt小于<
le小于等于<=
like模糊查询 LIKE
notLike模糊查询 NOT LIKE
inIN 查询
notInNOT IN 查询
isNullNULL 值查询
isNotNullIS NOT NULL
groupBy分组 GROUP BY
havingHAVING 关键词
orderBy排序 ORDER BY
orderAscASC 排序 ORDER BY
orderDescDESC 排序 ORDER BY
existsEXISTS 条件语句
notExistsNOT EXISTS 条件语句
betweenBETWEEN 条件语句
notBetweenNOT BETWEEN 条件语句
last拼接在最后,例如:last("LIMIT 1")

1.1 查询相关

下面只列举部分方法使用,其余方法都是类似使用的

1.1.1 查询单个

    @Test
    void queryByQueryWrapper(){
        // 创建查询wrapper构造器
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 设置条件为id=1 and age is not null
        queryWrapper.eq("id",1).isNotNull("age");
        User user = userMapper.selectOne(queryWrapper);
        LOG.info("user : {}",user);
    }

结果如下:

1.1.2 查询多个(queryWrapper构造器和map方式比较)

上述是使用构造器查询单个结果,如果需要查询多个结果则需使用其他的方法(可以使用构造器也可以使用map),下面是一个简单的示例:

    @Test
    void queryList(){
        User user = new User();
        user.setAge(20);
        // 创建查询wrapper构造器
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper = new QueryWrapper<>();
        /**
         * 条件构造器中这些方法中出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中,不传默认是true
         * 该参数可以用于校验要使用的参数是否付和规范,符合就加入到sql中
         */
        queryWrapper.eq(Objects.nonNull(user),"age",user.getAge()).isNotNull("age");
        // 如果传入null则查询所有
        List<User> userList = userMapper.selectList(queryWrapper);
        userList.forEach(u ->{
            LOG.info("user : {}",u);
        });
        userList.clear();
        // 除了使用构造器外还可以使用map
        LOG.info("===========map============");
        // map条件查询,key为列名,value为具体的值
        Map<String,Object> map = new HashMap<>();
        map.put("age",20);
        // 如果传入的参数为null则查询所有
        userList = userMapper.selectByMap(map);
        userList.forEach(u ->{
            LOG.info("user : {}",u);
        });
    }

结果如下:

上述对于等值比较使用构造器和map获取的结果是一致的,他们的区别是:map只能做等值比较,如果还需要做其它的条件比如大于某个值时是没办法处理的而构造器就能使用自己的gt()方法去操作。

1.1.3  LambdaQueryWrapper使用

mybatisplus也支持使用lambda表达式,相比较于QueryWrapper指定列名的时候不是使用字符串而是使用对于字段的get方法,列名直接使用对象属性名无需再写字符串(ps:后续列名改变后,在idea只需使用shift+f6改变对象属性名,所有的引用改字段的get方法之类也会自动改变),具体如下使用:

 LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getAge,20).isNotNull(User::getName);
        // 如果传入null则查询所有
        userList = userMapper.selectList(lambdaQueryWrapper);
        userList.forEach(u ->{
            LOG.info("user : {}",u);
        });

结果如下:

1.2 update相关

    @Test
    void testUpdate(){
        // 创建相应update构造器
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        // 设置条件将所有年龄为22时将年龄设置成20
        userUpdateWrapper.eq("age",22).set("age",20);
        // 根据构造器修改符合条件的数据
        int count = userMapper.update(new User(),userUpdateWrapper);
        LOG.info("count : {}",count);
        List<User> userList = userMapper.selectByMap(null);
        userList.forEach(u ->{
            LOG.info("user : {}",u);
        });
        LOG.info("=============update by id==========");
        // 获取要修改的对象
        User user = userMapper.selectById(1);
        LOG.info("update before user : {}",user);
        user.setName("test");
        // 根据传入对象的id去修改指定的记录
        count = userMapper.updateById(user);
        LOG.info("count : {}",count);
        user = userMapper.selectById(1);
        LOG.info("updateById after user : {}",user);
    }

1.3 插入记录

    @Test
    void testInsert(){
        User user = new User();
        user.setName("test_8");
        user.setAge(19);
        user.setEmail("test@a.com");
        int count = userMapper.insert(user);
        LOG.info("插入成功:{}条",count);
    }

结果:

1.4 删除相关

    @Test
    void testDelete(){
        // 使用条件构造器删除符合条件的,使用QueryWrapper和UpdateWrapper都行,没有删除相关的wrapper
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        int count = userMapper.delete(queryWrapper.eq("name","test_8"));
        LOG.info("删除成功:{}条",count);
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        count = userMapper.delete(updateWrapper.eq("name","Jone_u"));
        LOG.info("删除成功:{}条",count);
        // 使用map删除
        Map<String,Object> map = new HashMap<>();
        map.put("id",7);
        count = userMapper.deleteByMap(map);
        LOG.info("删除成功:{}条",count);
        // 使用id删除
        count = userMapper.deleteById(5);
        LOG.info("删除成功:{}条",count);
    }

2. 分页查询

2.1 配置分页查询所需配置类

@EnableTransactionManagement
@Configuration
@MapperScan("com.le.mybatis_plus.mapper.*mapper*")
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        return paginationInterceptor;
    }
}

2.2 使用demo

    @Test
    void testPagination(){
        Page<User> page = new Page<>();
        // 设置当前是哪一页,页数从1开始,传入小于1的数据都会当作1处理
        page.setCurrent(-1);
        // 设置每页的数据大小
        page.setSize(2);
        IPage<User> userIPage = userMapper.selectPage(page,null);
        // 获取数据库中总记录数
        LOG.info("total : {}",userIPage.getTotal());
        // 打印当前页中所有记录
        userIPage.getRecords().forEach(user -> {
            LOG.info("user : {}",user);
        });
    }

具体结果如下:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Mybatisplus 自定义sql 使用条件构造器可以在自定义 SQL 语句中使用 Mybatisplus 的条件构造器,方便快捷地构造查询条件使用步骤: 1. 在 Mapper 接口中定义自定义 SQL 语句的方法,方法返回值为 List 或者其他需要返回的结果类型。 2. 在自定义 SQL 语句中使用 ${} 占位符来引用条件构造器生成的 SQL 片段。 3. 在方法参数中使用 @Param 注解来指定条件构造器生成的 SQL 片段的参数名称和类型,同时在自定义 SQL 语句中使用 #{参数名} 占位符来引用参数。 4. 在方法中使用 QueryWrapper 类来构造查询条件,然后将 QueryWrapper 对象作为参数传递给自定义 SQL 语句方法即可。 示例代码如下: ``` @Mapper public interface UserMapper extends BaseMapper<User> { @Select("SELECT * FROM user ${ew.customSqlSegment}") List<User> selectByCustomSql(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper); } ``` 其中,${ew.customSqlSegment} 是 Mybatisplus 条件构造器生成的 SQL 片段,@Param(Constants.WRAPPER) 指定了 wrapper 参数的名称和类型。 调用示例: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("age", 18).like("name", "张"); List<User> userList = userMapper.selectByCustomSql(wrapper); ``` 以上代码中,使用 QueryWrapper 构造了查询条件,然后将 QueryWrapper 对象作为参数传递给 selectByCustomSql 方法,该方法会根据传入的 QueryWrapper 对象生成自定义 SQL 语句,并返回符合条件的用户列表。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值