(Mybatis笔记)mybatis-plus 3.4.3.4 + mybatis-plus-generator 3.5.1 代码生成器使用——超详细

目录

1.前言

2.特性

3.开始使用

4.演示自动生成过程java+xml

5.改动UserLoginController(测试自带的CRUD)

6.自定义SQL语句

7.Swagger2接口文档配置类

8.完整自动生成类FastAutoGeneratorTest.java

9.总结


前提须知:使用(以下教程仅适用 3.5.1 以上版本,对历史版本的不兼容)


Github源码地址:https://github.com/GuiZhouAndroid/mybatisDemo


1.前言

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

        本章主要是配置MP及代码自动生成器相关测试,没有介绍MP主要功能使用。

        下一章介绍使用MP封装的CRUD接口与MySQL数据交互的教程,传送门链接:

        (Mybatis笔记)Mybatis-Plus——封装接口IService使用(一)

          CSDN链接https://blog.csdn.net/qq_39038178/article/details/120612802


        (Mybatis笔记)Mybatis-Plus——封装接口IService使用(二)

          CSDN连接:https://blog.csdn.net/qq_39038178/article/details/120668991


2.特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

3.开始使用

        (1)创建一个SpringBoot工程项目

                这里我之前写过创建步骤,教程如下:

        CSDN链接:(Spring笔记)IDEA创建SpringBoot项目工程

        (2)工程准备好之后,在pom.xml中引入mybatis-plus+mysql及相关依赖 

        <!-- mybatis plus  -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.4</version>
        </dependency>
        <!--generator 当前最新版 3.5.1 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!-- freemarker模板引擎,代码自动生成时调用 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>
        <!--阿里 JSON-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>
        <!--swagger 接口说明文档框架-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

        (3) 首先,贴出我的MySQL建表语句(增加两条用户数据)

drop table if exists t_user_login;

/*==============================================================*/
/* Table: t_user_login                                          */
/*==============================================================*/
create table t_user_login
(
   ul_id                int not null auto_increment comment '登录自增ID',
   ul_username          varchar(255) not null comment '登录名',
   ul_password          varchar(255) not null comment '登录密码',
   primary key (ul_id),
   unique key AK_Key_2 (ul_username)
);
alter table t_user_login comment '用户登录表';

insert into t_user_login (ul_username,ul_password) values ('admin','admin');
insert into t_user_login (ul_username,ul_password) values ('root','root');

        (4) 依赖准备好后,创建Java类,在main()方法中:配置连接mysql数据库信息+调用自动生成API并设置各类参数,根据自定义策略,执行自动生成代码操作。这里新建一个FastAutoGeneratorTest.java,提供主方法main()。

        ***数据库配置***:

    /**
     * 数据源配置
     */
    private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig
            .Builder("jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "mysql用户名", "mysql密码")
            .dbQuery(new MySqlQuery()) //数据库查询
            .schema("mybatis-plus") //数据库schema(部分数据库适用)
            .typeConvert(new MySqlTypeConvert()) //数据库类型转换器
            .keyWordsHandler(new MySqlKeyWordsHandler()); //数据库关键字处理器

         ***全局配置***:提醒:开启swagger2需要添加依赖哟(上述已添加)—— .enableSwagger()

    FastAutoGenerator.create(DATA_SOURCE_CONFIG)
    // 全局配置
        .globalConfig((scanner, builder) -> builder
        .fileOverride() //覆盖已生成文件,默认值:false
        .outputDir(System.getProperty("user.dir") + "/src/main/java") //指定输出目录,默认值: windows:D://
        .author(scanner.apply("请输入开发者名称:"))//作者名,baomidou 默认值:作者
        .dateType(DateType.TIME_PACK)//时间策略,DateType.ONLY_DATE 默认值: DateType.TIME_PACK
        .commentDate("yyyy-MM-dd")//注释日期,默认值: yyyy-MM-dd
        //.disableOpenDir()// 禁止打开输出目录,默认值:true
        //.enableKotlin() //开启 kotlin 模式,默认值:false
        .enableSwagger() //开启 swagger 模式,默认值:false
        .build()//加入构建队列
    )

         ***包配置***:

    // 包配置
    .packageConfig((scanner, builder) -> builder
        .parent(scanner.apply("请输入包名:"))//父包名,默认值:com.baomidou
        //.moduleName("sys")//父包模块名,默认值:无
        .entity("entity")//Entity 包名,默认值:entity
        .service("service")//Service 包名,默认值:service
        .serviceImpl("service.impl")//Service Impl 包名,默认值:service.impl
        .mapper("mapper")//Mapper 包名,默认值:mapper
        .xml("mapper.xml")//Mapper XML 包名,默认值:mapper.xml
        .controller("controller")//Controller 包名,默认值:controller
        //.other("other")//自定义文件包名,	输出自定义文件时所用到的包名
        .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "src/main/resources/mapper")) //路径配置信息,Collections.singletonMap(OutputFile.mapperXml, "D://")
        .build()//加入构建队列
    )

         ***模板引擎***:

    //模板配置
    .templateConfig((scanner, builder) -> builder
        //.disable()//禁用所有模板
        //.entityKt("/templates/entity.java")// 设置实体模板路径(kotlin),/templates/entity.java
        .disable(TemplateType.ENTITY)//禁用模板 TemplateType.ENTITY
        .entity("/templates/entity.java") //设置实体模板路径(JAVA),/templates/entity.java
        .service("/templates/service.java")//设置 service 模板路径,/templates/service.java
        .serviceImpl("/templates/serviceImpl.java")//设置 serviceImpl 模板路径,/templates/serviceImpl.java
        .mapper("/templates/mapper.java")//设置 mapper 模板路径,/templates/mapper.java
        .mapperXml("/templates/mapper.xml")//设置 mapperXml 模板路径,/templates/mapper.xml
        .controller("/templates/controller.java")//设置 controller 模板路径,/templates/controller.java
        .build()//加入构建队列
)

         ***注入配置——自定义模板***:tableInfoobjectMap会在控制台输出表和对象信息

    //注入配置————自定义模板
    .injectionConfig(builder -> builder
        .beforeOutputFile((tableInfo, objectMap) -> {
        System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
        }) //输出文件之前消费者
        .customMap(Collections.singletonMap("my_field", "你好!这是我自己注入的属性哦")) //自定义配置 Map 对象
        //.customFile(Collections.singletonMap("test.txt", "/templates/test.vm")) //自定义配置模板文件
        .build()//加入构建队列
    )

         ***策略配置***:

    // 策略配置
    /**
    * schema:在数据库中表示的是数据库对象集合,它包含了各种对像,比如:表,视图,存储过程,索引等等。
    * 一般情况下一个用户对应一个集合,所以为了区分不同的集合就需要给不同的集合起名字。
    * 用户的schema名就相当于用户名,并作为该用户缺省schema。所以说schema集合看上去像用户名。
    * 例如当我们访问一个数据表时,如果该表没有指明属于哪个schema,系统就会自动的加上缺省的schema。
    */
    .strategyConfig(builder -> builder
        /** 基本参数配置 */
        .enableCapitalMode()//开启大写命名,默认值:false
        .enableSkipView()//开启跳过视图,默认值:false
        .disableSqlFilter()//禁用 sql 过滤,默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关
        .likeTable(new LikeTable("t_user_login"))//模糊表匹配(sql 过滤)	likeTable 与 notLikeTable 只能配置一项
        /** 设置需要生成的表名 */
        .addInclude("t_user_login")// 增加表匹配(内存过滤),include 与 exclude 只能配置一项
        /** 前缀配置*/
        .addTablePrefix("t_")//增加过滤表前缀
        //.addFieldSuffix("_")//增加过滤表后缀
        //.addFieldPrefix("ul_")//增加过滤字段前缀  本人不建议使用,去掉后缀,会导致驼峰命名实体类的变量名不带前缀,去掉后,错误:Username,正确:ulUsername
        //.addFieldSuffix("_")//增加过滤字段后缀

注意+警告+重点:

        过滤表前缀addTablePrefix():是过滤表数据库字段名前缀的,例如:数据库字段名“ul_username”,使用“ addTablePrefix("ul_") ;”,生成的Bean实体类,用户名对应的私有属性名称就会自动为“ username ”,不使用过去字段前缀,生成的属性名称就是“ ulUsername ”,这里有个坑,数据库表字段,如果是“ ul_username ”,那么使用过滤前缀“ addTablePrefix("ul_") ;” 会导致,查询结果为null,因此强烈建议不使用该过滤前缀方法。这是新版本出现的问题,请知悉。本人亲自踩坑!!!!(记得实体类策略配置时,表名和字段都设置为驼峰命名哦,两者不设置的话,默认就是驼峰格式)

        查询空数据示例

        ***实体策略配置***:策略配置同级(紧接上方策略配置)

        /** 实体策略配置 */
        .entityBuilder()//实体策略配置
        .disableSerialVersionUID()//禁用生成 serialVersionUID,默认值:true
        .enableLombok()//开启 lombok 模型,默认值:false
        .enableChainModel()//开启链式模型,默认值:false
        .enableRemoveIsPrefix()//开启 Boolean 类型字段移除 is 前缀,默认值:false
        .enableTableFieldAnnotation()//开启生成实体时生成字段注解,默认值:false
        .enableActiveRecord()//开启 ActiveRecord 模型,默认值:false
        .naming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略,默认下划线转驼峰命名:NamingStrategy.underline_to_camel
        .columnNaming(NamingStrategy.underline_to_camel)//数据库表字段映射到实体属性的命名策略,默认为 null,未指定按照 naming 执行
        .idType(IdType.AUTO)//全局主键类型
        .formatFileName("%sBean")//格式化文件名称,生成实体的后缀,建议这样使用,生成后:UserLoginBean
        //.superClass(BaseEntity.class)//设置父类
        //.enableColumnConstant()//开启生成字段常量,默认值:false
        //.addIgnoreColumns("age")//添加忽略字段
        //.nameConvert(INameConvert)//名称转换实现
        //.versionColumnName("version")//乐观锁字段名(数据库)
        //.versionPropertyName("version")//乐观锁属性名(实体)
        //.logicDeleteColumnName("deleted")//逻辑删除字段名(数据库)
        //.logicDeletePropertyName("deleteFlag")//逻辑删除属性名(实体)
        //.enableSchema()//启用 schema,默认值:false,多 schema 场景的时候打开
        //.addExclude("t_simple")//增加表排除匹配(内存过滤),include 与 exclude 只能配置一项
        //.notLikeTable(new LikeTable("USER"))//模糊表排除(sql 过滤)	likeTable 与 notLikeTable 只能配置一项

 注意+警告+重点:以下两个记得加上,作用于实例类的驼峰命名,否则会有类名会有下划线,如果不这两个属性,默认值均为:NamingStrategy.underline_to_camel

.naming(NamingStrategy.underline_to_camel)

.columnNaming(NamingStrategy.underline_to_camel)

         ***controller策略配置***:

    /** controller 策略配置 */
    .controllerBuilder()//controller 策略配置
    .enableHyphenStyle()//开启驼峰转连字符,默认值:false
    .enableRestStyle()//开启生成@RestController 控制器,默认值:false
    .formatFileName("%sController")//格式化文件名称——controller包下自动生成的类后缀,例如UserLoginController

          ***Service策略配置***:

    /** Service 策略配置 */
    .serviceBuilder()//service 策略配置
    .formatServiceFileName("%sService")//转换 service 接口文件名称,例如:UserLoginService
    .formatServiceImplFileName("%sServiceImpl")//转换 service 实现类文件名称,例如:UserLoginServiceImpl

          ***mapper策略配置***:

    /** mapper 策略配置 */
    .mapperBuilder()//mapper 策略配置
    .superClass(BaseMapper.class)//设置父类,BaseMapper是com.baomidou.mybatisplus.core.mapper中的
    .enableMapperAnnotation()//开启 @Mapper 注解,默认值:false
    .enableBaseResultMap()//启用 BaseResultMap 生成,默认值:false
    .enableBaseColumnList()//启用 BaseColumnList,默认值:false
    .formatMapperFileName("%sMapper")//转换 mapper 接口文件名称后缀,mapper目录下的,例如:UserLoginMapper(有@Mapper)
    .formatXmlFileName("%sMapper")//转换 xml 文件名称后缀,例如:UserLoginMapper.xml,Mybatis的xml映射文件
    .build()//加入构建队列

          ***自动生成模板引擎***:

    /**
    * 模板引擎
    */
    //Velocity
    //.templateEngine(new VelocityTemplateEngine())
    //Beetl
    //.templateEngine(new BeetlTemplateEngine())
    //Freemarker
    .templateEngine(new FreemarkerTemplateEngine())
    /**
    * 开始自动生成代码,执行队列构建操作
    */
    .execute();

说明模板引擎,默认Velocity方式,Beetl和Freemaker方式需要按如上方式进行设置,这三种方式都需要在pom.xml文件中添加对应依赖,这里有点关键点,就是所选依赖版本,必须与mybatis-plus-generator中的版本一致,不然会在运行自动生成时报错。

        本人使用的 mybatis-plus-generator中的版本:

        本人的pom.xml中引入的模板引擎依赖,亲测三种模板引擎方式都可以使用


4.演示自动生成过程java+xml

        (1)自动生成前项目工程目录如下:

        (2)运行FastAutoGeneratorTest.java

        (3)自动生成工程目录概况

        ——Mapper映射接口

/**
 * <p>
 * 用户登录表 Mapper 接口
 * </p>
 *
 * @author ZSAndroid
 * @since 2021-10-01
 */
@Mapper
public interface UserLoginMapper extends BaseMapper<UserLoginBean> {

}

超级无敌重点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

SpringBoot启动类,必须扫描工程目录的mapper包,否则自定义SQL无效的Mybatis-plus功能无法启用。

        ——Service服务接口

/**
 * <p>
 * 用户登录表 服务类
 * </p>
 *
 * @author ZSAndroid
 * @since 2021-10-01
 */
public interface UserLoginService extends IService<UserLoginBean> {

}

        ——Service服务实现类

/**
 * <p>
 * 用户登录表 服务实现类
 * </p>
 *
 * @author ZSAndroid
 * @since 2021-10-01
 */
@Service
public class UserLoginServiceImpl extends ServiceImpl<UserLoginMapper, UserLoginBean> implements UserLoginService {

}

        ——entity实体Bean类

/**
 * <p>
 * 用户登录表
 * </p>
 *
 * @author ZSAndroid
 * @since 2021-10-01
 */
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_user_login")
@ApiModel(value = "UserLoginBean对象", description = "用户登录表")
public class UserLoginBean extends Model<UserLoginBean> {

    @ApiModelProperty("登录自增ID")
    @TableId(value = "ul_id", type = IdType.AUTO)
    private Integer ulId;

    @ApiModelProperty("登录名")
    @TableField("ul_username")
    private String ulUsername;

    @ApiModelProperty("登录密码")
    @TableField("ul_password")
    private String ulPassword;
    
    //自动生成的pkVal()可以删除
    @Override
    public Serializable pkVal() {
        return this.ulId;
    }
}

        ——controller业务控制类Mapper.xml

/**
 * <p>
 * 用户登录表 前端控制器
 * </p>
 *
 * @author ZSAndroid
 * @since 2021-10-01
 */
@RestController
@RequestMapping("/user-login-bean")
public class UserLoginController {

}

        ——Mapper.xmlUserLoginMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserLoginMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.example.entity.UserLoginBean">
        <id column="ul_id" property="ulId" />
        <result column="ul_username" property="ulUsername" />
        <result column="ul_password" property="ulPassword" />
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        ul_id, ul_username, ul_password
    </sql>

</mapper>

重点注意:自动生成的映射xml文件,需要在配置文件声明,本人习惯yml格式,下面贴出我的配置样式

# SpringBoot资源配置
spring:
  datasource:
    name: testdb  #数据库名
    url: jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC #url
    username: xxx  #用户名
    password: xxx  #密码
    driver-class-name: com.mysql.cj.jdbc.Driver  #数据库链接驱动

# 启动默认端口
server:
  port: 8085   

mybatis-plus:
  mapper-locations: classpath*:mapper/**/*Mapper.xml # 根据项目工程更改
  type-aliases-package: com.example.entity #根据项目工程更改
  configuration:
    cache-enabled: false
    map-underscore-to-camel-case: true
    auto-mapping-behavior: full
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # mybatis打印日志
  global-config:
    # 逻辑删除配置
    db-config:
      #id-type: AUTO
      # 删除前
      logic-not-delete-value: 1
      # 删除后
      logic-delete-value: 0

        (4)到这里所有的准备工程已完成,下面测试自动生成代码自带的CRUD能否获取MySQL数据库的用户表信息。


5.改动UserLoginController(测试自带的CRUD)

       (1) 写个简单的接口测试数据:

@RestController
@RequestMapping("/user-login-bean")
public class UserLoginController {

    /** 常规写法:Spring容器中查询对应类型的bean,然后根据名称来查找资源 */
    @Autowired
    UserLoginService userLoginService;

    //浏览器访问 http://localhost:8085/user-login-bean/getUserById
    @RequestMapping("/getUserById")
    public UserLoginBean getUserById(){
        //getById是mybatisplus封装好的,通过ID值,查找映射表中的信息
        return userLoginService.getById(1);
    }
}

      (2) 运行SpringBoot工程:

      (3) 浏览器URL地址栏键入:http://localhost:8085/user-login-bean/getUserById

***获取MySQL的用户表信息成功***

6.自定义SQL语句

        上面测试的是MyBatis-Plus代码自动生成的测试,显然单表的CRUD不符合我们的开发需求,那下面演示一下,在Mapper.xml映射文件中,自定义SQL语句,然后通过Bean、Mapper、Service、Controller、是否能成功查询用户登录表信息,废话不多说,开始!

        (1)UserLoginMapper.xml,增添findAllUser内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserLoginMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.example.entity.UserLoginBean">
        <id column="ul_id" property="ulId" />
        <result column="ul_username" property="ulUsername" />
        <result column="ul_password" property="ulPassword" />
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        ul_id, ul_username, ul_password
    </sql>
    <!-- 查询全部用户信息,t_user_login:是我MySQL数据中的用户登录表,可以改为自己的 -->
    <select id="findAllUser" resultType="com.example.entity.UserLoginBean">
        select * from t_user_login
    </select>

</mapper>

        (2)UserLoginMapper接口,增添findAllUser内容

@Mapper
public interface UserLoginMapper extends BaseMapper<UserLoginBean> {
    List<UserLoginBean> findAllUser();
}

        (3)UserLoginService接口,增添findAllUser内容

public interface UserLoginService extends IService<UserLoginBean> {
     List<UserLoginBean> findAllUser();
}

        (4)UserLoginServiceImpl服务实现类,注入Mapper的findAllUser()方法

@Service
public class UserLoginServiceImpl extends ServiceImpl<UserLoginMapper, UserLoginBean> implements UserLoginService {
    
    @Autowired
    UserLoginMapper userLoginMapper;

    @Override
    public List<UserLoginBean> findAllUser() {
        return userLoginMapper.findAllUser();
    }
}

        (5)UserLoginService接口,增添findAllUser内容

@RestController
@RequestMapping("/user-login-bean")
public class UserLoginController {

    /** 常规写法:Spring容器中查询对应类型的bean,然后根据名称来查找资源 */
    @Autowired
    UserLoginService userLoginService;

    //浏览器访问 http://localhost:8085/user-login-bean/getUserById
    @RequestMapping("/getUserById")
    public UserLoginBean getUserById(){
        //getById是mybatisplus封装好的,通过ID值,查找映射表中的信息
        return userLoginService.getById(1);
    }
    //浏览器访问 http://localhost:8085/user-login-bean/findAllUser
    @RequestMapping("/findAllUser")
    public List<UserLoginBean> findAllUser(){
        //findAllUser() 是自定义的SQL查询映射方法——查询t_user_login表中全部用户信息
        return userLoginService.findAllUser();
    }
}

        (6)重新运行SpringBoot工程项目,浏览器URL键入:http://localhost:8085/user-login-bean/findAllUser

***获取MySQL的用户表全部信息成功***


7.Swagger2接口文档配置类

        回忆一下,我们是不是在pom.xml文件引入了Swagger2和它的ui的依赖,还有在全局配置中开启了Swagger的自动文档生成的方法

        ——“.enableSwagger() //开启 swagger 模式,默认值:false

        ——pom.xml

        <!--swagger 接口说明文档框架-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

        如果不引入Swagger2依赖,当你运行项目后,会在entity中的UserLoginBean,发现报错如下,解决方法,添加以上两个依赖

        重点:你以为添加了依赖就行了?这里还需要Swagger2配置类,才能访问接口文档首页,代码如下:在工程目录config/中

         新建Swagger2Config.java配置类:

/**
 * created by on 2021/10/3
 * 描述:Swagger接口文档配置类+添加摘要信息
 *
 * @author ZSAndroid
 * @create 2021-10-3-11:08
 */
@Configuration //标记配置类
@EnableSwagger2 //是springfox提供的一个注解,代表swagger2相关技术开启,会扫描当前类所在包,及子包中所有的类型中的注解。做swagger文档的定值。
public class Swagger2Config {
    @Bean
    public Docket buildDocket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(buildApiInf())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example")) //这里必须与包名一致,否则报错
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo buildApiInf(){
        return new ApiInfoBuilder()
                .title("API文档标题")
                .description("API文档说明概述")
                .termsOfServiceUrl("https://blog.csdn.net/qq_39038178")
                .contact(new Contact("CSDN博客主页", "https://blog.csdn.net/qq_39038178", null))
                .build();
    }
}

        浏览器访问Swagger2文档首页:http://localhost:8085/swagger-ui.html


8.完整自动生成类FastAutoGeneratorTest.java

/**
 * <p>
 * 快速生成
 * </p>
 *
 * @author ZSAndroid
 * @create 2021-10-1-10:08
 */
public class FastAutoGeneratorTest {

    /**
     * 数据源配置
     */
    private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig
            .Builder("jdbc:mysql://localhost:3306/testdb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "root", "root")
            .dbQuery(new MySqlQuery()) //数据库查询
            .schema("mybatis-plus") //数据库schema(部分数据库适用)
            .typeConvert(new MySqlTypeConvert()) //数据库类型转换器
            .keyWordsHandler(new MySqlKeyWordsHandler()); //数据库关键字处理器

    /**
     * 执行 run
     */
    public static void main(String[] args) {
//        "C://Users//ZSAndroid//Desktop//mybatisDemo//src//main//java"
        FastAutoGenerator.create(DATA_SOURCE_CONFIG)
                // 全局配置
                .globalConfig((scanner, builder) -> builder
                        .fileOverride() //覆盖已生成文件,默认值:false
                        .outputDir(System.getProperty("user.dir") + "/src/main/java") //指定输出目录,默认值: windows:D://
                        .author(scanner.apply("请输入开发者名称:"))//作者名,baomidou 默认值:作者
                        .dateType(DateType.TIME_PACK)//时间策略,DateType.ONLY_DATE 默认值: DateType.TIME_PACK
                        .commentDate("yyyy-MM-dd")//注释日期,默认值: yyyy-MM-dd
                        //.disableOpenDir()// 禁止打开输出目录,默认值:true
                        //.enableKotlin() //开启 kotlin 模式,默认值:false
                        .enableSwagger() //开启 swagger 模式,默认值:false
                        .build()//加入构建队列
                )
                // 包配置
                .packageConfig((scanner, builder) -> builder
                        .parent(scanner.apply("请输入包名:"))//父包名,默认值:com.baomidou
                        //.moduleName("sys")//父包模块名,默认值:无
                        .entity("entity")//Entity 包名,默认值:entity
                        .service("service")//Service 包名,默认值:service
                        .serviceImpl("service.impl")//Service Impl 包名,默认值:service.impl
                        .mapper("mapper")//Mapper 包名,默认值:mapper
                        .xml("mapper.xml")//Mapper XML 包名,默认值:mapper.xml
                        .controller("controller")//Controller 包名,默认值:controller
                        //.other("other")//自定义文件包名,	输出自定义文件时所用到的包名
                        .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "src/main/resources/mapper")) //路径配置信息,Collections.singletonMap(OutputFile.mapperXml, "D://")
                        .build()//加入构建队列
                )

                //模板配置
                .templateConfig((scanner, builder) -> builder
                        //.disable()//禁用所有模板
                        //.entityKt("/templates/entity.java")// 设置实体模板路径(kotlin),/templates/entity.java
                        .disable(TemplateType.ENTITY)//禁用模板 TemplateType.ENTITY
                        .entity("/templates/entity.java") //设置实体模板路径(JAVA),/templates/entity.java
                        .service("/templates/service.java")//设置 service 模板路径,/templates/service.java
                        .serviceImpl("/templates/serviceImpl.java")//设置 serviceImpl 模板路径,/templates/serviceImpl.java
                        .mapper("/templates/mapper.java")//设置 mapper 模板路径,/templates/mapper.java
                        .mapperXml("/templates/mapper.xml")//设置 mapperXml 模板路径,/templates/mapper.xml
                        .controller("/templates/controller.java")//设置 controller 模板路径,/templates/controller.java
                        .build()//加入构建队列
                )

                //注入配置————自定义模板
                .injectionConfig(builder -> builder
                        .beforeOutputFile((tableInfo, objectMap) -> {
                            System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
                        }) //输出文件之前消费者
                        .customMap(Collections.singletonMap("my_field", "你好!这是我自己注入的属性哦")) //自定义配置 Map 对象
                        //.customFile(Collections.singletonMap("test.txt", "/templates/test.vm")) //自定义配置模板文件
                        .build()//加入构建队列
                )

                // 策略配置
                /**
                 * schema:在数据库中表示的是数据库对象集合,它包含了各种对像,比如:表,视图,存储过程,索引等等。
                 * 一般情况下一个用户对应一个集合,所以为了区分不同的集合就需要给不同的集合起名字。
                 * 用户的schema名就相当于用户名,并作为该用户缺省schema。所以说schema集合看上去像用户名。
                 * 例如当我们访问一个数据表时,如果该表没有指明属于哪个schema,系统就会自动的加上缺省的schema。
                 */
                .strategyConfig(builder -> builder
                        /** 基本参数配置 */
                        .enableCapitalMode()//开启大写命名,默认值:false
                        .enableSkipView()//开启跳过视图,默认值:false
                        .disableSqlFilter()//禁用 sql 过滤,默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关
                        .likeTable(new LikeTable("t_user_login"))//模糊表匹配(sql 过滤)	likeTable 与 notLikeTable 只能配置一项
                        /** 设置需要生成的表名 */
                        .addInclude("t_user_login")// 增加表匹配(内存过滤),include 与 exclude 只能配置一项
                        /** 前缀配置*/
                        .addTablePrefix("t_")//增加过滤表前缀
                        //.addFieldSuffix("_")//增加过滤表后缀
                        //.addFieldPrefix("ul_")//增加过滤字段前缀  本人不建议使用,去掉后缀,会导致驼峰命名实体类的变量名不带前缀,去掉后,错误:Username,正确:ulUsername
                        //.addFieldSuffix("_")//增加过滤字段后缀

                        /** 实体策略配置 */
                        .entityBuilder()//实体策略配置
                        .disableSerialVersionUID()//禁用生成 serialVersionUID,默认值:true
                        .enableLombok()//开启 lombok 模型,默认值:false
                        .enableChainModel()//开启链式模型,默认值:false
                        .enableRemoveIsPrefix()//开启 Boolean 类型字段移除 is 前缀,默认值:false
                        .enableTableFieldAnnotation()//开启生成实体时生成字段注解,默认值:false
                        .enableActiveRecord()//开启 ActiveRecord 模型,默认值:false
                        .naming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略,默认下划线转驼峰命名:NamingStrategy.underline_to_camel
                        .columnNaming(NamingStrategy.underline_to_camel)//数据库表字段映射到实体属性的命名策略,默认为 null,未指定按照 naming 执行
                        .idType(IdType.AUTO)//全局主键类型
                        .formatFileName("%sBean")//格式化文件名称,生成实体的后缀,建议这样使用,生成后:UserLoginBean
                        //.superClass(BaseEntity.class)//设置父类
                        //.enableColumnConstant()//开启生成字段常量,默认值:false
                        //.addIgnoreColumns("age")//添加忽略字段
                        //.nameConvert(INameConvert)//名称转换实现
                        //.versionColumnName("version")//乐观锁字段名(数据库)
                        //.versionPropertyName("version")//乐观锁属性名(实体)
                        //.logicDeleteColumnName("deleted")//逻辑删除字段名(数据库)
                        //.logicDeletePropertyName("deleteFlag")//逻辑删除属性名(实体)
                        //.enableSchema()//启用 schema,默认值:false,多 schema 场景的时候打开
                        //.addExclude("t_simple")//增加表排除匹配(内存过滤),include 与 exclude 只能配置一项
                        //.notLikeTable(new LikeTable("USER"))//模糊表排除(sql 过滤)	likeTable 与 notLikeTable 只能配置一项

                        /** controller 策略配置 */
                        .controllerBuilder()//controller 策略配置
                        .enableHyphenStyle()//开启驼峰转连字符,默认值:false
                        .enableRestStyle()//开启生成@RestController 控制器,默认值:false
                        .formatFileName("%sController")//格式化文件名称——controller包下自动生成的类后缀,例如UserLoginController

                        /** Service 策略配置 */
                        .serviceBuilder()//service 策略配置
                        .formatServiceFileName("%sService")//转换 service 接口文件名称,例如:UserLoginService
                        .formatServiceImplFileName("%sServiceImpl")//转换 service 实现类文件名称,例如:UserLoginServiceImpl

                        /** mapper 策略配置 */
                        .mapperBuilder()//mapper 策略配置
                        .superClass(BaseMapper.class)//设置父类,BaseMapper是com.baomidou.mybatisplus.core.mapper中的
                        .enableMapperAnnotation()//开启 @Mapper 注解,默认值:false
                        .enableBaseResultMap()//启用 BaseResultMap 生成,默认值:false
                        .enableBaseColumnList()//启用 BaseColumnList,默认值:false
                        .formatMapperFileName("%sMapper")//转换 mapper 接口文件名称后缀,mapper目录下的,例如:UserLoginMapper(有@Mapper)
                        .formatXmlFileName("%sMapper")//转换 xml 文件名称后缀,例如:UserLoginMapper.xml,Mybatis的xml映射文件
                        .build()//加入构建队列
                )

                /**
                 * 模板引擎
                 */
                //Velocity
                //.templateEngine(new VelocityTemplateEngine())
                //Beetl
                //.templateEngine(new BeetlTemplateEngine())
                //Freemarker
                .templateEngine(new FreemarkerTemplateEngine())
                /**
                 * 开始自动生成代码,执行队列构建操作
                 */
                .execute();
    }
}

9.总结

仅自己学习记录,如有错误,敬请谅解~,谢谢~~~

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电竞丶小松哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值