• MyBatis-Plus标准数据层开发


    1. 标准CRUD使用

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

    我们先来看张表:

    功能自定义接口MP接口
    新增boolean save(T t)int insert(T t)
    删除boolean delete(int id)int deleteById(Serializeble id)
    修改boolean update(T t)int updateById(T t)
    根据ID查询T getById(int id)T selectById(Serializeble id)
    查询全部List getAll()List selectList(Wapper queryWrapper)
    分页查询PageInfo getAll(int page, int size)IPage selectPage(IPage page,Wapper queryWrapper)
    按条件分页查询List getAll(Condition condition)IPage selectPage(IPage page,Wapper queryWrapper)

    对于这张表的方法,我们挨个来演示下:

    2. 新增

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

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

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

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

    @SpringBootTest
    class SpringbootMp02CrudApplicationTests {
    
    	@Autowired
    	private UserDao userDao;
    
    	@Test
    	void testInsert() {
    		User user = new User();
    		user.setUserName("奋进吧");
    		user.setEmail("fengjin@dcxuexi.com");
    		user.setBranchName("上海奋进吧");
    		int i = userDao.insert(user);
    		System.out.println(i);
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    在这里插入图片描述

    在这里插入图片描述

    3. 删除

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

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

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

        • String和Number是Serializable的子类,
      • Number又是Float,Double,Integer等类的父类,

        • 能作为主键的数据类型都已经是Serializable的子类,
      • MP使用Serializable作为参数类型,就好比我们可以用Object接收任何数据类型一样。

    • int:返回值类型,数据删除成功返回1,未删除数据返回0。

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

    @SpringBootTest
    class SpringbootMp02CrudApplicationTests {
    
    	@Autowired
    	private UserDao userDao;
    
    
    	@Test
    	void  testDelete(){
    		int i = userDao.deleteById(132);
    		System.out.println(i);
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4. 修改

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

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

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

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

    @SpringBootTest
    class SpringbootMp02CrudApplicationTests {
    
    	@Autowired
    	private UserDao userDao;
    	
    	@Test
    	void testUpdate(){
    		User user = new User();
    		user.setUserId(146);
    		user.setUserName("奋进吧2");
    		user.setEmail("fenjinba@dcxuexi.com");
    		user.setBranchName("奋进吧");
    		int i = userDao.updateById(user);
    		System.out.println(i);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    5. 根据ID查询

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

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

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

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

    6. 查询所有

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

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

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

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

    7. Lombok

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

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

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

    概念

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

    使用步骤

    步骤1:添加lombok依赖

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

    注意: 版本可以不用写,因为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的注解还有很多,上面标识的三个是比较常用的。

    @TableName(value = "platform_user")
    //当数据库名与实体类名不一致或不符合驼峰命名时,需要在此注解指定表名
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        @TableId(type = IdType.AUTO)
        private  Integer userId;
        private  String email;
        private  String userName;
        private  String branchName;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    说明:

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

    @TableName(value = "platform_user")
    //当数据库名与实体类名不一致或不符合驼峰命名时,需要在此注解指定表名
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        @TableId(type = IdType.AUTO)
        private  Integer userId;
        private  String email;
        private  String userName;
        private  String branchName;
    
        public User(String userName,String email){
            this.setUserName(userName);
            this.setEmail(email);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这种方式是被允许的。

    8. 分页功能

    基础的增删改查就已经学习完了,刚才我们在分析基础开发的时候,有一个分页功能还没有实现,在MP中如何实现分页功能,就是咱们接下来要学习的内容。

    分页查询使用的方法是:

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

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

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

    @SpringBootTest
    class SpringbootMp02CrudApplicationTests {
    
    	@Autowired
    	private UserDao userDao;
    
    	@Test
    	void testPageSelect(){
    		//1 创建IPage分页对象,设置分页参数,1为当前页码,5为每页显示的记录数
    		IPage<User> userIPage = new Page<>(1,5);
    		//2 执行分页查询
    		userIPage = userDao.selectPage(userIPage,null);
    		System.out.println("当前页码值 = " + userIPage.getCurrent());
    		System.out.println("一共多少页 = " + userIPage.getPages());
    		System.out.println("每页显示数 = " + userIPage.getSize());
    		System.out.println("一共多少条数据 = " + userIPage.getTotal());
    		System.out.println("数据 = ↓↓↓↓ ");
    		userIPage.getRecords().forEach(System.out::println);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    步骤2:设置分页拦截器

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

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

    步骤3:运行测试程序

    在这里插入图片描述

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

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

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

    在这里插入图片描述


    项目代码

  • 相关阅读:
    Atcoder ABC159
    基于python找到并显示100以内的素数
    【数据结构】红黑树(C++实现)
    每日刷题-2
    vs2017打开工程提示若要解决此问题,请使用以下选择启动 Visual Studio 安装程序: 用于 x86 和 x64 的 Visual C++ MFC
    Wireshark数据抓包分析之HTTP协议
    【StableDiffusion秋叶包反斜杠问题】Failed to find xxx\sd-webui-aki-v4.8\...\xxx.pth
    Pygame开发一个打字游戏
    性能测试 —— Jmeter 命令行详细
    【Transformer系列】深入浅出理解Embedding(词嵌入)
  • 原文地址:https://blog.csdn.net/qq_37726813/article/details/127990066