Mybatis Generator自动生成代码及可能出现的问题

如何使用Mybatis Generator

配置插件

在 pom.xml 文件中增加 mybatis-generator-maven-plugin 插件
configurationFile:配置文件路径

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.5</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>${mysql.version}</version>
                </dependency>
                <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper</artifactId>
                    <version>3.4.4</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

配置文件

在 src/main/resources/generator/ 目录下创建 generatorConfig.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="jdbc.properties"/>

    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 配置 tk.mybatis 插件 -->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="com.funtl.utils.MyMapper"/>
        </plugin>

        <!-- 配置数据库连接 -->
        <jdbcConnection
                driverClass="${jdbc.driverClass}"
                connectionURL="${jdbc.connectionURL}"
                userId="${jdbc.username}"
                password="${jdbc.password}">
        </jdbcConnection>

        <!-- 配置实体类存放路径 -->
        <javaModelGenerator targetPackage="com.funtl.hello.spring.boot.entity" targetProject="src/main/java"/>

        <!-- 配置 XML 存放路径 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>

        <!-- 配置 DAO 存放路径 -->
        <javaClientGenerator
                targetPackage="com.funtl.hello.spring.boot.mapper"
                targetProject="src/main/java"
                type="XMLMAPPER"/>

        <!-- 配置需要生成的表,% 代表所有 -->
        <table tableName="%">
            <!-- mysql 配置 -->
            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

配置数据源

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/springboot?useUnicode=true&serverTimezone=GMT&characterEncoding=utf-8&nullCatalogMeansCurrent=true
jdbc.username=root
jdbc.password=root

执行插件

IDEA
Mybatis Generator自动生成代码及可能出现的问题
命令行

mvn mybatis-generator:generate

常见错误

1 时区错误

java.sql.SQLException:The server time zone value ‘???ú±ê×??±??’ is unrecognized or represents more than one time zone.

数据库和系统时区存在差异,在低版本的mysql驱动中存在该问题
解决方法:
1. 在jdbc url后加上serverTimezone=GMT指定时区
2. 在mysql执行 set global time_zone='+8:00'设置时区;

<jdbcConnection 
driverClass="com.mysql.jdbc.Driver" 
connectionURL="jdbc:mysql://数据库ip/数据库名称?serverTimezone=GMT" 
userId="连接ID" 
password="密码">  
</jdbcConnection> 

2 mysql驱动错误

Loading class com.mysql.jdbc.Driver’. This is deprecated. The new driver classis com.mysql.cj.jdbc.Driver.

mysql6.0以上的驱动使用的驱动为com.mysql.cj.jdbc.Driver
JDBC连接Mysql6 需要指定时区,所以可能出现第一种错误

<jdbcConnection 
driverClass="com.mysql.cj.jdbc.Driver" 
connectionURL="jdbc:mysql://数据库ip/数据库名称?serverTimezone=GMT" 
userId="连接ID" 
password="密码">  
</jdbcConnection> 

3 自动生成的代码只有insert方法,没有select,update等方法

Cannot obtain primary key information from the database, generated objects may be incomplete

有两种原因导致这个问题。
一是没有设置主键,
二是因为mysql-connector-java版本不兼容,参考 https://blog.****.net/jpf254/article/details/79571396。

解决方案:在确定设置主键的情况下,在jdbc url后加上nullCatalogMeansCurrent=true

例如:

<jdbcConnection 
driverClass="com.mysql.jdbc.Driver" 
connectionURL="jdbc:mysql://数据库ip/数据库名称?serverTimezone=GMT&amp;nullCatalogMeansCurrent=true" 
userId="连接ID" 
password="密码">  
</jdbcConnection> 

4 error:前言中不允许有内容。

xml文件的编码问题,将配置文件generatorConfig.xml另存为ANSI编码。

PS:博文仅作为个人学习笔记,如有错误欢迎指正,转载请注明出处~
更多内容详见:笔记分类导航目录

参考文档:

  1. 数据库-----catalog与schema简介