准备系列-Mybatis(五) TKmybatis-springboot 通用办法配置javaTypeResolver解决Tinyint类型转换失败

336 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 文件夹

image.png

文件夹下 新建 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包已经安装完毕

image.png

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这点一定要区分开

image.png

整个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类型

image.png

我们试下 generator转化成PO文件后, bigInt是不是转化为Long类型

3. 运行generator

运行 generator,构建成功 image.png

看下 PO类是否正常

  • is_del tinyint(1)转化为->Integer
  • is_del2 tinyint 转化为->Integer

全都正确 image.png

Addtime,modtime 字段也是Long类型了,成功转化

image.png

至此 我们已经可以 正确使用generator插件了