zoukankan      html  css  js  c++  java
  • 学习笔记_MybatisPlus

    MybatisPlus学习笔记

    对应视频教程

    对应代码

    在学习mybatisPlus的时候,可以和之前扫地生的Hibernate学习笔记做对比,这样可以更高效地完成学习。

    简介

    Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。

    官网

    MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

    愿景

    我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

    img

    image-20210516222020633

    1、 快速入门

    快速入门

    使用第三方组件:

    1. 导入相应的依赖
    2. 研究依赖如何配置
    3. 代码如何编写
    4. 提高扩展技术能力

    特性

    • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
    • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
    • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
    • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
    • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
    • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
    • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
    • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
    • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
    • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
    • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
    • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

    框架结构

    framework

    步骤

    以下数据库表格的创建参照官网中的快速入门即可

    1. 创建数据库 mybatis_plus
    2. 创建user表
    DROP TABLE IF EXISTS user;
    
    CREATE TABLE user
    (
    	id BIGINT(20) NOT NULL COMMENT '主键ID',
    	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    	PRIMARY KEY (id)
    );
    -- 真实开发中往往还会有以下字段:
    -- version(乐观锁)、deleted(逻辑删除)、gmt_create、gmt_modified
    -- 这些字段在接下来也会不断完善
    
    -- 插入数据
    INSERT INTO user (id, name, age, email) VALUES
    (1, 'Jone', 18, 'test1@baomidou.com'),
    (2, 'Jack', 20, 'test2@baomidou.com'),
    (3, 'Tom', 28, 'test3@baomidou.com'),
    (4, 'Sandy', 21, 'test4@baomidou.com'),
    (5, 'Billie', 24, 'test5@baomidou.com');
    

    image-20210516222753526

    1. 创建项目

    新建一个springboot项目

    image-20210516223216960

    image-20210516223243770

    删除多余的文件(暂时用不到的)

    image-20210516223441189

    1. 导入依赖
    <!--数据库驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
    <!--mybatis-plus 这里不使用最新版本是因为3.0.5是更加原生态的,使用这个版本可以看见更多原生的开发-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>
    <!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    

    说明:我们使用mybatis-plus可以节省大量的代码,尽量不要同时导入mybatis和mybatis-plus,不然可能会存在版本问题

    1. 连接数据库,这一步和mybatis相同
    # 应用名称
    spring.application.name=mybatis_plus
    # 应用服务 WEB 访问端口,这里不采用默认的8080端口,而是自定义一个端口号,9080倒序为0809,即扫地生生日
    server.port=9080
    
    # mysql
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    

    连接数据库

    image-20210516224057855

    1. 使用了mybatis-plus之后

      1. pojo
      package top.saodisheng.pojo;
      
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      /**
       * Description:
       *
       * @author 扫地生_saodisheng
       */
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class User {
          private Long id;
          private String name;
          private Integer age;
          private String email;
      }
      
      1. mapper接口
      package top.saodisheng.mapper;
      
      import com.baomidou.mybatisplus.core.mapper.BaseMapper;
      import org.springframework.stereotype.Repository;
      import top.saodisheng.pojo.User;
      
      /**
       * Description:
       *
       * @author 扫地生_saodisheng
       */
      // 在对应的Mapper上面继承基本的接口 BaseMapper
      @Repository // 代表持久层
      public interface UserMapper extends BaseMapper<User> {
          // 所有的CRUD操作都已经基本完成了
          // 不需要像以前的配置一大堆文件了
      }
      
      1. 注意点:我么需要在主启动类上去扫描我们的mapper包下的所有接口

      image-20210516224730951

      1. 测试类中测试
      package top.saodisheng;
      
      import org.junit.jupiter.api.Test;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      import top.saodisheng.mapper.UserMapper;
      import top.saodisheng.pojo.User;
      
      import java.util.List;
      
      @SpringBootTest
      class MybatisPlusApplicationTests {
          // 继承了BaseMapper,所有的方法都来自父类
          // 也可以编写自己的扩展方法
          @Autowired
          UserMapper userMapper;
          @Test
          void contextLoads() {
              // 参数是一个Wrapper,条件构造器,这里我们先不用null
              // 查询全部用户
              List<User> users = userMapper.selectList(null);
              users.forEach(System.out::println);
          }
      
      }
      

    image-20210516225154554

    思考问题

    1. SQL 是谁帮我们写好的?

      Mybatis-Plus都写好了

    2. 方法哪里来的?

      Mybatis-Plus都写好了

    2、配置日志

    我们所有的sqld现在都是不可见的,我们希望知道它是怎么执行的,所以我们必须要看日志!

    # 配置日志 (系统自带的,控制台输出)
    mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    

    image-20210516225718793

    配置完日志之后,后面的学习就需要注意这个自动生成的SQL

    扫地生提示:由于控制台等输出日志是需要耗费一定资源的,所以在开发过程中可以使用日志来调试,但在实际的应用过程中就要关闭日志,因此我们在开发过程中可以使用多配置文件配置多个环境项目运行环境(当然也可以使用Yarn在单个配置文件中配置多个运行环境)

    3、CURD

    3.1 插入操作

    Insert插入

    // 测试插入功能
    @Test
    public void testInsert() {
        User user = new User();
        user.setName("扫地生");
        user.setAge(3);
        user.setEmail("13750596143@163.com");
    
        int result = userMapper.insert(user);// 帮我们自动生成id
        System.out.println(result);// 受影响的行数
        System.out.println(user);// 发现: id自动回填
    }
    

    image-20210516230349341

    image-20210516230442103

    通过观察结果发现,我们在插入数据是没有设置id,但自动生成了id

    数据库插入的id默认值为:全国唯一的id

    3.2 主键生成策略

    默认ID_WORKER 全局唯一id

    分布式系统唯一id生成

    雪花算法

    snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit是机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0。可以保证几乎全球唯一!

    主键自增

    我们需要配置主键自增:

    1. 实体类字段上@TableId(type = IdType.AUTO)
    2. 数据库字段上一定是自增的(这部分很重要,扫地生起初没有注意到这点,导致在插入数据时出现id没有默认值的报错
    3. 再次测试即可

    其余参数源码解释

    public enum IdType {
        AUTO(0), // 数据库id自增
        NONE(1), // 未设置主键
        INPUT(2), // 手动输入,自己写id
        ID_WORKER(3), // 默认的全局唯一id
        UUID(4), // 全局唯一id uuid
        ID_WORKER_STR(5); // ID_WORKER 字符串表示法
    }
    

    3.3 更新操作

    //测试更新
    @Test
    public void testUpdate(){
        User user = new User();
        // 通过条件自动拼接动态sql
        user.setId(5L);
        user.setName("saodisheng");
        user.setAge(18);
        // 注意: updateById 但是参数是一个 对象
        int i = userMapper.updateById(user);
        System.out.println(i);
    }
    

    image-20210517101555458

    image-20210517101722556

    所有的sql都是自动帮你动态配置的!

    3.4 自动填充

    创建时间、修改时间!这些操作一都是自动化完成的,我们不需要手动更新!

    阿里巴巴开发手册:所有的数据库表:gmt_create、gmt_modified几乎所有的表都要配置上!而且需要自动化!

    方式一:数据库级别(工作不允许修改数据库,所以一般不使用这种方法)

    1. 在表中新增字段create_time, update_time

    image-20210517102109785

    1. 再次测试插入方法,我们需要先把实体类同步

      private Date createTime;
      private Date updateTime;
      

      image-20210517102204255

    2. 再次查看更新结果即可

    //测试更新
    @Test
    public void testUpdate(){
        User user = new User();
        // 通过条件自动拼接动态sql
        user.setId(5L);
        user.setAge(2);
        user.setEmail("13750596143@163.com");
        // 注意: updateById 但是参数是一个对象
        int i = userMapper.updateById(user);
        System.out.println(i);
    }
    

    image-20210517103918292

    image-20210517103945373

    image-20210517104039572

    image-20210517104112964

    方式二:代码级别

    1. 删除数据库中的默认值、更新操作

    image-20210517104342063

    image-20210517104315733

    1. 实体类的字段属性上需要增加注解

      //字段添加填充内容
      @TableField(fill = FieldFill.INSERT)
      private Date createTime;
      
      @TableField(fill = FieldFill.INSERT_UPDATE)
      private Date updateTime;
      
    2. 编写处理器处理这个注解即可

      package top.saodisheng.handler;
      
      import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
      import lombok.extern.slf4j.Slf4j;
      import org.apache.ibatis.reflection.MetaObject;
      import org.springframework.stereotype.Component;
      
      import java.util.Date;
      
      /**
       * Description:
       * 元数据处理器
       * @author 扫地生_saodisheng
       */
      @Slf4j		
      @Component	// 一定不要忘记把处理器加到IOC容器中
      public class MyMetaObjectHandler implements MetaObjectHandler {
      
          // 插入时候的填充策略
          @Override
          public void insertFill(MetaObject metaObject) {
              log.info("start insert fill ...");
              // setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
              this.setFieldValByName("createTime", new Date(), metaObject);
              this.setFieldValByName("updateTime", new Date(), metaObject);
          }
      
          // 更新时的填充策略
          @Override
          public void updateFill(MetaObject metaObject) {
              log.info("start update fill ...");
              this.setFieldValByName("updateTime", new Date(), metaObject);
          }
      
      }
      
    3. 测试插入

      // 测试插入功能
      @Test
      public void testInsert() {
          User user = new User();
          user.setName("扫地生老刘");
          user.setAge(3);
          user.setEmail("13750596143@163.com");
      
          int result = userMapper.insert(user);// 帮我们自动生成id
          System.out.println(result);// 受影响的行数
          System.out.println(user);// 发现: id自动回填
      }
      

      image-20210517105409229

    4. 测试更新,观察时间

      //测试更新
      @Test
      public void testUpdate(){
          User user = new User();
          // 通过条件自动拼接动态sql
          user.setId(1393945008348368898L);
          user.setAge(2);
          user.setEmail("13750596143@163.com");
          // 注意: updateById 但是参数是一个 对象
          int i = userMapper.updateById(user);
          System.out.println(i);
      }
      

      image-20210517105740346

    3.5 乐观锁

    在面试过程中,经常会问到乐观锁、悲观锁

    乐观锁:顾名思义,它总是认为不会出问题,无论干什么都不去上锁的,如果出现了问题,再次更新值观测!

    悲观锁:顾名思义,它总是认为会出现问题,无论干什么都会上锁,再去操作。

    乐观锁的实现方式:

    • 取出记录时,获取当前version
    • 更新时,再带上这个version
    • 执行更新时,set version = newVersion where version = oldVersion
    • 如果version不对,就更新失败

    测试一下MybatisPlus的插件

    1. 数据库中增加一个version字段

      image-20210517110512875

    2. 需要在实体类中加上对应的字段

      @Version // 乐观锁的version注解
      private Integer version;
      
    3. 注册组件

      // 扫描我们的 mapper文件夹
      @MapperScan("top.saodisheng.mapper")
      @EnableTransactionManagement
      @Configuration
      public class MyBatisPlusConfig {
          // 注册乐观锁插件
          @Bean
          public OptimisticLockerInterceptor optimisticLockerInterceptor() {
              return new OptimisticLockerInterceptor();
          }
      }
      
    4. 测试一下

      // 测试乐观锁成功
      @Test
      public void testVersionSuccess(){
          // 1. 查询用户信息
          User user = userMapper.selectById(1L);
          // 2. 修改用户信息
          user.setName("saodisheng");
          user.setAge(2);
          user.setEmail("13750596143@163.com");
          // 3. 执行更新操作
          userMapper.updateById(user);
      }
      

    image-20210517111232228

    image-20210517111355242

    // 测试乐观锁失败!多线程下
    @Test
    public void testVersionFall(){
        // 线程1
        User user1 = userMapper.selectById(1L);
        user1.setName("saodisheng111");
        user1.setAge(3);
    
        // 线程2
        User user2 = userMapper.selectById(1L);
        user2.setName("saodisheng222");
        user2.setAge(4);
        userMapper.updateById(user2);
    
        //自旋锁来多次尝试提交!
        userMapper.updateById(user1); //如果没有乐观锁就会覆盖插队线程的值,然而采用了乐观锁之后,尽管线程1可能先获取到了数据库连接,但是线程2先提交的数据库更新,进而改变了version的值,导致线程1无法完成数据的更新。通过观看结果可知。这里可以和原子操作进行类比
    }
    

    image-20210517111633102

    image-20210517111651848

    image-20210517120910847

    3.6 查询操作

    // 测试查询
    @Test
    public void testSelectById(){
        User user = userMapper.selectById(1);
        System.out.println(user);
    }
    
    // 批量查询
    @Test
    public void testSelectByBatchIds(){
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        users.forEach(System.out::println);
    }
    
    // 按照条件查询之一使用 map
    @Test
    public void testSelectByMap(){
        HashMap<String, Object> map = new HashMap<>();
        // 自定义要查询
        map.put("name","saodisheng");
        List<User> users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }
    

    3.7 分页查询

    分页查询网站频繁使用

    1. 原始使用的limit进行分页
    2. pageHelper第三方插件
    3. MybatisPlus内置了分页插件

    如何使用

    1. 配置拦截器

      // 分页插件
      @Bean
      public PaginationInterceptor paginationInterceptor() {
          return new PaginationInterceptor();
      }
      
    2. 直接使用Page对象即可

      // 测试分页查询
      @Test
      public void testPage(){
          // 参数一: 当前页
          // 参数二: 页面大小
          // 使用了分页插件之后,所有的分页操作变得简单了
          Page<User> page = new Page<>(1,5);
          userMapper.selectPage(page, null);
      
          page.getRecords().forEach(System.out::println);
          System.out.println(page.getTotal());
      }
      
      

    image-20210517121521232

    3.8 删除操作

    // 测试删除
    @Test
    public void testdelete(){
        userMapper.deleteById(5L);
    }
    
    // 测试批量删除
    @Test
    public void testdeleteBatchId(){
        userMapper.deleteBatchIds(Arrays.asList(1393945008348368897L,1393945008348368898L));
    }
    
    //通过map删除
    @Test
    public void testDeleteByMap(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("name","saodisheng222");
        userMapper.deleteByMap(map);
    }
    

    我们在工作中会遇到一些问题:逻辑问题

    3.9 逻辑删除

    物理删除:从数据中直接移除

    逻辑删除:在数据库中没有被移除,而是通过一个变量让他失效!deleted=0 --> deleted=1

    管理员可以查看被删除的记录!防止数据的丢失!类似于回收站

    测试:

    1. 在数据库表中增加一个deleted字段

    image-20210517122527175

    1. 实体类中增加属性

      @TableLogic // 逻辑删除
      private Integer deleted;
      
    2. 配置

      // 逻辑删除组件
      @Bean
      public ISqlInjector sqlInjector(){
          return new LogicSqlInjector();
      }
      
      # 配置逻辑删除的参数配置
      mybatis-plus.global-config.db-config.logic-delete-value=1
      mybatis-plus.global-config.db-config.logic-not-delete-value=0
      
    3. 测试删除

      // 测试删除
      @Test
      public void testDeleteById() {
          userMapper.deleteById(2L);
      }
      

      image-20210517123427832

    4. 测试查询

      // 查询
      @Test
      public void testSelectById() {
          User user = userMapper.selectById(2L);
          System.out.println(user);
      }
      

      image-20210517123650020

    以上所有的CURD操作及其扩展操作,都必须要掌握精通,会大大提高工作效率!

    4、性能分析插件

    我们在平时的开发中,会遇到一些慢sql,解决方案:测试,druid监控

    作用:性能分析拦截器,用于输出每条SQL 语句及其执行时间

    MybatisPlus也提供了性能分析插件,如果超过了这个时间就会停止运行!

    1. 导入插件

      // SQL执行效率插件
      @Bean
      @Profile({"dev","test"})// 设置再测试环境和开发环境中才开启,保证我们的开发效率
      public PerformanceInterceptor performanceInterceptor(){
          PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
          performanceInterceptor.setMaxTime(100); // ms 设置sql执行的最大时间,如果超过了则不执行
          performanceInterceptor.setFormat(true); // 是否格式化
          return performanceInterceptor;
      }
      

      记住,要在SpringBoot中配置环境为dev或者test环境

      # 设置开发环境
      spring.profiles.active=dev
      
    2. 测试使用

      // 测试查询
      @Test
      public void testSelectById(){
          User user = userMapper.selectById(3);
          System.out.println(user);
      }
      

      只要超出时间就会抛出异常

    测试使用

    image-20210517124322548

    使用性能分析插件可以提高效率,新版本MP已经移除该插件了,可以使用Druid

    5、条件构造器

    十分重要:wrapper

    我们要写一些复杂的sql就可以使用它来代替!

    条件构造器

    package top.saodisheng;
    
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import top.saodisheng.mapper.UserMapper;
    import top.saodisheng.pojo.User;
    
    import java.util.List;
    
    /**
     * Description:
     *
     * @author 扫地生_saodisheng
     */
    @SpringBootTest
    public class WrapperTest {
        @Autowired
        private UserMapper userMapper;
    
        @Test
        void contextLoads() {
            // 查询name不为空,并且邮箱不为空的用户,年龄大于等于3岁
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            wrapper.isNotNull("name")
                    .isNotNull("email")
                    .ge("age", 3);
            userMapper.selectList(wrapper).forEach(System.out::println);
        }
    }
    

    image-20210517125250189

    image-20210517125155404

    image-20210517125213125

    @Test
    void test2() {
        // 查询名字saodisheng
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name", "saodisheng");
        User user = userMapper.selectOne(wrapper);      // 查询一个数据,出现多个结果使用List或Map,否则会出现错误
        System.out.println(user);
    }
    
    @Test
    void test3() {
        // 查询between
        // 查询名字saodisheng
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("age", 20, 30);     // 区间
        Integer count = userMapper.selectCount(wrapper);        // 查询结果数
        System.out.println(count);
    }
    
    @Test
    void test4() {
        // 模糊查询
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 左和右的区别,左的话是%e,同理
        wrapper.notLike("name", "a")
                .likeRight("email", "扫地生");
        List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
        maps.forEach(System.out::println);
    }
    /**
    test4:
     Time:43 ms - ID:top.saodisheng.mapper.UserMapper.selectMaps
    Execute SQL:
        SELECT
            id,
            name,
            age,
            email,
            create_time,
            update_time,
            version,
            deleted 
        FROM
            user 
        WHERE
            deleted=0 
            AND name NOT LIKE '%a%' 
            AND email LIKE '扫地生%'
    **/
    

    6、代码生成器

    dao、pojo、service、controller都给我们自己编写完成

    AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

    只需要改实体类名字和包名还有数据库配置即可

    需要使用到的pom依赖:

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <!-- 模板引擎 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>2.0</version>
            </dependency>
    
            <!--数据库驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.22</version>
            </dependency>
            <!--mybatis-plus-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.0.5</version>
            </dependency>
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.9.2</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.9.2</version>
            </dependency>
    </dependencies>
    

    测试代码:

    package top.saodisheng;
    
    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.annotation.FieldFill;
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
    import com.baomidou.mybatisplus.generator.config.GlobalConfig;
    import com.baomidou.mybatisplus.generator.config.PackageConfig;
    import com.baomidou.mybatisplus.generator.config.StrategyConfig;
    import com.baomidou.mybatisplus.generator.config.po.TableFill;
    import com.baomidou.mybatisplus.generator.config.rules.DateType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    
    import java.util.ArrayList;
    
    /**
     * Description:
     *
     * @author 扫地生_saodisheng
     */
    // 代码自动生成器
    public class SaodishengCode {
        public static void main(String[] args) {
            // 需要构建一个代码自动生成器对象
            AutoGenerator mpg = new AutoGenerator();
    
            // 配置策略
            // 1. 全局配置
            GlobalConfig gc = new GlobalConfig();
            String projectPath = System.getProperty("user.dir");    // 指定代码输出的位置(获取项目目录)
            gc.setOutputDir(projectPath + "/src/main/java");
            gc.setAuthor("saodisheng"); // 设置作者
            gc.setOpen(false);  // 是否打开资源管理器(生成完代码打开目录)
            gc.setFileOverride(false);  // 是否覆盖原来的文件
            gc.setServiceName("%sService"); // 去掉IService的I前缀(正则表达式)
            // 设置字段
            gc.setIdType(IdType.ID_WORKER);
            gc.setDateType(DateType.ONLY_DATE);
            gc.setSwagger2(true);   // 配置swagger
    
            mpg.setGlobalConfig(gc);
    
            // 2. 设置数据源
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
            dsc.setDriverName("com.mysql.cj.jdbc.Driver");
            dsc.setUsername("root");
            dsc.setPassword("root");
    
            dsc.setDbType(DbType.MYSQL);    // 数据库类型
    
            mpg.setDataSource(dsc);
    
            // 3. 包的配置(只需要改实体类名字和包名还有数据库配置即可)
            PackageConfig pc = new PackageConfig();
            pc.setModuleName("blog");   // 模块名
            pc.setParent("top.saodisheng"); // 设置存放类的包路径
            pc.setEntity("entity"); // 设置实体类
            pc.setMapper("mapper"); // 设置mapper
            pc.setService("service");   // 设置service层
            pc.setController("controller"); // 设置Controller层
            mpg.setPackageInfo(pc);
    
            // 4. 策略配置
            StrategyConfig strategy = new StrategyConfig();
            strategy.setInclude("user");    // 设置要映射的表名
            // 设置下划线转驼峰命名
            strategy.setNaming(NamingStrategy.underline_to_camel);
            strategy.setColumnNaming(NamingStrategy.underline_to_camel);
            strategy.setEntityLombokModel(true);    // 自动lombok
            strategy.setLogicDeleteFieldName("deleted");    // 设置逻辑删除列名
            
            // 自动填充配置
            TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);    // 创建时间
            TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE); // 修改时间
            ArrayList<TableFill> tableFills = new ArrayList<>();
            tableFills.add(gmtCreate);
            tableFills.add(gmtModified);
            strategy.setTableFillList(tableFills);  // 添加自动填充
            // 乐观锁
            strategy.setVersionFieldName("version");    // 设置版本字段名称
            strategy.setRestControllerStyle(true);
            strategy.setControllerMappingHyphenStyle(true);
    
            mpg.setStrategy(strategy);
    
    
            mpg.execute();  // 代码自动生成器执行
        }
    }
    
    

    image-20210517155835715

    向大神看齐
  • 相关阅读:
    js转化 保留2位小数
    python练习:打印九九乘法表
    PyCharm常用快捷键及工具
    python关键字
    Python学习资源
    Jira项目导入,被导入项目与目的系统数据类型不一致导入不成功的解决方案
    压测的时候到底要不要加集合点?
    Java Vuser协议JDBC脚本编写(MySQL)
    eclipse工具使用
    oracle忘记sys,system密码的解决方法
  • 原文地址:https://www.cnblogs.com/Liu-xing-wu/p/14777479.html
Copyright © 2011-2022 走看看