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

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

1.条件构造器

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

条件参数说明:

查询方式 说明
and AND 语句,拼接 + AND 字段=值
or OR 语句,拼接 + OR 字段=值
eq 等于=
allEq 基于 map 内容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查询 LIKE
notLike 模糊查询 NOT LIKE
in IN 查询
notIn NOT IN 查询
isNull NULL 值查询
isNotNull IS NOT NULL
groupBy 分组 GROUP BY
having HAVING 关键词
orderBy 排序 ORDER BY
orderAsc ASC 排序 ORDER BY
orderDesc DESC 排序 ORDER BY
exists EXISTS 条件语句
notExists NOT EXISTS 条件语句
between BETWEEN 条件语句
notBetween NOT BETWEEN 条件语句
last 拼接在最后,例如:last("LIMIT 1")

1.1 查询相关

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

1.1.1 查询单个

    @Test
    void queryByQueryWrapper(){
        // 创建查询wrapper构造器
        QueryWrapper 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);
    }

结果如下:

mybatisplus使用进阶之条件构造器以及分页查询使用详解_第1张图片

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

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

    @Test
    void queryList(){
        User user = new User();
        user.setAge(20);
        // 创建查询wrapper构造器
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper = new QueryWrapper<>();
        /**
         * 条件构造器中这些方法中出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中,不传默认是true
         * 该参数可以用于校验要使用的参数是否付和规范,符合就加入到sql中
         */
        queryWrapper.eq(Objects.nonNull(user),"age",user.getAge()).isNotNull("age");
        // 如果传入null则查询所有
        List userList = userMapper.selectList(queryWrapper);
        userList.forEach(u ->{
            LOG.info("user : {}",u);
        });
        userList.clear();
        // 除了使用构造器外还可以使用map
        LOG.info("===========map============");
        // map条件查询,key为列名,value为具体的值
        Map 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 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 userUpdateWrapper = new UpdateWrapper<>();
        // 设置条件将所有年龄为22时将年龄设置成20
        userUpdateWrapper.eq("age",22).set("age",20);
        // 根据构造器修改符合条件的数据
        int count = userMapper.update(new User(),userUpdateWrapper);
        LOG.info("count : {}",count);
        List 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("[email protected]");
        int count = userMapper.insert(user);
        LOG.info("插入成功:{}条",count);
    }

结果:

1.4 删除相关

    @Test
    void testDelete(){
        // 使用条件构造器删除符合条件的,使用QueryWrapper和UpdateWrapper都行,没有删除相关的wrapper
        QueryWrapper queryWrapper = new QueryWrapper<>();
        int count = userMapper.delete(queryWrapper.eq("name","test_8"));
        LOG.info("删除成功:{}条",count);
        UpdateWrapper updateWrapper = new UpdateWrapper<>();
        count = userMapper.delete(updateWrapper.eq("name","Jone_u"));
        LOG.info("删除成功:{}条",count);
        // 使用map删除
        Map 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 page = new Page<>();
        // 设置当前是哪一页,页数从1开始,传入小于1的数据都会当作1处理
        page.setCurrent(-1);
        // 设置每页的数据大小
        page.setSize(2);
        IPage userIPage = userMapper.selectPage(page,null);
        // 获取数据库中总记录数
        LOG.info("total : {}",userIPage.getTotal());
        // 打印当前页中所有记录
        userIPage.getRecords().forEach(user -> {
            LOG.info("user : {}",user);
        });
    }

具体结果如下:

mybatisplus使用进阶之条件构造器以及分页查询使用详解_第2张图片

你可能感兴趣的:(spring,boot,mybatisplus)