MybatisPlus从入门到精通

发布于:2025-08-09 ⋅ 阅读:(18) ⋅ 点赞:(0)

1.简介

MyBatis-Plus (简称MP)是一个MyBatis 的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。

官方网址:MyBatis-Plus 🚀 为简化开发而生

2.基础篇

2.1.通用mapper接口操作

    @Test
    void selectList() {
        List<User> users = userMapper.selectList(null);
        System.out.println(users);
    }
    
    @Test
    void insert() {
        User user = new User();
        user.setId(6L);
        user.setName("Nike");
        user.setAge(33);
        user.setEmail("test6@example.com");

        userMapper.insert(user);
    }

    @Test
    void deleteOne() {
        userMapper.deleteById(6L);
    }

    @Test
    void updateById() {
        User user = new User();
        user.setId(6L);
        user.setName("迈克");
        user.setAge(35);
        user.setEmail("maike@powernode.com");
        userMapper.updateById(user);
    }

    @Test
    void selectById() {
        User user = userMapper.selectById(6L);
        System.out.println(user);
    }

2.2.通用service接口操作

直接在service实现简单的crud操作

    @Test
    void insertService() {
        User user = new User();
        user.setId(7L);
        user.setName("zhangsan");
        user.setAge(35);
        user.setEmail("zhangsan@powernode.com");
        userService.save(user);
    }
    @Test
    void deleteService() {
        userService.removeById(7L);
    }
    @Test
    void updateService() {
        User user = new User();
        user.setId(6L);
        user.setAge(40);
        userService.updateById(user);
    }
    @Test
    void selectService() {
        List<User> users = userService.selectList();
        System.out.println(users);
    }

3.进阶篇

3.1.映射

3.1.1.自动映射

  1. 表名和实体类名映射->表名user 实体类名User
  2. 字段名和实体类属性名映射->字段名name 实体类属性名name
  3. 字段名下划线命名方式和实体类属性小驼峰命名方式映射->字段名user_email 实体类属性名userEmail

MybatisPlus支持这种映射规则,可以通过配置来设置

map-underscore-to-camel-case:true  #表示支持下划线到驱它峰的映射
map-underscore-to-camel-case:false  #表示不支持下划线到驼峰的映射

3.1.2.表映射

通过@TableName()注解指定映射的数据库表名,就会按照指定的表名进行映射
如:此时将数据库的表名改为powershop_user,要完成表名和实体类合名的映射,需要将实体
类名也要指定为powershop_user

全局配置

全局配置后可删除注解@TableName("powershop_user")

3.1.3.字段映射

当数据库字段和表实体类的属性不一致时,我们可以使用@TableField()注解改变字段和属性的映射,让注解中的名称和表字段保持一致
如:此时将数据库字段的名称我们改为username,在根据实体类的属性拼接SQL的使用,就会使用@TableField()中指定的名称username进行拼接,完成查询

数据库字段和表实体类的属性一致,框架在拼接SQL语句的时候,会使用属性名称直接拼接sql语句,例如:
SELECT id,username AS name,age,email,desc
FROM powershop_user
这条语句直接进行查询的时候,会出现错误。

原因是,desc属于关键字,不能直接用于sql查询,要解决这个问题就需要将desc字段加上`符号,将他变为不是关键字,才能完成查询,那这个个问题的根本也是改变生成的SQL语句的字段名称,也就是我们需要通过@TableField()改变实体类的属性名称。

3.1.4.字段失效

当数据库中有字段不希望被查询,我们可以通过@TableField(select=false)来隐藏
这个字段,那在拼接SQL语句的时候,就不会拼接这个字段

3.1.5.视图属性

在实际开发中,有些字段不需要数据库存储,但是却需要展示,需要要展示也就是意味着实体类中需要存在这个字段,我们称这些实体类中存在但是数据库中不存在的字段,叫做视图字段。

像这种视图字段,能够作为查询条件么,显示是不能的。因为数据车中没有这个字段,所以查
询字段如果包含这个字段,SQL语句会出现问题。我们通过@TableField(exist = false)
来去掉这个字段,不让他作为查询字段。

3.2.条件构造器

3.2.1.条件构造器介绍

将查询条件封装成对象。

抽象类不能创建对象,重点在实体类。

3.3.等值查询

3.3.1. 单条件查询 eq

QueryWrapper 和 LambdaQueryWrapper 的对比使用
    @Test
    void eq(){
        //1.创建条件查询对象
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //2.设置查询条件,指定查询的字段和匹配的值
        queryWrapper.eq( "name", "Jack");
        //3.进行条件查询
        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);
    }
    @Test
    void eq2() {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getName, "Jack");
        User user = userMapper.selectOne(lambdaQueryWrapper);
        System.out.println(user);
    }

查询null值判断

条件查询判断,如果值为null,则不作为查询条件 -> 查询所有

    @Test
    void isNull(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        String name = null;
        lambdaQueryWrapper.eq(User::getName,name);
        // User user = userMapper.selectOne(lambdaQueryWrapper);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }
    @Test
    void isNull2(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        String name = null;
        lambdaQueryWrapper.eq(name != null,User::getName,name);
        // User user = userMapper.selectOne(lambdaQueryWrapper);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.3.2. 多条件查询 allEq

    @Test
    void allEq1() {
        LambdaQueryWrapper<User> lambdaqueryWrapper = new LambdaQueryWrapper<>();
        lambdaqueryWrapper.eq(User::getName, "Tom");
        lambdaqueryWrapper.eq(User::getAge, 28);
        User user = userMapper.selectOne(lambdaqueryWrapper);
        System.out.println(user);
    }
    @Test
    void allEq2() {
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("name", "Tom");
        hashMap.put("age", null);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.allEq(hashMap, true);
        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);
    }

3.3.3. 不等条件查询 ne

    @Test
    void ne() {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.ne(User::getName, "Tom");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.4.范围查询

3.4.1. gt,ge,lt,le的使用

大于-gt、 大于等于-ge、 小于-lt、 小于等于-le

@Test
void gt(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    Integer age = 18;
    lambdaQueryWrapper.ge(User::getAge,age);
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.4.2.区间查询 between notbetween

    @Test
    void between(){
        //1.创建QueryWrapper对象
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //2.设置条件,指定字段名称和值
        lambdaQueryWrapper.between(User::getAge,18,30);
        //3.使用条件完成查询
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }
    @Test
    void notBetween(){
        //1.创建QueryWrapper对象
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //2.设置条件,指定字段名称和值
        lambdaQueryWrapper.notBetween(User::getAge,18,30);
        //3.使用条件完成查询
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.5.模糊查询

3.5.1.全模糊匹配 like

@Test
void like(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.like(User::getName,"J");
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.5.2.不包含模糊匹配 notLike

@Test
void notLike(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.notLike(User::getName,"J");
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.5.3.左模糊匹配 likeLeft 

左边模糊 %e

@Test
void likeLeft(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.likeLeft(User::getName,"e");
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.5.4.右模糊匹配 likeRight

@Test
void likeLeft(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.likeLeft(User::getName,"J");
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.6.判空查询

3.6.1. isNull,isNotNull

@Test
void isNull(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称
    lambdaQueryWrapper.isNull(User::getName);
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void isNotNull(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称
    lambdaQueryWrapper.isNotNull(User::getName);
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.包含查询

3.7.1. in

字段=值or字段=值  -> in

@Test
void in(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    ArrayList<Integer> arrayList = new ArrayList<>();
    Collections.addAll(arrayList,18,20,21);
    lambdaQueryWrapper.in(User::getAge,arrayList);
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void in2(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.in(User::getAge,18,20,21);
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.2. notIn

字段!=值and字段!=值   -> notIn

@Test
void notIn(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    ArrayList<Integer> arrayList = new ArrayList<>();
    Collections.addAll(arrayList,18,20,21);
    lambdaQueryWrapper.notIn(User::getAge,arrayList);
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void notIn2(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.notIn(User::getAge,18,20,21);
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.3. inSql

@Test
void inSql(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.inSql(User::getAge,"18,20,22");
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void inSql2(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.inSql(User::getAge,"select age from powershop_user where age > 20");
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.7.4. notInSql

@Test
void notInSql(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.notInSql(User::getAge,"18,20,22");
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

@Test
void notInSql2(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定字段名称和值
    lambdaQueryWrapper.notInSql(User::getAge,"select age from powershop_user where age > 20");
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.8.分组查询

3.8.1. groupBy

@Test
void groupBy(){
    //1.创建QueryWrapper对象
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //2.设置条件,指定字段名称和值
    queryWrapper.groupBy("age");
    queryWrapper.select("age,count(*) as field_count");
    //3.使用条件完成查询
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    System.out.println(maps);
}

3.9.聚合查询

3.9.1. having

having过滤分组后的数据,where过滤分组前的数据。

@Test
void having(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //分组字段
    queryWrapper.groupBy("age");
    //查询字段
    queryWrapper.select("age,count(*) as field_count");
    //聚合条件筛选
    queryWrapper.having("field_count = 1");
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    System.out.println(maps);
}

3.10.排序查询

3.10.1.升序查询 orderByAsc

@Test
void orderByAsc(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定升序排序字段
    lambdaQueryWrapper.orderByAsc(User::getAge,User::getId);
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.10.2.降序查询 orderByDesc

@Test
void orderByDesc(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.设置条件,指定降序排序字段
    lambdaQueryWrapper.orderByDesc(User::getAge,User::getId);
    //3.使用条件完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.10.3.自定义排序查询 orderBy

    @Test
    void orderBy() {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //设置排序字段和排序的方式参数1:如果排序字段的值存在nuLL的时候,是否还要作为排序字段参与排序,参数2:是否是升序排序,参数3:排序字段
        lambdaQueryWrapper.orderBy(true, true, User::getAge);
        lambdaQueryWrapper.orderBy(true, false, User::getId);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.11.逻辑查询

3.11.1.内嵌逻辑查询 func

    @Test
    void func(){
        //1.创建QueryWrapper对象
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //2.构建逻辑判断语句
        /*lambdaQueryWrapper.func(new Consumer<LambdaQueryWrapper<User>>() {
            @Override
            public void accept(LambdaQueryWrapper<User> userLambdaQueryWrapper) {
                if(true) {
                    userLambdaQueryWrapper.eq(User::getId, 1);
                } else {
                    userLambdaQueryWrapper.ne(User::getId, 1);
                }
            }
        });*/
        lambdaQueryWrapper.func(i -> {
            if(true) {
                i.eq(User::getId, 1);
            }else {
                i.ne(User::getId, 1);
            }
        });
        //3.完成查询
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

3.11.2. and

正常拼接默认就是and

@Test
void and(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.构建条件查询语句
    lambdaQueryWrapper.gt(User::getAge,22).lt(User::getAge,30);
    //3.完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

and嵌套

@Test
void and2(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.构建条件查询语句
    lambdaQueryWrapper.eq(User::getName,"wang").and(i -> i.gt(User::getAge,26).or().lt(User::getAge,22));
    //3.完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.11.3. or

@Test
void or(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.构建条件查询语句
    lambdaQueryWrapper.lt(User::getAge,20).or().gt(User::getAge,23);
    //3.完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

or嵌套

@Test
void or2(){
     LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
     lambdaQueryWrapper.eq(User::getName,"wang").or(i -> i.gt(User::getAge,22).lt(User::getAge,26));
     List<User> users = userMapper.selectList(lambdaQueryWrapper);
     System.out.println(users);
}

3.11.4. nested

查询条件直接拼在where后面

@Test
void nested(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.构建条件查询语句
    lambdaQueryWrapper.nested(i -> i.eq(User::getName, "Billie").ne(User::getAge, 22));
    //3.完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.12.自定义查询

3.12.1. apply

查询条件通过字符串编写直接拼在where后面

@Test
void apply(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.构建条件查询语句
    lambdaQueryWrapper.apply("id = 1");
    //3.完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.13.分页查询

3.13.1. last

查询条件通过字符串编写直接拼在Sql语句最后

@Test
void last(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.构建条件查询语句
    lambdaQueryWrapper.last("limit 0,2");
    //3.完成查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.14. exists 查询

3.14.1 exists

exists后的子查询如果有结果,则exists返回true,执行exits前的主查询语句;反之不执行主查询语句。

@Test
void exists(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.构建查询条件
    lambdaQueryWrapper.exists("select id from powershop_user where age = 18");
    //3.查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.14.2 notExists

@Test
void notExists(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.构建查询条件
    lambdaQueryWrapper.notExists("select id from powershop_user where age = 33");
    //3.查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

3.15. select 查询

选择要查询的字段

@Test
void select(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.构建查询条件
    lambdaQueryWrapper.select(User::getId,User::getName);
    //3.查询
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    System.out.println(users);
}

4.高级篇

4.1.主键策略

4.1.1. AUTO策略

该策略为跟随数据库表的主键递增策略,前提是数据库表的主键要设置为自增

4.1.2.​​​​​ INPUT策略

该策略表示,必须由我们手动的插入id,否则无法添加数据

4.1.3.ASSIGN_ID策略

解决主键自增问题。表的数据量很大,我们需要进行分表

水平拆分就是将一个大的表按照数据量进行拆分

垂直拆分就是将一个大的表按照字段进行拆分

拆分后的数据,有三点需求

  1. 拆分前后主键保持有序
  2. 主键唯一性
  3. 主键不要暴露数据量

雪花算法是由一个64位的二进制组成的,最终就是一个Long类型的数值。

主要分为四部分存储

【1】1位的符号位,固定值为0

【2】41位的时间戳

【3】10位的机器码,包含5位机器id和5位服务id

【4】12位的序列号

数据表插入数据后发现一个19位长度的id,该id就是雪花算法生成的id,这是二级制的十进制表示形式

4.1.4.NONE策略

NONE策略表示不指定主键生成策略,当我们没有指定主键生成策略或者主键策略为NONE的时候,他跟随的是全局策略。默认是雪花算法策略。

4.1.5.ASSIGN_UUID策略

UUIDUniversally Unique Identifier)全局唯一标识符,定义为一个字符串主键,采用32位数字组成,编码采用16进制,定义了在时间和空间都完全唯一的系统信息。

UUID的编码规则:

11~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的唯一性;

29~16位采用底层的IP地址,在服务器集群中的唯一性;

317~24位采用当前对象的HashCode值,在一个内部对象上的唯一性;

425~32位采用调用方法的一个随机数,在一个对象内的毫秒级的唯一性。

通过以上4种策略可以保证唯一性。在系统中需要用到随机数的地方都可以考虑采用UUID算法。

我们想要演示UUID的效果,需要改变一下表的字段类型和实体类的属性类型

将数据库表的字段类型改为varchar(50),将实体类的属性类型改为String,并指定主键生成策略为IdType.ASSIGN_UUID

4.2.分页

分页的本质就是需要设置一个拦截器,通过拦截器拦截了SQL,通过在SQL语句的结尾添加limit关键字,来实现分页的效果

4.2.1.MybatisPlus分页插件

【1】通过配置类来指定一个具体数据库的分页插件

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

【2】实现分页查询效果

@Test
void selectPage(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.创建分页查询对象,指定当前页和每页显示条数
    IPage<User> page = new Page<>(1,3);
    //3.执行分页查询
    userMapper.selectPage(page, lambdaQueryWrapper);
    //4.查看分页查询的结果
    System.out.println("当前页码值:"+page.getCurrent());
    System.out.println("每页显示数:"+page.getSize());
    System.out.println("总页数:"+page.getPages());
    System.out.println("总条数:"+page.getTotal());
    System.out.println("当前页数据:"+page.getRecords());
}

4.2.2.自定义分页插件

【1】在UserMapper.xml映射配置文件中提供查询语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.powernode.mapper.UserMapper">

     <select id="selectByName" resultType="com.powernode.domain.User">
        select * from powershop_user where name = #{name}
     </select>

</mapper>

【2】在Mapper接口中提供对应的方法,方法中将IPage对象作为参数传入

@Mapper
public interface UserMapper extends BaseMapper<User> {
       IPage<User> selectByName(IPage<User> page, String name);
}

【3】实现分页查询效果

@Test
void selectPage2(){
    //1.创建分页查询对象,指定当前页和每页显示条数
    IPage<User> page = new Page<>(1,2);
    //2.执行分页查询
    userMapper.selectByName(page,"Mary");
    //3.查看分页查询的结果
    System.out.println("当前页码值:"+page.getCurrent());
    System.out.println("每页显示数:"+page.getSize());
    System.out.println("总页数:"+page.getPages());
    System.out.println("总条数:"+page.getTotal());
    System.out.println("当前页数据:"+page.getRecords());
}

网站公告

今日签到

点亮在社区的每一天
去签到