• [MyBatisPlus]标准数据层开发(CRUD、分页)


    标准CRUD制作

    对于标准的CRUD功能都有哪些以及MP都提供了哪些方法可以使用呢?

    我们先来看张图:
    在这里插入图片描述
    对于这张图的方法,我们挨个来演示下:

    新增

    在进行新增之前,我们可以分析下新增的方法:

    int insert (T t)
    
    • 1
    • T:泛型,新增用来保存新增数据

    • int:返回值,新增成功后返回1,没有新增成功返回的是0

    在测试类中进行新增操作:

    @SpringBootTest
    class Mybatisplus01QuickstartApplicationTests {
    
        @Autowired
        private UserDao userDao;
    
        @Test
        void testSave() {
            User user = new User();
            user.setName("张三");
            user.setPassword("nefu");
            user.setAge(12);
            user.setTel("1234567");
            userDao.insert(user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    执行测试后,数据库表中就会添加一条数据。

    在这里插入图片描述

    但是你会发现数据中的主键ID,有点长,那这个主键ID是如何来的?我们更想要的是主键自增,应该是5才对,这个是我们后面要学习的主键ID生成策略,这块的这个问题,我们暂时先放放。

    删除

    在进行删除之前,我们可以分析下删除的方法:

    int deleteById (Serializable id)
    
    • 1
    • Serializable:参数类型

      • 思考:参数类型为什么是一个序列化类?

        在这里插入图片描述

        从这张图可以看出,

        • String和Number是Serializable的子类,
        • Number又是Float,Double,Integer等类的父类,
        • 能作为主键的数据类型都已经是Serializable的子类,
        • MP使用Serializable作为参数类型,就好比我们可以用Object接收任何数据类型一样。
    • int:返回值类型,数据删除成功返回1,未删除数据返回0。

    在测试类中进行新增操作:

     @SpringBootTest
    class Mybatisplus01QuickstartApplicationTests {
    
        @Autowired
        private UserDao userDao;
    
        @Test
        void testDelete() {
            userDao.deleteById(1401856123725713409L);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注意id是long型,所以L不要掉了

    修改

    在进行修改之前,我们可以分析下修改的方法:

    int updateById(T t);
    
    • 1
    • T:泛型,需要修改的数据内容,注意因为是根据ID进行修改,所以传入的对象中需要有ID属性值

    • int:返回值,修改成功后返回1,未修改数据返回0

    在测试类中进行新增操作:

    @SpringBootTest
    class Mybatisplus01QuickstartApplicationTests {
    
        @Autowired
        private UserDao userDao;
    
        @Test
        void testUpdate() {
            User user = new User();
            user.setId(1L);
            user.setName("Tom888");
            user.setPassword("tom888");
            userDao.updateById(user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    说明:修改的时候,只修改实体对象中有值的字段。

    根据ID查询

    在进行根据ID查询之前,我们可以分析下根据ID查询的方法:

    T selectById (Serializable id)
    
    • 1
    • Serializable:参数类型,主键ID的值
    • T:根据ID查询只会返回一条数据

    在测试类中进行新增操作:

    @SpringBootTest
    class Mybatisplus01QuickstartApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        @Test
        void testGetById() {
            User user = userDao.selectById(2L);
            System.out.println(user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    查询所有

    在进行查询所有之前,我们可以分析下查询所有的方法:

    List<T> selectList(Wrapper<T> queryWrapper)
    
    • 1
    • Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null
    • List:因为查询的是所有,所以返回的数据是一个集合

    在测试类中进行新增操作:

    @SpringBootTest
    class Mybatisplus01QuickstartApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        @Test
        void testGetAll() {
            List<User> userList = userDao.selectList(null);
            System.out.println(userList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    我们所调用的方法都是来自于DAO接口继承的BaseMapper类中。
    在这里插入图片描述

    里面的方法有很多,我们后面会慢慢去接触里面的内容。

    Lombok

    代码写到这,我们会发现DAO接口类的编写现在变成最简单的了,里面什么都不用写。反过来看看模型类的编写都需要哪些内容:

    • 私有属性
    • setter…getter…方法
    • toString方法
    • 构造函数

    虽然这些内容不难,同时也都是通过IDEA工具生成的,但是过程还是必须得走一遍,那么对于模型类的编写有没有什么优化方法?就是我们接下来要学习的Lombok。

    概念

    • Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发。

    使用步骤

    步骤1:添加lombok依赖

    <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
        
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:版本可以不用写,因为SpringBoot中已经管理了lombok的版本。

    步骤2:安装Lombok的插件

    新版本IDEA已经内置了该插件,如果删除setter和getter方法程序有报红,则需要安装插件

    在这里插入图片描述

    如果在IDEA中找不到lombok插件,可以访问如下网站

    https://plugins.jetbrains.com/plugin/6317-lombok/versions

    根据自己IDEA的版本下载对应的lombok插件,下载成功后,在IDEA中采用离线安装的方式进行安装。

    在这里插入图片描述

    步骤3:模型类上添加注解

    Lombok常见的注解有:

    • @Setter:为模型类的属性提供setter方法
    • @Getter:为模型类的属性提供getter方法
    • @ToString:为模型类的属性提供toString方法
    • @EqualsAndHashCode:为模型类的属性提供equals和hashcode方法
    • @Data:是个组合注解,包含上面的注解的功能
    • @NoArgsConstructor:提供一个无参构造函数
    • @AllArgsConstructor:提供一个包含所有参数的构造函数

    Lombok的注解还有很多,上面标红的三个是比较常用的,其他的大家后期用到了,再去补充学习。

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    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

    说明:

    Lombok只是简化模型类的编写,我们之前的方法也能用,比如有人会问:我如果只想要有name和password的构造函数,该如何编写?

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private Long id;
        private String name;
        private String password;
        private Integer age;
        private String tel;
    
        public User(String name, String password) {
            this.name = name;
            this.password = password;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这种方式是被允许的。

    分页功能

    分页查询使用的方法是:

    IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)
    
    • 1
    • IPage:用来构建分页查询条件
    • Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null
    • IPage:返回值,你会发现构建分页条件和方法的返回值都是IPage

    IPage是一个接口,我们需要找到它的实现类来构建它,具体的实现类,可以进入到IPage类中按ctrl+h,会找到其有一个实现类为Page

    步骤1:调用方法传入参数获取返回值

    @SpringBootTest
    class Mybatisplus01QuickstartApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        //分页查询
        @Test
        void testSelectPage(){
            //1 创建IPage分页对象,设置分页参数,1为当前页码,3为每页显示的记录数
            IPage<User> page=new Page<>(1,3);
            //2 执行分页查询
            userDao.selectPage(page,null);
            //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());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    步骤2:设置分页拦截器

    这个拦截器MP已经为我们提供好了,我们只需要将其配置成Spring管理的bean对象即可。

    @Configuration
    public class MybatisPlusConfig {
        
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            //1 创建MybatisPlusInterceptor拦截器对象
            MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
            //2 添加分页拦截器
            mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            return mpInterceptor;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这个地方@Configuration可以让引导类直接扫描到。当然也可以在引导类里面使用@Import来引入这个配置类。

    说明:上面的代码记不住咋办呢?

    这些内容在MP的官方文档中有详细的说明,我们可以查看官方文档类配置

    在这里插入图片描述

    步骤3:运行测试程序

    在这里插入图片描述

    如果想查看MP执行的SQL语句,可以修改application.yml配置文件,

    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印SQL日志到控制台
    
    • 1
    • 2
    • 3

    打开日志后,就可以在控制台打印出对应的SQL语句,开启日志功能性能就会受到影响,调试完后记得关闭。

    在这里插入图片描述

  • 相关阅读:
    (附源码)ssm教培管理系统 毕业设计 230932
    算法篇 滑动窗口 leetcode 长度最小的子数组
    python代码优化学习
    C#异步编程由浅入深(三)细说Awaiter
    R语言:卡方检验
    java计算机毕业设计基于springboot 网上商城购物系统
    6月6日,HTTP/3 正式发布了!
    HackTheBox-Starting Point--Tier 1---Bike
    JavaEE——HTTP协议
    后缀表达式求值
  • 原文地址:https://blog.csdn.net/zyb18507175502/article/details/126025346