mybatis代码生成器:Mybatis逆向工程,TK通用mapper,Mybatis Plus代码生成器
- 前言:
- 1.Mybatis逆向工程
- 1.1 导入依赖
- 1.2 配置文件
- 1.2.1 配置文件目录
- 1.2.2 mybatis-generator.xml文件
- 1.2.2 generator.properties文件
- 1.2.3 application.yml文件
- 1.2.3 Application启动类
- 1.3 功能示范
- 1.3.1 双击maven插件生成代码及最终效果
- 1.3.2 代码测试
- 1.4 注意事项及扩展功能
- 1.4.1 插件报错Cannot instantiate object of type com.itfsw.mybatis.generator.plugins.xxx
- 1.4.2 关于数据库text字段,只能插入无法查询的问题
- 1.4.2.1 bug重现
- 1.4.2.1.1 数据库表中对应的text字段
- 1.4.2.1.2 查询结果,content字段为null
- 1.4.2.1.3 插入,能保留结果
- 1.4.2.1.4 原因分析:代码生成xml对应的类型有问题,查询无法匹配
- 1.4.2.1.5 解决方案:插件生成代码时,修改为varchar类型。生成完毕后,再改回text类型即可
- 1.5 功能点评
- 2.TK通用mapper
- 1.1 导入依赖
- 1.2 配置文件
- 1.2.1 generatorConfig.xml配置文件
- 1.2.2 config.properties配置文件
- 1.2.3 application.yml配置文件
- 1.3 功能示范
- 1.3.1 双击maven插件生成代码
- 1.3.2 最终效果
- 1.3.3 代码测试
- 1.4 注意事项及扩展功能
- 1.4.1 MySql连接驱动选择 及错误提示(Cannot obtain primary key information from the database, generated objects may be incomplete)
- 1.4.2 配合lombok插件构造者模式
- 1.4.3 application.xml映射xml文件,扫描实体类和开始驼峰命名
- 1.5 功能点评
- 3.Mybatis Plus 代码生成器
- 1.1 导入依赖
- 1.2 插件配置
- 1.2.1 代码生成器CodeGenerator配置类
- 1.2.2 application.yml配置文件
- 1.2.3 SpringBoot启动类
- 1.3 功能示范
- 1.3.1 代码生成 CodeGenerator类直接main启动即可
- 1.3.2 功能测试
- 1.4 注意事项及扩展功能
- 1.4.1 生成器细节
- 1.4.1.1 目录结构
- 1.4.1.2 数据库连接及对应表代码生成
- 1.4.2 lombok构造者模式
- 1.4.3 错误Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'create_time' from result set. Cause: java.sql.SQLFeatureNotSupportedException
- 1.4.3.1原因
- 1.4.3.2 解决方法
- 1.4.3.3 详情参考
- 1.5 功能点评
- 1.5.1 点评
- 1.5.2 学习推荐
前言:
注意:
1:本文章采用druid连接池,方便企业中实际项目开发(能更快速的使用CV大法)
2:原生Mybaits,TK通用mapper采用maven插件生成代码,优点是即使程序报错,也不影响代码生成。缺点是对eclipse不友好(不会eclipse工具,IDEA真香)
1.Mybatis逆向工程
1.1 导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web启动 -->
<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>
</dependency>
<!-- 数据库相关的 -->
<!--mybatis启动-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- 分页助手启动器 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!--mysql启动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc的启动器,默认使用HikariCP连接池-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.14</version>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<!-- mybatis-generator 自动代码插件 -->
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!-- 配置文件 -->
<configurationFile>${basedir}/src/main/resources/generate/mybatis-generator.xml</configurationFile>
<!-- 允许移动和修改 -->
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<!-- jdbc 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- 插件版本应和上面导入的jar包版本一致:8.0.16 -->
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>com.itfsw</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.3.8</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
1.2 配置文件
1.2.1 配置文件目录
1.2.2 mybatis-generator.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<properties resource="generate/generator.properties"/>
<!--targetRuntime="MyBatis3" 目标环境
MyBatis3:豪华版,复杂多条件查询
MyBatis3Simple:helloWorld -->
<context id="MysqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFileEncoding" value="UTF-8"/>
<!-- Lombok插件 -->
<plugin type="com.itfsw.mybatis.generator.plugins.LombokPlugin">
<!-- @Data 默认开启,同时插件会对子类自动附加@EqualsAndHashCode(callSuper = true),@ToString(callSuper = true) -->
<property name="@Data" value="true"/>
<!-- @Builder 必须在 Lombok 版本 >= 1.18.2 的情况下开启,对存在继承关系的类自动替换成@SuperBuilder -->
<property name="@Builder" value="true"/>
<!-- @NoArgsConstructor 和 @AllArgsConstructor 使用规则和Lombok一致 -->
<property name="@AllArgsConstructor" value="true"/>
<property name="@NoArgsConstructor" value="true"/>
<!-- @Getter、@Setter、@Accessors 等使用规则参见官方文档 -->
<property name="@Accessors(chain = true)" value="true"/>
<!-- 临时解决IDEA工具对@SuperBuilder的不支持问题,开启后(默认未开启)插件在遇到@SuperBuilder注解时会调用ModelBuilderPlugin来生成相应的builder代码 -->
<property name="supportSuperBuilderForIdea" value="false"/>
</plugin>
<!-- 查询单条数据插件 -->
<plugin type="com.itfsw.mybatis.generator.plugins.SelectOneByExamplePlugin"/>
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.user}"
password="${jdbc.password}">
<!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
<property name="nullCatalogMeansCurrent" value="true"/>
<property name="useInformationSchema" value="true"/>
</jdbcConnection>
<!--oracle配置-->
<!--
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:test"
userId="root"
password="root">
</jdbcConnection>
-->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
和 NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="true"/>
</javaTypeResolver>
<!-- 对于生成的entity所在包 -->
<javaModelGenerator targetPackage="com.example.generate.entity" targetProject="src\main\java"/>
<!-- 对于生成的mapper所在目录 -->
<sqlMapGenerator targetPackage="com.example.generate.mapper" targetProject="src\main\resources"/>
<!-- 配置mapper对应的java映射 -->
<javaClientGenerator targetPackage="com.example.generate.mapper" targetProject="src\main\java"
type="XMLMAPPER"/>
<!--生成全部表tableName设为%-->
<table tableName="${tableName}">
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table>
</context>
</generatorConfiguration>
1.2.2 generator.properties文件
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.cj.jdbc.Driver
#哪一张表 生成全部表tableName设为%
tableName=sys_role
1.2.3 application.yml文件
server:
port: 8089
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效 Oracle: select 1 from dual MySql: select 1
validationQuery: SELECT 1
# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
testWhileIdle: true
# 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnBorrow: false
# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: admin
login-password: admin
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
logging:
level:
root: info
com.example: debug
1.2.3 Application启动类
@SpringBootApplication
//mapper目录
@MapperScan("com.example.generate.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
1.3 功能示范
1.3.1 双击maven插件生成代码及最终效果
1.3.2 代码测试
1.4 注意事项及扩展功能
1.4.1 插件报错Cannot instantiate object of type com.itfsw.mybatis.generator.plugins.xxx
解决:插入mybatis-generator-plugin即可
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<!-- mybatis-generator 自动代码插件 -->
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!-- 配置文件 -->
<configurationFile>${basedir}/src/main/resources/generate/mybatis-generator.xml</configurationFile>
<!-- 允许移动和修改 -->
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<!-- jdbc 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- 插件版本应和上面导入的jar包版本一致:8.0.16 -->
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>com.itfsw</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.3.8</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
1.4.2 关于数据库text字段,只能插入无法查询的问题
1.4.2.1 bug重现
1.4.2.1.1 数据库表中对应的text字段
1.4.2.1.2 查询结果,content字段为null
1.4.2.1.3 插入,能保留结果
1.4.2.1.4 原因分析:代码生成xml对应的类型有问题,查询无法匹配
1.4.2.1.5 解决方案:插件生成代码时,修改为varchar类型。生成完毕后,再改回text类型即可
测试结果:显示正确
1.5 功能点评
以下观点带有强烈个人使用情感
优点:
1:最早接触的代码生成器,打开了新世界的大门
2:相比手写实体类,mapper,和xml。这代码生成器的确简化了很多代码
不足:
1:代码生成器会把整个表格生成,不能去表明前缀。如SysRole不能自动生成Role
2:生成代码没有作者注释
3:生成代码没有整合swagger注解(这个我不会)
4:缺少service层代码
5:查询不能和构造者模式完美结合
6:对应text字段,查询会为null无法得出正确结果
7:开发时,数据表字段经常变更的情况,每次都要重新生成代码。操作极不友好。
插件参考地址:https://github.com/itfsw/mybatis-generator-plugin
2.TK通用mapper
1.1 导入依赖
完成依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web启动 -->
<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>
</dependency>
<!-- 数据库相关的 -->
<!-- tk通用mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
<!-- 分页助手启动器 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!--mysql启动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc的启动器,默认使用HikariCP连接池-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.14</version>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>
${basedir}/src/main/resources/generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- 驱动版本选择,和上面的一致 -->
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
1.2 配置文件
1.2.1 generatorConfig.xml配置文件
generatorConfig.xml文件
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 配置文件属性 -->
<properties resource="generator/config.properties"/>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="caseSensitive" value="true"/>
<property name="lombok" value="Getter,Setter,ToString"/>
</plugin>
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.user}"
password="${jdbc.password}">
</jdbcConnection>
<!-- 实体类 -->
<javaModelGenerator targetPackage="com.example.entity"
targetProject="src/main/java"/>
<!-- mapper.xml文件 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources"/>
<!-- mapper接口 -->
<javaClientGenerator targetPackage="com.example.mapper"
targetProject="src/main/java"
type="XMLMAPPER"/>
<!-- 数据库哪一张表 -->
<table tableName="${tableName}">
<!-- 会自动扫描表中的主键已经 字段名为id的字段。
注意:如果id不存在,不需要理。会自动扫码表中id
如果id存在,且不是主键。会出现主键查询失败!
-->
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>
1.2.2 config.properties配置文件
config.properties配置文件
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.cj.jdbc.Driver
#生成哪一张表
tableName=sys_role
1.2.3 application.yml配置文件
server:
port: 8090
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效 Oracle: select 1 from dual MySql: select 1
validationQuery: SELECT 1
# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
testWhileIdle: true
# 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnBorrow: false
# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: admin
login-password: admin
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
logging:
level:
root: info
com.example: debug
1.3 功能示范
1.3.1 双击maven插件生成代码
1.3.2 最终效果
1.3.3 代码测试
1.启动类:@MapperScan注解需要用tk包下的
2: 测试结果
1.4 注意事项及扩展功能
1.4.1 MySql连接驱动选择 及错误提示(Cannot obtain primary key information from the database, generated objects may be incomplete)
1.插件的驱动选择应和导入Jar依赖一致
2: MySql驱动8.x版本的问题 (官方开发文档案例是5.1.29)
2.1 问题:代码生成实体类缺少主键映射,生成提示(Cannot obtain primary key information from the database, generated objects may be incomplete)
2.2 解决方案 jdbc.url加上nullCatalogMeansCurrent=true属性即可
config.properties下的完整jdbc.url
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
1.4.2 配合lombok插件构造者模式
1:实体类注解
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "sys_role")
public class SysRole {
。。。
}
2:案例Demo
1.4.3 application.xml映射xml文件,扫描实体类和开始驼峰命名
1:application.xml 添加以下配置
mybatis:
#实体类扫描
type-aliases-package: com.example.entity
# xml配置文件
mapper-locations: classpath:mapper/*.xml
# 开始驼峰命名
configuration:
map-underscore-to-camel-case: true
2:编写测试方法
2.1 编写自定义sql
2.2 测试结果
2.3 application.xml映射xml文件优点
当数据库表格新增字段或删除字段时候,只需要修改实体类即可,不需要对应的xml修改resultMap属性
以下配置不需要修改,直接删除即可
<resultMap id="BaseResultMap" type="com.example.entity.SysRole">
<!--
WARNING - @mbg.generated
-->
<id column="role_id" jdbcType="INTEGER" property="roleId" />
<result column="role_name" jdbcType="VARCHAR" property="roleName" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="delete_status" jdbcType="VARCHAR" property="deleteStatus" />
</resultMap>
1.5 功能点评
以下观点带有强烈个人使用情感
优点:
1: tk通用mapper配置lombok插件构造者模式,极大方便代码持久层操作
2: 通过配置application.xml映射xml文件,数据库表格字段新增或删除时,只需要修改实体类即可。方便数据库表格字段经常变更(设计表格阶段)
不足:
1:代码生成器会把整个表格生成,不能去表明前缀。如SysRole不能自动生成Role
2:生成代码没有作者注释
3:生成代码没有整合swagger注解
4:缺少service层代码
3.Mybatis Plus 代码生成器
1.1 导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web启动 -->
<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>
</dependency>
<!-- mybatis-plus启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<!-- 最新版本 -->
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<!-- swagger接口 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2 插件配置
1.2.1 代码生成器CodeGenerator配置类
package com.example;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
* @Description: 演示例子
* @Author: wenzizheng
* @Create: 2020-09-16 21:17
* @Version: 1.0
**/
public class CodeGenerator {
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
//todo 路径
// gc.setOutputDir(projectPath + "/src/main/java");
gc.setOutputDir(projectPath + "/mybatis-plus/src/main/java");
//todo 作者
gc.setAuthor("wenzizheng");
//是否支持AR模式
gc.setActiveRecord(true);
//生成后是否打开
gc.setOpen(false);
//todo 实体属性 Swagger2 注解
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.example.mybatis.plus");
pc.setEntity("entity");
pc.setService("service");
pc.setController("controller");
pc.setMapper("mapper");
// 关闭xml生成
TemplateConfig tc = new TemplateConfig();
tc.setXml(null);
mpg.setTemplate(tc);
mpg.setPackageInfo(pc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//是否使用lombok插件
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
//todo 表名,多个以,逗号分隔
strategy.setInclude("sys_role".split(","));
strategy.setControllerMappingHyphenStyle(true);
//todo 去除前缀
strategy.setTablePrefix("sys_");
mpg.setStrategy(strategy);
mpg.execute();
}
}
1.2.2 application.yml配置文件
server:
port: 8091
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效 Oracle: select 1 from dual MySql: select 1
validationQuery: SELECT 1
# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
testWhileIdle: true
# 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnBorrow: false
# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: admin
login-password: admin
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
logging:
level:
root: info
com.example: debug
1.2.3 SpringBoot启动类
@SpringBootApplication
@MapperScan("com.example.mybatis.plus.mapper")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class);
}
}
1.3 功能示范
1.3.1 代码生成 CodeGenerator类直接main启动即可
1.3.2 功能测试
1:实体类AR模式
/**
* 实体类AR模式
*/
@Test
public void selectByAR() {
Role role = new Role();
List<Role> roleList = role.selectAll();
roleList.forEach(System.out::println);
}
2:mapper测试
@Autowired
private RoleMapper roleMapper;
/**
* mapper层测试
*/
@Test
public void selectByMapper() {
List<Role> roleList = this.roleMapper.selectList(null);
roleList.forEach(System.out::println);
}
3:service测试
@Autowired
private IRoleService roleService;
/**
* service层测试
*/
@Test
public void selectByService() {
List<Role> roleList = this.roleService.list();
roleList.forEach(System.out::println);
}
1.4 注意事项及扩展功能
1.4.1 生成器细节
1.4.1.1 目录结构
//todo 路径
// 非聚合工程,直接这条即可
// gc.setOutputDir(projectPath + "/src/main/java");
// 本项目为聚合工程,子模块需要加对应目录mybatis-plus
gc.setOutputDir(projectPath + "/mybatis-plus/src/main/java");
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.example.mybatis.plus");
pc.setEntity("entity");
pc.setService("service");
pc.setController("controller");
pc.setMapper("mapper");
1.4.1.2 数据库连接及对应表代码生成
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
mpg.setDataSource(dsc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//是否使用lombok插件
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
//todo 表名,多个以,逗号分隔
strategy.setInclude("sys_role".split(","));
strategy.setControllerMappingHyphenStyle(true);
//todo 去除前缀
strategy.setTablePrefix("sys_");
1.4.2 lombok构造者模式
1:在实体类上加上 @Builder @NoArgsConstructor @AllArgsConstructor注解即可
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@TableName("sys_role")
@ApiModel(value="Role对象", description="后台角色表")
public class Role extends Model<Role> {
。。。
}
2:测试Demo
1.4.3 错误Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column ‘create_time’ from result set. Cause: java.sql.SQLFeatureNotSupportedException
1.4.3.1原因
代码生成器生成实体类时间为Java8的LocalDateTime,低版本duird连接不支持Java8的时间LocalDateTime
1.4.3.2 解决方法
把druid连接池升级到1.1.21版本以上即可