• SpringBoot整合mybatis-plus 实现增删改查和分页查询


    我相信,每一个初学SpringBoot的人,就特别想实现一个接口,从数据库中查询出数据,进行增删改查。
    SpringBoot各种整合,实现增删改查和分页查询

    • 整合JUnit
    • 整合MyBatis
    • 整合MyBatis-Plus
    • 整合Druid

    其中分为以下部分:

    1. 实体类开发————使用Lombok快速制作实体类
    2. Dao开发————整合MyBatisPlus,制作数据层测试
    3. Service开发————基于MyBatisPlus进行增量开发,制作业务层测试类
    4. Controller开发————基于Restful开发,使用PostMan测试接口功能

    整体的运行图片:

    在文章中,我只写写到了后端代码。需要前后端所有代码,可以关注【码小胡】公众号。
    gitee地址https://gitee.com/CodingHu/SSMP.git

    在这里插入图片描述

    一、环境搭建:

    创建module:

    在这里插入图片描述

    在这里插入图片描述

    1、依赖

     <dependencies>
            <!--mybatis-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.3</version>
            </dependency>
    
            <!--druid是数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.2.6</version>
            </dependency>
    
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <!--目的是为了减少依赖配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
    • 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

    2、application.yml文件

    server:
      port: 80
    
    spring:
      datasource:
        druid:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
          username: root
          password: root
    
    
    mybatis-plus:
      global-config:
        db-config:
          table-prefix: tbl_  #设置表名通用前缀
          id-type: auto #mybatis默认id生成策略是雪花算法。
          #设置主键id字段的生成策略为参照数据库设定的策略,当前数据库设置id生成策略为自增
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        # 在控制台上面输出日志
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3、数据库

    -- ----------------------------
    -- Table structure for tbl_book
    -- ----------------------------
    DROP TABLE IF EXISTS `tbl_book`;
    CREATE TABLE `tbl_book`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 51 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of tbl_book
    -- ----------------------------
    INSERT INTO `tbl_book` VALUES (1, '计算机理论', 'Spring实战 第5', 'Spring入门经典教程,深入理解Spring原理技术内幕');
    INSERT INTO `tbl_book` VALUES (2, '计算机理论', 'Spring 5核心原理与30个类手写实战', '十年沉淀之作,手写Spring精华思想');
    INSERT INTO `tbl_book` VALUES (3, '计算机理论', 'Spring 5 设计模式', '深入Spring源码剖析Spring源码中蕴含的10大设计模式');
    INSERT INTO `tbl_book` VALUES (4, '计算机理论', 'Spring MVC+MyBatis开发从入门到项目实战', '全方位解析面向Web应用的轻量级框架,带你成为Spring MVC开发高手');
    INSERT INTO `tbl_book` VALUES (5, '计算机理论', '轻量级Java Web企业应用实战', '源码级剖析Spring框架,适合已掌握Java基础的读者');
    INSERT INTO `tbl_book` VALUES (6, '计算机理论', 'Java核心技术 卷I 基础知识(原书第11版)', 'Core Java11版,Jolt大奖获奖作品,针对Java SE9、1011全面更新');
    INSERT INTO `tbl_book` VALUES (7, '计算机理论', '深入理解Java虚拟机', '5个维度全面剖析JVM,大厂面试知识点全覆盖');
    INSERT INTO `tbl_book` VALUES (8, '计算机理论', 'Java编程思想(第4版)', 'Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉');
    INSERT INTO `tbl_book` VALUES (9, '计算机理论', '零基础学Java(全彩版)', '零基础自学编程的入门图书,由浅入深,详解Java语言的编程思想和核心技术');
    INSERT INTO `tbl_book` VALUES (10, '市场营销', '直播就该这么做:主播高效沟通实战指南', '李子柒、李佳琦、薇娅成长为网红的秘密都在书中');
    INSERT INTO `tbl_book` VALUES (11, '市场营销', '直播销讲实战一本通', '和秋叶一起学系列网络营销书籍');
    INSERT INTO `tbl_book` VALUES (12, '市场营销', '直播带货:淘宝、天猫直播从新手到高手', '一本教你如何玩转直播的书,10堂课轻松实现带货月入3W+');
    
    • 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

    二、实体类:

    ​ 实体类的开发可以自动通过工具手工生成get/set方法,然后覆盖toString()方法,方便调试,等等。不过这一套操作书写很繁琐,有对应的工具可以帮助我们简化开发,介绍一个小工具,lombok。

    ​ Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发,SpringBoot目前默认集成了lombok技术,并提供了对应的版本控制,所以只需要提供对应的坐标即可,在pom.xml中添加lombok的坐标。

    package com.bigtree.domain;
    
    import lombok.Data;
    import org.springframework.stereotype.Component;
    
    @Data  //通过lombok自动写好了set/get/tostring方法
    @Component
    public class Book {
        private Integer id;
        private String type;
        private String name;
        private String description;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    三、数据层开发——基础CRUD

    ​ 数据层开发本次使用MyBatisPlus技术。单表的增删改查都不需要写语句

    package com.bigtree.dao;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.bigtree.domain.Book;
    import org.apache.ibatis.annotations.Mapper;
     
    // 这是一个Mapper数据层,继承了mp写好的单表增删改查语句
    @Mapper
    public interface BookDao extends BaseMapper<Book> {
       
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    有的同学该疑问了在这里插入图片描述
    select语句不写就算了, 表名呢??? mybatis-plus怎么知道我访问的是那个表呢??

    其实在application.yml表中,添加了表前缀,表名是来自实体类mapper.Book

    mybatis-plus:
      global-config:
        db-config:
          table-prefix: tbl_  # 配置 表前缀
    
    • 1
    • 2
    • 3
    • 4

    这样拼装起来,就是表名:tbl.book

    四、业务层开发——分页功能制作

    其中selectPage方法需要传入一个封装分页数据的对象,可以通过new的形式创建这个对象,当然这个对象也是MP提供的,别选错包了。创建此对象时就需要指定分页的两个基本数据

    • 当前显示第几页
    • 每页显示几条数据

    4.1分页配置类 configuration

    基础操作中有查询全部的功能,而在这个基础上只需要升级一下(PLUS)就可以得到分页操作。所以MP将分页操作做成了一个开关,你用分页功能就把开关开启,不用就不需要开启这个开关。而我们现在没有开启这个开关,所以分页操作是没有的。这个开关是通过MP的拦截器的形式存在的

    package com.bigtree.configuration;
    
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MPConfig {
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            return interceptor;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.2service接口和serviceImpl

    service接口

    @Service
    public interface BookServiceMy extends IService<Book> {
        public IPage<Book> getPage(int currentPage, int pageSize);
        public IPage<Book> getPage(int currentPage, int pageSize,Book book);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    serviceImpl实现接口

    /*
    * 这个是service业务层的实现类,那么就需要implements实现service类接口
    * 该类继承my框架写好的ServiceImpl接口即可,那也就不需要重写自带的实现类的方法。
    *
    * 如果service接口有自己写的方法,那么该类需要实现接口中的方法。
    * */
    
    @Service
    public class BookServiceMyImpl extends ServiceImpl<BookDao, Book> implements BookServiceMy {
        @Autowired
        private BookDao bookDao;
    	// 查询所有的分页	
        @Override
        public IPage<Book> getPage(int currentPage, int pageSize) {
            IPage<Book> page =new Page<Book>(currentPage,pageSize);
            bookDao.selectPage(page,null);
            return page;
        }
    	 // 先模糊查询,然后在分页。那么返回到浏览器里面,肯定是页的形式返回
        @Override
        public IPage<Book> getPage(int currentPage, int pageSize, Book book) {
            LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
            lqw.like(Strings.isNotEmpty(book.getType()),Book::getType,book.getType());
            lqw.like(Strings.isNotEmpty(book.getName()),Book::getName,book.getName());
            lqw.like(Strings.isNotEmpty(book.getDescription()),Book::getDescription,book.getDescription());
    		
    		 //如果得到的数据不为空,那么执行模糊查询,where book:getName like %book.getName%
    	   //分页
            IPage<Book> page =new Page<Book>(currentPage,pageSize);
            bookDao.selectPage(page,lqw);
            return page;
        }
    }
    
    • 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

    五、controller表现层

    表现层的开发使用基于Restful的表现层接口开发,功能测试通过Postman工具进行

    @RequestMapping("/books")
    public class BookController {
    
    
        //查询一条数据
        @GetMapping("/{id}")
        public Book getId(@PathVariable Integer id){
            return bookServiceMy.getById(id);
        }
     
        //自动注入service层
        @Autowired
        private BookServiceMy bookServiceMy;
    
        //获取数据用get.查询所有的数据
        @GetMapping()
        public List<Book> getAll(){
            return bookServiceMy.list();
        }
    
        //新增一条数据,用post
        @PostMapping()
        public boolean insert(@RequestBody Book book){
            return bookServiceMy.save(book);
        }
    
        //根据Id更改数据:用put
        @PutMapping()
        public boolean update(@RequestBody Book book){
            return bookServiceMy.updateById(book);
        }
        //根据id删除数据,用delete
        @DeleteMapping("/{id}")  //根据路径传参
        public boolean delete(@PathVariable Integer id){
            return bookServiceMy.removeById(id);
        }
    
        //分页查询语句
        @GetMapping("/{currentPage}/{pageSize}")
        public IPage<Book> getPage(@PathVariable int currentPage, @PathVariable int pageSize){
            return bookServiceMy.getPage(currentPage,pageSize);
        }
    }
    
    • 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
  • 相关阅读:
    数商云S2B2C商城积分商城功能如何实现家用电器企业营销价值最大化?
    Spring cloud gateway+JWT+服务间鉴权实战
    python爬虫经典实例(二)
    Elasticsearch 进阶
    Springboot旅游攻略平台2de9n计算机毕业设计-课程设计-期末作业-毕设程序代做
    工业镜头的景深、分辨率及如何匹配合适的工业相机-51camera
    priority_queue(优先级队列的模拟使用和实现)
    GBASE 8A v953报错集锦41--导出数据到 Kerberos 认证 HDFS,数据可以正常导 出,但会有报错信息
    MySQL在线升级方案
    《牛客题霸-算法篇》刷题之NC57 反转数字
  • 原文地址:https://blog.csdn.net/weixin_43989347/article/details/126475963