• MybatisPlus


    MybatisPlus

    简单入门:

    1.制作实体类与表结构(类名与表名对应,属性名与字段名对应)

    表结构:

    image-20220726152936777

    实体类:

        private Long id;
        private String name;
        private String password;
        private Integer age;
        private String tel;
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", password='" + password + '\'' +
                    ", age=" + age +
                    ", tel='" + tel + '\'' +
                    '}';
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getTel() {
            return tel;
        }
    
        public void setTel(String tel) {
            this.tel = tel;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    2.定义数据接口,继承BaseMapper

    @Mapper
    public interface UserDao extends BaseMapper<User> {
    }
    
    • 1
    • 2
    • 3

    3.测试功能:

    查询所有

    @SpringBootTest
    class Mybatispluse01ApplicationTests {
    
    
    
        @Autowired
        private UserDao userDao;
    
        @Test
        void contextLoads() {
            List<User> users = userDao.selectList(null);
    
            System.out.println(users);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    MybatisPlus官网:https://baomidou.com

    标准CRUD制作

    image-20220726152943702

        @Autowired
        private UserDao userDao;
    
    //查全部
        @Test
        void testSelectAll() {
            List<User> users = userDao.selectList(null);
    
            System.out.println(users);
        }
    //插入
        @Test
        void testInsert(){
            User user=new User();
            user.setName("Jack");
            user.setAge(18);
            user.setPassword("jack");
            user.setTel("183764849479");
    
            userDao.insert(user);
    
        }
    //修改
        @Test
        void testUpdate(){
    
            User user=new User();
            user.setId(1L);
            user.setName("Tom666");
            userDao.updateById(user);
    
        }
    //根据id查询
        @Test
        void testSelectById(){
            User user = userDao.selectById(1L);
            System.out.println(user);
        }
    //根据id删除
        @Test
        void testDelete(){
            userDao.deleteById(1551479559101206529L);
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    快速开发pojo

    下载lomback的jar包

    
        org.projectlombok
        lombok
    
    
    • 1
    • 2
    • 3
    • 4

    @Data注解(包含了set,get方法,无参构造方法,hashCode方法,equals方法)

    @Data
    public class User {
        private Long id;
        private String name;
        private String password;
        private Integer age;
        private String tel;
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    分页查询

    @Test
    void testByPage(){
        IPage page=new Page(1,2  );//当前页码值,每页显示多少条数据
        userDao.selectPage(page,null);
        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());
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    将所有的数据都查询出来了

    image-20220726152950144

    完善:

    增加一个拦截器

    @Configuration
    public class MpConfig {
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor();
            mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
    
            return mybatisPlusInterceptor;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    数据就会显示对应的条数

    DQL编程控制

    1.按条件查询

    @Test
    void testSelectAll() {
        //方式一:
        QueryWrapper queryWrapper=new QueryWrapper();
        //年龄小于18
        queryWrapper.lt("age",18);
        List<User> users = userDao.selectList(queryWrapper);
        System.out.println(users);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    //方式二:Lambda格式按条件查询
     QueryWrapper<User> queryWrapper=new QueryWrapper();
    queryWrapper.lambda().lt(User::getAge,18);
    List<User> users = userDao.selectList(queryWrapper);
    System.out.println(users);
    
    • 1
    • 2
    • 3
    • 4
    • 5
        //方式三:
        LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        lambdaQueryWrapper.lt(User::getAge,18);
        List<User> users = userDao.selectList(lambdaQueryWrapper);
        System.out.println(users);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.设置多个条件

    //方式三:
    LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
    lambdaQueryWrapper.lt(User::getAge,18);
    //大于5岁
    lambdaQueryWrapper.gt(User::getAge,5);
    List<User> users = userDao.selectList(lambdaQueryWrapper);
    System.out.println(users);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    链式编程格式

        LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        //大于18或小于10岁
        lambdaQueryWrapper.gt(User::getAge,18).or().lt(User::getAge,10);
        List<User> users = userDao.selectList(lambdaQueryWrapper);
        System.out.println(users);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    模拟:当前端页面返回的条件上下限有一个是null

    创建一个类继承 User

    添加一个属性age2

    @Data
    public class UserQuerry extends User {
    
    
        private Integer age2;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    UserQuerry userQuerry=new UserQuerry();
    userQuerry.setAge(10);
    userQuerry.setAge2(30);
    
    LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
    lambdaQueryWrapper.lt(User::getAge,userQuerry.getAge());
    lambdaQueryWrapper.gt(User::getAge,userQuerry.getAge2());
    
    List<User> users = userDao.selectList(lambdaQueryWrapper);
    System.out.println(users);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    但是当userQuerry中的age或age2有一个为null的时候

        UserQuerry userQuerry=new UserQuerry();
        userQuerry.setAge(10);
     
    
        LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        lambdaQueryWrapper.lt(User::getAge,userQuerry.getAge());
        lambdaQueryWrapper.gt(User::getAge,userQuerry.getAge2());
    
        List<User> users = userDao.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    程序就会出错

    解决:不推荐使用if语句

    UserQuerry userQuerry=new UserQuerry();
    userQuerry.setAge(10);
    
    
    LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
    //当age为空,不添加这个给个条件
    lambdaQueryWrapper.lt(null!=userQuerry.getAge(),User::getAge,userQuerry.getAge());
    //同理
    lambdaQueryWrapper.gt(null!=userQuerry.getAge2(),User::getAge,userQuerry.getAge2());
    
    List<User> users = userDao.selectList(lambdaQueryWrapper);
    System.out.println(users);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.查询投影

    LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
    //只查询name
    lambdaQueryWrapper.select(User::getName);
    List<User> users = userDao.selectList(lambdaQueryWrapper);
    System.out.println(users);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查询由多少条数据

    注意:使用的是 QueryWrapper

     QueryWrapper queryWrapper=new QueryWrapper<>();
    queryWrapper.select("count(*) as count");
    List> users=userDao.selectMaps(queryWrapper);
      System.out.println(users);
    
    • 1
    • 2
    • 3
    • 4

    image-20220725174913123

    查询name相同的有多少数据

     QueryWrapper<User> queryWrapper=new QueryWrapper<>();
    queryWrapper.select("count(*) as count","name");
    //按照name分组
    queryWrapper.groupBy("name");
    List<Map<String, Object>> users=userDao.selectMaps(queryWrapper);
      System.out.println(users);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yHQ44McC-1658892125326)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220725175630764.png)]

    4.条件查询

    查询账号和密码符合的用户

    LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(User::getName,"Tom666").eq(User::getPassword,"tom");
    
    User user = userDao.selectOne(lambdaQueryWrapper);
    System.out.println(user);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    between(上下限不能互换)

    //范围查询
    LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
    lambdaQueryWrapper.between(User::getAge,10,30);
    List<User> users = userDao.selectList(lambdaQueryWrapper);
    System.out.println(users);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    模糊查询

    LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(User::getName,"T");
            //likeLeft相当于%J
            //likeRight相当于J%
    List<User> users = userDao.selectList(lambdaQueryWrapper);
    System.out.println(users);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其他的查询条件可以查询api:条件构造器 | MyBatis-Plus (baomidou.com)

    命名问题:

    1.表中的字段名与定义的不同步

    使用注解 @TableField(value = “pwd”)

    image-20220726144036217

    2.编码中添加了数据库未定义的字段

    使用注解 @TableField(exist = false)

    @Data
    @TableName("tbl_user")
    public class User {
        private Long id;
        private String name;
        @TableField(value = "pwd")
        private String password;
        private Integer age;
        private String tel;
        
        @TableField(exist = false)
        private String online;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.隐藏对应的字段

    采用默认查询会将全部字段查询出来

    使用注解

    @TableField(value = “pwd”,select = false)

    隐藏字段

    @Data
    @TableName("tbl_user")
    public class User {
        private Long id;
        private String name;
        @TableField(value = "pwd",select = false)
        private String password;
        private Integer age;
        private String tel;
    
        @TableField(exist = false)
        private String online;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.表名和编码开发设计不同步

    使用注解@TableName

    image-20220726143755501

    @Data
    @TableName("tbl_user")
    public class User {
        private Long id;
        private String name;
        @TableField(value = "pwd")
        private String password;
        private Integer age;
        private String tel;
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    DML编程控制

    id生成策略控制

    1.自动递增

    @TableId(type = IdType.AUTO)
    
    private Long id;
    
    • 1
    • 2
    • 3

    2.手工输入id

    @TableId(type = IdType.INPUT)
    
    • 1

    需要自己输入id

    @Test
    void testInsert(){
        User user=new User();
        user.setId(666L);
        user.setName("Jack");
        user.setAge(18);
        user.setPassword("jack");
        user.setTel("183764849479");
        userDao.insert(user);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.雪花算法生成id

    @TableId(type = IdType.ASSIGN_ID)
    
    • 1

    image-20220726150638957

    全局配置id生成的格式

    mybatis-plus:
      global-config:
        db-config:
          id-type: assign_id
    
    • 1
    • 2
    • 3
    • 4

    多记录操作(delete,select)

    按照多个id删除

    @Test
    void testDelete(){
        List<Long>list=new ArrayList<>();
        list.add(1551826211540389889L);
        userDao.deleteBatchIds(list);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    逻辑删除(delete,update)

    1.修改表结构增加字段表示是否被删除

    2.修改实体类,增加标记

    //逻辑删除字段,标记当前字段是否被删除
    @TableLogic(value = "0",delval = "1")
    private Integer deleted;
    
    • 1
    • 2
    • 3

    通用操作:

    在配置文件中设置标记

    @TableLogic
    private Integer deleted;
    
    • 1
    • 2
    mybatis-plus:
      global-config:
        db-config:
    #      id-type: assign_id
          logic-delete-field: 0
          logic-not-delete-val:1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.执行删除操作

    @Test
    void testDelete(){
        List<Long>list=new ArrayList<>();
        list.add(5L);
        userDao.deleteBatchIds(list);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20220726152902602

    乐观锁(Update)

    新加一个字段version

    实体类中定义该属性使用@Version注解

    @Version
    private Integer version;
    
    • 1
    • 2

    开启拦截器

    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor();
        //分页拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
    
        
        //添加乐观锁拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        
        
        return mybatisPlusInterceptor;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    当执行update操作时,必须收集version

    @Test
    void testUpdate(){
    
        User user=new User();
        user.setVersion(1);
        user.setId(1L);
        user.setName("Tom666");
        userDao.updateById(user);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    也可以先查询

    @Test
    void testUpdate(){
    
        //先查询,user里面就携带了version
        User user = userDao.selectById(3L);
     
        user.setId(1L);
        user.setName("Tom666");
        userDao.updateById(user);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    每执行一次更新操作,version就会自动加1

  • 相关阅读:
    Python实现自动检测设备连通性并发送告警到企业微信
    132.OpenLDAP认证—Hue
    【Hot100】739. 每日温度
    uni-app开发微信小程序的报错[渲染层错误]排查及解决
    nocos配置中心使用教程(NACOS 1.X版本)
    配置一个nextjs_react项目
    Imagery in Action | Week6 影像服务
    第6 章 多线程程序设计答案
    风口浪尖,不想失业?你得学会接口自动化测试才能站稳脚步...
    【TypeScript】中接口的详细介绍
  • 原文地址:https://blog.csdn.net/qq_57907966/article/details/126010978