• springboot集成mybatis-plus及常用功能配置


    1. 引入pom依赖

    
    
        com.baomidou
        mybatis-plus-boot-starter
        3.4.1
    
    
    
    
         mysql
         mysql-connector-java
     
     
     
     
         junit
         junit
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2. 修改配置文件

    application.properties:

    # 服务端口
    server.port=8001
    
    # mysql数据库连接
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=GMT%2B8
    spring.datasource.username=root
    spring.datasource.password=123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    application.yml:

    # 服务端口
    server:
      port: 8001
    
    # mysql数据库连接
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=GMT%2B8
        username: root
        password: 123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3. 配置自动生成代码

    3.1 引入pom依赖

    
    
        com.baomidou
        mybatis-plus-generator
        3.4.1
    
    
    
        org.apache.velocity
        velocity-engine-core
        2.3
    
    
    
        org.freemarker
        freemarker
        2.3.31
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    模板引擎两者选其一即可,这里选择的是freemarker

    3.2 编写CodeGenerator类

    public class CodeGenerator {
    
        @Test
        public void run() {
            // 数据库连接url
            String url = "jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=GMT%2B8";
            // 数据库用户名和密码
            String username = "root";
            String password = "123456";
            // 代码生成模块地址
            String moudlePath = System.getProperty("user.dir") + "/src/main/java";
            // xml文件生成地址
            String xmlPath = System.getProperty("user.dir") + "/src/main/resources/mapper";
            // 需要生成的数据表
            String[] tableArr = new String[]{
                    "user_info",
                    "comment"
            };
    
            FastAutoGenerator.create(url, username, password)
                    .globalConfig(builder -> {
                        builder.author("RedStar") // 设置作者
                                .enableSwagger() // 开启 swagger 模式
                                .disableOpenDir()
                                .dateType(DateType.ONLY_DATE)
                                .fileOverride() // 覆盖已生成文件
                                .outputDir(moudlePath); // 指定输出目录
                    })
                    .packageConfig(builder -> {
                        builder.parent("com.xbdemo.demo") // 设置模块名
                                .mapper("dao") // 设置mapper包名
                                .pathInfo(Collections.singletonMap(OutputFile.xml, xmlPath)); // 设置xml文件生成目录
                    })
                    .strategyConfig(builder -> {
                        builder.addInclude(tableArr) // 设置需要生成的表名
                                .addTablePrefix("t_", "c_") // 设置过滤表前缀
                                .entityBuilder()
                                .enableLombok()
                                .serviceBuilder()
                                .formatServiceFileName("%sService"); // //去掉Service接口的首字母I
                    })
                    .templateConfig(builder -> {
                        builder.disable(TemplateType.CONTROLLER); // 设置禁止生成controller
                    })
                    .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                    .execute();
        }
    }
    
    • 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

    注:

    • CodeGenerator.class代码所在文件目录没有特殊要求
    • 适用版本:mybatis-plus-generator 3.5.1 及其以上版本,对历史版本不兼容!3.5.1 以下的请参考 代码生成器旧
    • 代码生成器详细配置参考:代码生成器配置新

    4. 自动填充配置与使用

    4.1 配置:

    在handler包下新建自动填充handler类

    /**
     * @author RedStar
     * @date 2022/05/11 14:33
     * @description mybatis-plus数据插入监听器,可自动插入默认值
     * 将需要此功能的属性加上注解@TableField(fill = FieldFill.INSERT/INSERT_UPDATE)
     */
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler{
    
        @Override
        public void insertFill(MetaObject metaObject) {
        	// 执行插入操作时执行该逻辑
            // 实体类属性名称和要自动填充的值
            this.setFieldValByName("createTime", new Date(), metaObject);
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
        	// 执行更新操作时执行该逻辑
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    entity包下的实体类进行相应处理

    @Data
    @TableName("user_info")
    public class UserInfo implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @TableId(value = "id", type = IdType.AUTO)
        private Integer id;
    
        private String name;
    
        private String password;
    
        private Boolean isDeleted;
        
        private Integer version;
    
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
    
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    4.2 使用演示

    @Service
    public class UserInfoServiceImpl extends ServiceImpl implements UserInfoService {
    
    
        @Override
        public Integer addUser() {
            UserInfo userInfo = new UserInfo();
            userInfo.setName("zhangsan");
            userInfo.setPassword("000000");
    		// service调用自己实体类对应的dao层可直接使用this.baseMapper.xxx
            return this.baseMapper.insert(userInfo);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    5. 逻辑删除

    5.1 配置

    • 数据表中添加字段is_deleted用于标记记录是否已删除

    • 实体类中对相应属性加上@TableLogic注解

    • 在MyMetaObjectHandler中设置自动填充

      @TableLogic
      private Boolean isDeleted;
      
      
      // 设置逻辑删除字段为0
      this.setFieldValByName("is_deleted", 0, metaObject);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    5.2 使用

    使用方式不变,无感知实现逻辑删除。
    注: 只对自动注入的 sql 起效:

    • 插入: 不作限制
    • 查找: 追加 where 条件过滤掉已删除数据,且使用 wrapper.entity 生成的 where条件会忽略该字段
    • 更新: 追加 where 条件防止更新到已删除数据,且使用 wrapper.entity 生成的 where条件会忽略该字段
    • 删除: 转变为 更新

    例如:
    删除: update user set deleted=1 where id = 1 and deleted=0
    查找: select id,name,deleted from user where deleted=0

    逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
    如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。

    6. 分页与乐观锁插件

    6.1 配置插件

    在config包下新建MybatisConfig.class

    @Configuration
    public class MybatisConfig {
    
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
            // 配置乐观锁插件
             mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
            // 配置分页插件
            mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
            return mybatisPlusInterceptor;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6.2 乐观锁

    • 数据表中添加字段version用于标记该记录的版本号
    • 实体类中对相应属性加上@Version注解
      在这里插入图片描述

    多线程操作数据时会实现乐观锁功能

    6.3 分页

    • 查询数据时新建Page对象

    • 传入当前页和记录数

    • 进行分页查询

      @Override
      public List getUserPage(Integer current, Integer size) {
      // 创建page对象, 参数为第几页和记录数
      Page pageObj = new Page<>(current, size);

      // 按照分页查询
      this.page(pageObj);
      
      // 返回查询出来的数据
      return pageObj.getRecords();
      
      • 1
      • 2
      • 3
      • 4
      • 5

      }

    此外Page对象还有几个属性

    records: 用来存放查询出来的数据
    total:返回记录的总数
    size: 每页显示条数,默认 10
    current: 当前页,默认1
    orders: 排序字段信息

    7. 配置打印mybatis日志

    application.properties:

    # mybatis日志
    mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    
    • 1
    • 2

    application.yml:

    # mybatis日志
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
    • 1
    • 2
    • 3
    • 4

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Spring Boot集成zipkin快速入门Demo
    Docker化Spring Boot应用
    用three.js做一个3D汉诺塔游戏(上)
    Mybatis( If条件失效 )
    强化学习——Q-Learning算法原理
    vue2.x 迭代更新项目去掉缓存处理
    总结linux常用命令
    java程序连接redis服务器
    目标检测YOLO实战应用案例100讲-基于改进YOLOv3的目标检测模型研究与应用(下)
    Effective Java学习笔记---------序列化
  • 原文地址:https://blog.csdn.net/m0_67391683/article/details/126115740