使用mybatis-generator自动生成代码的方法介绍及踩坑

mybatis-geneator是一款mybatis自动代码生成工具,可以通过配置,快速生成mapper和xml文件。

一. 使用maven插件

在pom.xml中添加mybatis-generator的plugin:

 			<plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <configuration>
                    <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.5</version>
                    </dependency>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.13</version>
                    </dependency>
                </dependencies>
            </plugin>

mybatis-generator-config.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>

    <!-- targetRuntime:设置生成的文件适用于哪个 mybatis 版本 -->
    <context id="context" targetRuntime="MyBatis3">
        <!--optional 可选,指在创建class时,对注释进行控制-->
        <commentGenerator>
            <!--阻止生成的注释包含时间戳,默认为false-->
            <property name="suppressDate" value="true"/>
            <!-- 阻止所有自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
            <!--一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,在使用版本控制的时候每次都会提交,因而一般情况下我们都会屏蔽注释信息-->
        </commentGenerator>

        <!--jdbc的数据库连接 test_db 为数据库名字-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/test_db?useUnicode=true&amp;characeterEncoding=utf-8&amp;serverTimezone=UTC" userId="root"
                        password="123456"></jdbcConnection>

        <!--optional 可选,类型处理器,控制数据库类型和java类型之间的转换-->
        <javaTypeResolver>
            <!-- 控制是否强制DECIMAL和NUMERIC类型的字段转换为Java类型的java.math.BigDecimal,默认值为false -->
            <!--默认情况下的转换规则为:
                    如果精度>0或者长度>18,就会使用java.math.BigDecimal
                    如果精度=0并且10<=长度<=18,就会使用java.lang.Long
                    如果精度=0并且5<=长度<=9,就会使用java.lang.Integer
                    如果精度=0并且长度<5,就会使用java.lang.Short-->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <javaModelGenerator targetPackage="com.chenpp.mybatis.entity"
                            targetProject="src/main/java">
            <!-- 是否允许子包 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 该属性只对MyBatis3有效,如果true就会使用构造方法入参,如果false就会使用setter方式。默认为false -->
            <property name="constructorBased" value="false"/>
            <!-- 是否清理从数据库中查询出的字符串左右两边的空白字符 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立modal对象是否不可改变 即生成的modal对象不会有setter方法,只有构造方法 -->
            <property name="immutable" value="true"/>
        </javaModelGenerator>

        <!--*Mapper.xml文件的位置-->
        <sqlMapGenerator targetPackage="com.chenpp.mybatis.mapper"
                         targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!--Mapper接口文件位置-->
        <javaClientGenerator targetPackage="com.chenpp.mybatis.mapper"
                             targetProject="src/main/java" type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!--tableName是数据库中的表名,domainObjectName是生成的JAVA实体类名-->
        <table tableName="t_teacher"
               enableCountByExample="false" domainObjectName="Teacher">
        </table>
    </context>
</generatorConfiguration>

执行mvn mybatis-generator:generate 命令就可以生成对应的mybatis文件了
在这里插入图片描述

问题1 :

No plugin found for prefix ‘mybatis-generator’ in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [lo
cal (D:\java\mavenRepository), central (https://repo.maven.apache.org/maven2)] -> [Help 1]

因为执行mvn mybatis-generator:generate的目录不对,我的mybatis-generator插件是在某个module下引入的,但是执行的时候是在根目录下执行上述命令,切换到对应module的目录就可以了

问题2 :

Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project mybatis-generator: Execution default-cli of goal org.mybatis
.generator:mybatis-generator-maven-plugin:1.3.2:generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver -> [Help 1]

pom.xml里明明引入了mysql-connector-java的jar包,但是在执行的时候还是出现上述报错,因为是插件mybatis-generator在执行的时候需要用到jdbc驱动包,所以需要将依赖包放入到plugin标签里,如下:

				 <plugin>
                    <!--Mybatis-generator插件,用于自动生成Mapper和POJO-->
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.5</version>
                    <configuration>
                        <!--配置文件的位置-->
                        <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
                        <verbose>true</verbose>
                        <overwrite>true</overwrite>
                    </configuration>
                    <executions>
                        <execution>
                            <id>Generate MyBatis Artifacts</id>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>org.mybatis.generator</groupId>
                            <artifactId>mybatis-generator-core</artifactId>
                            <version>1.3.5</version>
                            <scope>system</scope>
                            <systemPath>${project.basedir}/src/main/java/com/ctrip/ibu/itinerary/offline/repository/lib/mybatis-generator.jar</systemPath>
                        </dependency>
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <version>5.1.47</version>
                        </dependency>
                    </dependencies>
                </plugin>
               

问题3:

Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project mybatis-generator: Unknown system variable 'query_cache_size
’ -> [Help 1]

mysql-connecter-java的版本过低,很显然是数据库驱动程序与数据库版本不对应
查看了一下配置,发现mysql-connector-java的版本是5.1.47,而我本地mysql版本是8.0.13,将数据库驱动的版本改为8.0.13就可以了

二. 使用jar包和api

pom.xml

	    <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>

mybatis-generator配置文件:

<?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>

    <!-- targetRuntime:设置生成的文件适用于哪个 mybatis 版本 -->
    <context id="context" targetRuntime="MyBatis3">
        <!--optional 可选,指在创建class时,对注释进行控制-->
        <commentGenerator>
            <!--阻止生成的注释包含时间戳,默认为false-->
            <property name="suppressDate" value="true"/>
            <!-- 阻止所有自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--jdbc的数据库连接 test_db 为数据库名字-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/test_db?useUnicode=true&amp;characeterEncoding=utf-8&amp;serverTimezone=UTC" userId="root"
                        password="123456"></jdbcConnection>

        <!--optional 可选,类型处理器,控制数据库类型和java类型之间的转换-->
        <javaTypeResolver>
            <!-- 控制是否强制DECIMAL和NUMERIC类型的字段转换为Java类型的java.math.BigDecimal,默认值为false -->        
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <javaModelGenerator targetPackage="com.chenpp.mybatis.entity"
                            targetProject="mybatis-generator/src/main/java">
            <!-- 是否允许子包 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 该属性只对MyBatis3有效,如果true就会使用构造方法入参,如果false就会使用setter方式。默认为false -->
            <property name="constructorBased" value="false"/>
            <!-- 是否清理从数据库中查询出的字符串左右两边的空白字符 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立modal对象是否不可改变 即生成的modal对象不会有setter方法,只有构造方法 -->
            <property name="immutable" value="true"/>
        </javaModelGenerator>

        <!--*Mapper.xml文件的位置-->
        <sqlMapGenerator targetPackage="com.chenpp.mybatis.mapper"
                         targetProject="mybatis-generator/src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!--Mapper接口文件位置-->
        <javaClientGenerator targetPackage="com.chenpp.mybatis.mapper"
                             targetProject="mybatis-generator/src/main/java" type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!--tableName是数据库中的表名,domainObjectName是生成的JAVA实体类名-->
        <table tableName="t_teacher"
               enableCountByExample="false" domainObjectName="Teacher">
        </table>
    </context>
</generatorConfiguration>

执行如下代码:

  public static void main(String[] args) throws Exception{
        List<String> warnings = new ArrayList<String>();
        //生成的代码重复时,覆盖原代码
        boolean overwrite = true;
        //读取配置文件
        InputStream is = Surrogate.Generator.class.getResourceAsStream("/mybatis-generator-config.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();

        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        //创建代码生成器
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback,warnings);
        //执行生成代码
        myBatisGenerator.generate(null);
        //输出警告信息
        for(String warning : warnings) System.out.println(warning);
    }

问题1:

The specified target project directory src/main/java does not exist

猜测可能是由于我是在module里执行的代码,需要再加上对应的module,如上面的配置文件一样,确实加上之后就成功生成了mybatis相关文件

其他还有通过java -jar命令行等方式,都差不多,就不一一赘述了。

问题2:

修改数据库后再次执行mvn mybatis-generator:generate,对应的mapper.xml文件仍旧缺少新字段

重新检查代码后发现在使用Generator的时候,生成新的mapper.xml时并不是直接覆盖原文件,而是在同样的目录下生成了一个新文件,导致运行时使用的还是旧文件,出现问题

解决办法:

  1. MyBatis Generator 在1.3.7版本提供了解决方案,可升级为1.3.7版本
  2. 删除旧mapper.xml,重新生成mapper文件

参考资料:
MyBatis Generator 详解
Running MyBatis Generator

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值