MyBatis-Plus分页以及常用条件构造器


书接上回: MyBatis-Plus的CRUD
会包含一些Java8新特性的使用
在上一篇的配置下继续进行分页以及条件构造器的学习测试

条件构造器

在这里插入图片描述
Wrapper:条件构造抽象类,最顶端父类

  • AbstractWrapper:用于查询条件封装,生成sql的where条件
    • QueryWrapper:查询条件封装
    • UpdateWrapper:Update条件封装
      • LambdaQueryWrapper:用于Lambda语法使用的查询Wrapper
      • LambdaUpdateWrapper:Lambda更新封装Wrapper

昨天的CRUD测试已经用到过QueryWrapper这种方式,今天就使用一些其他的方法

1.QueryWrapper

在这里插入图片描述

 /**
     * 测试子查询
     * 
     * SELECT sid,sname,sex,age,birthday,hobby,province FROM student WHERE (sid IN (select sid from student where sex = '男'))
     */
    @Test
    void testSonSelect(){
        QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
        queryWrapper.inSql("sid","select  sid from student where sex = '男'");
        List<Student> students = studentMapper.selectList(queryWrapper);
        students.forEach(System.out::println);
    }

/**
     * 测试组装条件
     * SELECT sid,sname,sex,age,birthday,hobby,province FROM student WHERE (hobby LIKE ?)
     */
    @Test
    void testAssembleCondition(){
        String sname = "";
        String hobby = "皮卡";
        QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotBlank(sname)) {
            //isNotBlank判断字符串是否不为null,不为空字符串,不为空白符
            queryWrapper.like("sname",sname);
        }
        if (StringUtils.isNotBlank(hobby)) {
            queryWrapper.like("hobby", hobby);
        }
        List<Student> students = studentMapper.selectList(queryWrapper);
        students.forEach(System.out::println);
    }

/**
     * boolean condition,条件符合则组装条件
     * SELECT sid,sname,sex,age,birthday,hobby,province FROM student WHERE (hobby LIKE ?)
     */
    @Test
    void testCondition(){
        String sname = "";
        String hobby = "皮卡";
        QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(sname),"sname",sname)
                .like(StringUtils.isNotBlank(hobby),"hobby",hobby);
        List<Student> students = studentMapper.selectList(queryWrapper);
        students.forEach(System.out::println);
    }

2.UpdateWrapper

/**
     * 测试updateWrapper
     * 将用户名包含张且sex=男或者为null的用户信息修改
     * 其实使用QueryWrapper效果一样(目前看来)
     * UPDATE student SET sname=?,sex=? WHERE (sname LIKE ? AND (sex LIKE ? OR sex IS NULL))
     */
    @Test
    void testUpdateWrapper(){
        UpdateWrapper<Student> updateWrapper = new UpdateWrapper<>();
        updateWrapper.like("sname","张")
        //i指代一个条件构造器, -> 是lambda表达式
                .and(i -> i.like("sex","男").or().isNull("sex"));
        updateWrapper.set("sname","李四").set("sex","女");
        //因为使用了修改条件构造器,所以实体可以设置为null
        int update = studentMapper.update(null, updateWrapper);
        Assert.assertEquals(update,8);
    }

3.LambdaQueryWrapper

/**
     * LambdaQueryWrapper
     *模糊查询hobby中含有皮卡的,年龄在10到20之间
     * SELECT sid,sname,sex,age,birthday,hobby,province FROM student WHERE (hobby LIKE ? AND age >= ? AND age <= ?)
     */
    @Test
    void testLambdaQuery(){
        String sname = "";
        String hobby = "皮卡";
        Integer start = 10;
        Integer end = 20;
        LambdaQueryWrapper<Student> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(sname),Student::getSname,sname)
                .like(StringUtils.isNotBlank(hobby),Student::getHobby,hobby)
                //ge-----greater than 大于
                .ge(Student::getAge,start)
                //le ----- less then  小于
                .le(Student::getAge,end);
        List<Student> students = studentMapper.selectList(queryWrapper);
        students.forEach(System.out::println);
    }

4.LambdaUpdateWrapper

/**
     * LambdaUpdate
     * UPDATE student SET age=? WHERE ((hobby LIKE ?))
     */
    @Test
    void testLambdaUpdate(){
        String sname = "";
        String hobby = "打";
        LambdaUpdateWrapper<Student> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.like(StringUtils.isNotBlank(sname),Student::getSname,sname)
                .and(i-> i.like(Student::getHobby,hobby));
        updateWrapper.set(Student::getAge,15);
        studentMapper.update(null,updateWrapper);

    }

Page分页

1.配置与上篇一致

2.编写mp的插件配置

@Configuration
@MapperScan("com/lqz/springboot11mybatisplus/mapper")
public class MyBatisPlusConfig {

    /**
     * 配置mp拦截器,分页插件
     * @return
     */
    @Bean
    public MybatisPlusInterceptor getMybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //添加分页插件,指定数据库类型MYSQL
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return mybatisPlusInterceptor;
    }
}

3. 自定义分页方法

 public interface StudentMapper extends BaseMapper<Student> {

    /**
     * 通过年龄查询学生信息并分页
     * @param page MyBatis-Plus提供的分页对象,必须位于第一个参数的位置
     * @param age
     * @return
     */
    Page<Student> selectPageVo(@Param("page") Page<Student> page,@Param("age") Integer age);

}

4. 编写service

    Page<Student> selectPageVo(@Param("page") Page<Student> page, @Param("age") Integer age);

5.编写serviceImpl

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student>
    implements StudentService{

    @Resource
    private StudentMapper mapper;

    @Override
    public Page<Student> selectPageVo(Page<Student> page, Integer age) {
        return mapper.selectPageVo(page, age);
    }
}

6. 测试

@SpringBootTest
public class MyBatisPlusPluginsTest {

    @Resource
    private StudentMapper mapper;

    /**
     * 分页
     * 第一页
     * SELECT sid,sname,sex,age,birthday,hobby,province FROM student LIMIT ?
     * 第二页
     * SELECT sid,sname,sex,age,birthday,hobby,province FROM student LIMIT ?,?
     */
    @Test
    public void testPage(){
        //了解Page  API使用
        Page<Student> page = new Page<>(3,5);
        mapper.selectPage(page, null);
        System.out.println("获取当前页数据" + page.getRecords());
        System.out.println("获取当前页"+page.getCurrent());
        System.out.println("获取显示多少记录"+page.getSize());
        System.out.println("共多少页" + page.getPages());
        System.out.println("获取总记录" + page.getTotal());
        System.out.println("是否有下一页" + page.hasNext());
        System.out.println("是否有上一页" + page.hasPrevious());
    }

    /**
     * 测试自定义的分页方法
     */
    @Test
    public void testPage2(){
        Page<Student> page = new Page<>(3,3);
        mapper.selectPageVo(page,3);
        System.out.println(page.hasNext());
    }
}

在这里插入图片描述

7. 编写controller,模拟分页参数由用户传入

@RestController
public class StudentController {

    @Autowired
    private StudentService studentService;

    @GetMapping("/stu")
    public String getAllStudent(){
        List<Student> list = studentService.list();
        return list.toString();
    }

    /**
     * 按年龄分页
     * @param curr 当前页
     * @param size 每页显示多少条
     * @param age 年龄
     * @return
     */
    @GetMapping("/pages")
    public Result queryPage(Integer curr, Integer size, Integer age){
        //todo 数据校验
        Page<Student> studentPage = new Page<>(curr,size);
        studentService.selectPageVo(studentPage, age);
        return new Result(studentPage);
    }
}

8.测试

请求地址:http://localhost:9000/pages?curr=1&size=3&age=16
{
    "records": [
        {
            "sid": 1,
            "sname": "孙小鸟",
            "sex": "男",
            "age": 19,
            "birthday": "2020-09-16T16:00:00.000+00:00",
            "hobby": "平时喜欢看影",
            "province": "湖南省"
        },
        {
            "sid": 6,
            "sname": "曹老板",
            "sex": "女",
            "age": 50,
            "birthday": "2022-05-18T16:00:00.000+00:00",
            "hobby": "打豆豆",
            "province": "湖北省"
        }
    ],
    "total": 2,
    "size": 3,
    "current": 1,
    "orders": [],
    "optimizeCountSql": true,
    "searchCount": true,
    "countId": null,
    "maxLimit": null,
    "pages": 1
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值