开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情
前面系列文章,我们发现 tkmybatis在转化PO的时候,出现错误
- is_del tinyint(1)转化为->Boolean
- is_del2 tinyint 转化为->Byte
我们其实要的就是 tinyint 转化为Integer 就这么简单, 本文我们介绍通用的解决办法,一劳永逸解决 PO类型转换错误
1.JavaTypeResolver原理
通用解决办法 配置 javaTypeResolver
在配置文件中有一个 <javaTypeResolver> 标签可以用来配置映射关系,字段与Java的映射关系在构造方法中配置。
新建类继承 JavaTypeResolverDefaultImpl ,在子类构造方法中重新对 typeMap 赋值,利用 HashMap<> key相同value替换的性质替换默认的实现方式
在配置文件中有一个 <javaTypeResolver> 标签可以用来配置映射关系,字段与Java的映射关系在构造方法中配置。
Generator 插件运行的时候有自己的 classpath, 所以 你在自己的项目中要重写javaTypeResolver , 你会发现 找不到该类, 故会报类无法加载的错误。
1.1 配置common-client公共组件信息
找不到该类, 故会报类无法加载的错误, 解决方法就是将该类文件打包,然后添加到插件的依赖中。新建一个公共的工具类项目, install到本地仓库,然后在 tdmybatis项目中引入
新建项目 common-client 就是为了给 tdmybatis项目 引用的,就是为了 引入 自定义 javaTypeResolver 类
<groupId>com.jzj</groupId>
<artifactId>common-client</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
新建 com.jzj.config 文件夹
文件夹下 新建 TinyIntJavaTypeResolver 自定义 字段映射类
package com.jzj.config;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl;
import java.sql.Types;
public class TinyIntJavaTypeResolver extends JavaTypeResolverDefaultImpl {
public TinyIntJavaTypeResolver() {
super();
typeMap.put(Types.TINYINT, new JavaTypeResolverDefaultImpl.JdbcTypeInformation("TINYINT", //$NON-NLS-1$
new FullyQualifiedJavaType(Integer.class.getName())));
}
}
pom文件如下, 之引入了 mybatis-generator-core 文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.jzj</groupId>
<artifactId>common-client</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--tk mybatis-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
</project>
1.2 common-client项目打包
运行 install, 把common-client安装到本地仓库,或者上传到公司私服服务器 构建成功, common-client jar包已经安装完毕
2.tdmybatis配置
2.1 db.propertis 配置 tinyInt1isBit=false
首先 要在db.propertis 配置 tinyInt1isBit=false, 使tinyint全都转化为 byte,不走默认规则
mybatis.url=jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&tinyInt1isBit=false
2.2 然后修改 pom文件 引入 commom-client
!!! 注意 是 generator的配置下 引入 commom-client包 !!! 注意 是 generator的配置下 引入 commom-client包 !!! 注意 是 generator的配置下 引入 commom-client包
而不是 tdmybatis的 项目中引入 common-client这点一定要区分开
整个Pom文件 如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.jzj</groupId>
<artifactId>tdmybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>tdmybatis</name>
<description>test mybatis demo for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<mybatis-spring-boot-starter.version>1.3.2</mybatis-spring-boot-starter.version>
<tkmybatis.version>2.1.5</tkmybatis.version>
<druid.version>1.2.6</druid.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot-starter.version}</version>
</dependency>
<!--tk mybatis-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${tkmybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</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>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-generator</artifactId>
<version>1.0.5</version>
</dependency>
<!--重点这里,将类所在的模块,引入进来-->
<!--重点这里,因为我的类TinyIntJavaTypeResolver写在另一个jar包中,所以我要添加 jar的依赖-->
<!--重点这里,引入 jar包-->
<dependency>
<groupId>com.jzj</groupId>
<artifactId>common-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-filtering</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
2.3 配置generatorConfig.xml文件
XML 中指定 javaTypeResolver 把 tinyint 类型 转化为 Integer
<!-- 指定 tinyint 类型 转化为 Integer -->
<javaTypeResolver type="com.jzj.config.TinyIntJavaTypeResolver">
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
table中指定列的逻辑可以删掉了, 只需要id信息
<table tableName="user_info" domainObjectName="UserInfoPO"
mapperName="UserInfoMapper">
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
2.4 基本类型的Long类型对应mysql的什么
基本类型的Long类型对应mysql 类型中的 BigInt,我们可以看addtime及modtime时间戳,mysql设置的就是bigInt类型
我们试下 generator转化成PO文件后, bigInt是不是转化为Long类型
3. 运行generator
运行 generator,构建成功
看下 PO类是否正常
- is_del tinyint(1)转化为->Integer
- is_del2 tinyint 转化为->Integer
全都正确
Addtime,modtime 字段也是Long类型了,成功转化
至此 我们已经可以 正确使用generator插件了