mybatis-generator.xml配置文件编写与标签详解

1 MyBatis Generator简介

MyBatis Generator (MBG) 是MyBatis的代码生成器,其内部关联一张或者多张数据库表,生成可访问表的模块。减轻了开发初期数据库表映射对象生成与配置的工作。

MyBatis Generator可以生成:

  1. 生成与表结构匹配的Java POJO。
  2. MyBatis兼容的SQL Map XML文件,并配置简单的CRUD生成SQL。
  3. 可选的Java客户端类,例如符合Spring框架的DAO。
[INFO] Saving file UserDO.java
[INFO] Saving file UserDOMapper.java
[INFO] Saving file UserDOMapper.xml

迭代运行MBG时,需要注意的是:

  1. MBG会自动合并同名的XML文件,但是不会覆盖开发人员对XML的自定义修改。
  2. MBG不会合并Java文件,而是选择覆盖现有文件(此处是要特别注意的点,容易导致代码丢失)。

2 运行MyBatis Generator

2.1 MBG运行方式

运行MBG有多种方式,例如通过命令行、Ant、Maven等。本文主要介绍Maven相关配置。

MBG包含一个Maven插件,可以集成到Maven构建中。

<project ...>
 <build>
   <plugins>
    <plugin>
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-maven-plugin</artifactId>
      <version>1.3.7</version>
    </plugin>
  </plugins>
</build>
</project>

当然,事情并非如此简单。

2.2 Maven目标与执行

MBG Maven插件包含一个目标:mybatis-generator:generate,这个目标不是由Maven自动执行,可以通过以下两种方式。
方式1:通过命令行执行目标。

mvn mybatis-generator:generate

方式2:使用标准Maven命令行属性将参数传递给目标。使用该命令,将会运行MBG,覆盖已有的Java文件。

mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate

如果存在连续的环境构建,你可能想要MBG作为Maven构建的一部分自动执行。我们可以将目标配置为自动执行来实现。例如,

<plugin>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-maven-plugin</artifactId>
  <version>1.3.7</version>
  <executions>
    <execution>
      <id>Generate MyBatis Artifacts</id>
      <goals>
        <goal>generate</goal>
      </goals>
    </execution>
  </executions>
</plugin>

如上配置,MBG插件绑定到Maven构建的generate-sources阶段,因此它将在编译步骤之前执行。还要注意,MBG会生成Java源文件和XML资源,并将两者放入到构建生成的JAR包中。

2.3 MBG插件添加依赖

当前插件类路径仅包含了MBG自身,如果想要为MBG插件添加JDBC驱动,可以增加dependencies标签。

<plugin> 
  <groupId>org.mybatis.generator</groupId>  
  <artifactId>mybatis-generator-maven-plugin</artifactId>  
  <version>1.3.7</version>  
  <executions> 
    <execution> 
      <id>Generate MyBatis Artifacts</id>  
      <goals> 
        <goal>generate</goal> 
      </goals> 
    </execution> 
  </executions>  
  <dependencies> 
    <dependency> 
      <groupId>mysql</groupId>  
      <artifactId>mysql-connector-java</artifactId>  
      <version>8.0.16</version> 
    </dependency> 
  </dependencies> 
</plugin>

如果所需的依赖已经包含在项目的依赖项中,则可以使用与插件类路径相关的配置参数。
includeCompileDependencies或includeAllDependencies。

2.4 pom.XML配置参数

所有的参数是可选的,并且大多数有默认值。

  1. configurationFile
    表达式:${mybatis.generator.configurationFile}
    类型:java.io.File
    XML配置文件默认存放在${basedir}/src/main/resources/generatorConfig.xml

  2. contexts
    表达式:${mybatis.generator.contexts}
    类型:java.lang.String
    用于当前运行的context列表,以逗号分隔。列表中的任何指定id必须与context标签id属性值直接匹配。列表中指定的id在此次运行中是生效的。如果没有指定该参数,默认所有context生效。

  3. jdbcDriver
    表达式:${mybatis.generator.jdbcDriver}
    类型:java.lang.String
    如果指定sqlScript,则这是数据库要用到的标准JDBC驱动名称。

  4. jdbcPassword
    表达式:${mybatis.generator.jdbcPassword}
    类型:java.lang.String
    如果指定sqlScript,则这是数据库密码。

  5. jdbcURL
    表达式:${mybatis.generator.jdbcURL}
    类型:java.lang.String
    如果指定sqlScript,则这是连接数据库的URL。

  6. jdbcUserId
    表达式:${mybatis.generator.jdbcUserId}
    类型:java.lang.String
    如果指定sqlScript,则这是连接到数据库的用户id。

  7. ouputDirectory
    表达式:${mybatis.generator.outputDirectory}
    类型:java.io.File
    MBG生成文件的存放目录。只要将配置文件中的targetProject设置为特殊值“MAVEN”(区分大小写),就使用此目录。
    默认为${project.build.directory}/generated-sources/mybatis-generator
    注:MBG配置文件中每个Generator后缀的标签都有targetProject属性。

  8. overwrite
    表达式:${mybatis.generator.overwrite}
    类型:boolean
    如果为true,则如果发现现有Java文件的名称与生成的文件的名称相同,则现有Java文件将被覆盖。如果未指定,并且Java文件已经与生成的文件同名,则MBG会将新生成的Java文件以唯一的名称(例如MyClass.java.1,MyClass.java.2)。 重要提示:MBG将始终合并和覆盖XML文件,不会覆盖开发人员自定义的内容。
    默认值:false

  9. sqlScript
    表达式:${mybatis.generator.sqlScript}
    类型:java.lang.String
    生成代码之前要运行的SQL脚本文件的位置。如果为null,则不会运行任何脚本。如果不为null,则还必须提供jdbcDriver, jdbcURL。此外, 如果数据库需要身份验证,则可以提供jdbcUserId和jdbcPassword。
    值可以指定为文件系统中的位置,或者如果前缀为“ classpath:”,则指定为构建类路径上的位置。

  10. tableNames
    表达式:${mybatis.generator.tableNames}
    类型:java.lang.String
    如果指定,则这是在当前运行中使用的以逗号分隔的表列表。列表中指定的任何表必须与

    配置元素中指定的标准表名完全匹配。仅此列表中指定的表将在此运行中处于活动状态。如果未指定此参数,则所有表都将处于活动状态。

  11. verbose
    表达式:${mybatis.generator.verbose}
    类型:boolean
    如果为true,则MBG会将进度消息写入构建日志。

  12. includeCompileDependencies
    表达式:${mybatis.generator.includeCompileDependencies}
    类型:boolean
    如果为true,则范围为“ compile”,“ provided”和“ system”的依赖项将添加到生成器的类路径中。

  13. includeAllDependencies
    表达式:${mybatis.generator.includeAllDependencies}
    类型:boolean
    如果为true,则具有任何作用域的依赖项将添加到生成器的类路径中。

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.7</version>
    <!--mybatis-generator插件依赖-->
    <dependencies>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>Generate MyBatis Artifacts</id>
            <phase>package</phase>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <!--针对于重复生成文件的配置-->
    <configuration>
        <!-- 允许移动生成的文件 -->
        <verbose>true</verbose>
        <overwrite>true</overwrite>
    </configuration>
</plugin>

3 编写MBG配置文件

MBG是通过XML配置文件来驱动的,我们通过配置文件告诉MBG怎样连接数据库、生成什么样的对象以及怎么生成、哪些表通过MBG生成对象。

如果在POM配置了configurationFile属性,则使用指定文件名;否则文件为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="generatorConfig.properties"></properties>

    <classPathEntry location="${db.driverLocation}"/>

    <context id="MySQLTables" targetRuntime="MyBatis3" defaultModelType="flat">
        <!-- optional,旨在创建class时,对注释进行控制 -->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--MySQL数据库驱动、URL、账号、密码-->
        <jdbcConnection driverClass="${db.driverClassName}"
                        connectionURL="${db.url}"
                        userId="${db.username}"
                        password="${db.password}">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!--声明DataObject类存放位置-->
        <javaModelGenerator targetPackage="com.seckill.dataobject" targetProject="src/main/java">
            <!--是否对Model类添加构造函数,默认false-->
            <property name="constructorBased" value="true"/>
            <!--是否对CHAR类的列数据进行trim操作,默认false-->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--生成映射文件的存放位置-->
        <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources"></sqlMapGenerator>

        <!--生成Dao类存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.seckill.dao" targetProject="src/main/java">
        </javaClientGenerator>

        <!--生成表与类名映射-->
        <table tableName="seckill_user" domainObjectName="UserDO" enableCountByExample="false"
               enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false"></table>
        <table tableName="seckill_password" domainObjectName="UserPasswordDO" enableCountByExample="false"
               enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>

generatorConfig.properties

db.driverLocation=/home/ac/.m2/repository/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1:3306
db.username=root
db.password=123456

3.1 generatorConfiguration元素

MBG配置文件的根元素。文件包含以下文档声明:

<!DOCTYPE generatorConfiguration PUBLIC
  "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

子元素可以是properties(0-1)、classPathEntry(0-N)、context(1-N)。

3.2 properties元素–可选

将属性配置到外部文件中,通过properties标签引入。

<properties resource="generatorConfig.properties"></properties>

3.3 classPathEntry元素–可选

添加类路径到MBG运行的类路径中。当载入JDBC驱动,或者当载入JavaModelGenerator根类校验重写方法时,MBG从这些位置载入类。如果JDBC驱动已经在classpath下,不再需要引入该驱动jar包。

<classPathEntry location="${db.driverLocation}"/>

3.4 context 元素

指定生成一组对象的环境,例如指定数据库、生成对象和XML位置等。后面的元素都是context的子元素。

<context id="MySQLTables" targetRuntime="MyBatis3" defaultModelType="flat">
...
</context>

其中,
defaultModelType属性表示MBG如何生成实体类,flat表示为每张表只生成一个实体类。
targetRuntime用于指定生成代码的运行时环境,默认值为MyBatis3。

<property> (0个或多个)
通常与父元素一起使用。例如,

<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/> 

<plugin> (0个或多个)
<commentGenerator> (0个或1个)
用于控制注释。

<commentGenerator>
    <property name="suppressDate" value="true"/>
    <property name="suppressAllComments" value="true"/>
</commentGenerator>

<jdbcConnection> (1个)
用于指定数据库连接信息,有且只能有一个。下面4个属性中驱动和URL必选,用户名和密码可选。

<!--MySQL数据库驱动、URL、账号、密码-->
<jdbcConnection driverClass="${db.driverClassName}"
                connectionURL="${db.url}"
                userId="${db.username}"
                password="${db.password}">
</jdbcConnection>

<javaTypeResolver> (0个或1个)
用来指定JDBC类型和Java类型如何转换。

<javaTypeResolver>
    <property name="forceBigDecimals" value="false"/>
</javaTypeResolver>

forceBigDecimals是可配置属性,可以强制DECIMAL和NUMERIC类型转换为Java的BigDecimal类型,默认为false,一般不需要配置。

<javaModelGenerator> (1个)
用于控制生成的实体类。

<!--声明DataObject类存放位置-->
<javaModelGenerator targetPackage="com.seckill.dataobject" targetProject="src/main/java">
    <!--是否允许子包,默认false-->
    <property name="enableSubPackages" value="false"/>
    <!--是否对CHAR类的列数据进行trim操作,默认false-->
    <property name="trimStrings" value="true"/>
    <!--生成的Model对象是否不可变,默认false-->
    <property name="immutable" value="false"/>
    <!--是否对Model类添加构造函数,默认false-->
    <property name="constructorBased" value="true"/>
</javaModelGenerator>

还有一个属性是rootClass,用于设置所有实体类的基类。

<sqlMapGenerator> (0个或1个)

<!--生成映射文件的存放位置-->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
    <property name="enableSubPackages" value="false"/>
</sqlMapGenerator>

<javaClientGenerator> (0个或1个)

<!--生成Dao类存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.seckill.dao" targetProject="src/main/java">
    <property name="enableSubPackages" value="false"/>
</javaClientGenerator>

<table> (1个或多个)
配置表与POJO类的映射,只有配置的表才能生成实体类和其他文件。

<!--生成表与类名映射-->
<table tableName="seckill_user" domainObjectName="UserDO" enableCountByExample="false"
   enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
   selectByExampleQueryId="false"></table>

table的属性有很多,下面简单介绍其中几个。
generatedKey 属性:指定自动生成主键。
columnRenamingRule 属性:生成列前,对列重命名。
columnOverride 属性:修改数据库列的某些属性。

columnOverride column="detail" jdbcType="VARCHAR"/>

ignoreColumn属性:屏蔽不需要生成的列。

参考文档

  1. http://mybatis.org/generator/index.html
  2. https://blog.csdn.net/u014365133/article/details/78884751
发布了17 篇原创文章 · 获赞 41 · 访问量 9986

猜你喜欢

转载自blog.csdn.net/awecoder/article/details/101763736