MyBatis Generator的一些知识点释疑

Posted 秋风兮月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis Generator的一些知识点释疑相关的知识,希望对你有一定的参考价值。

我们知道MyBatis Generator是一个生成MyBatis和iBatis相关代码的代码生成器,利用这个工具可以很方便的根据数据库中表的定义和结构来生成Java POJOs、SQL Map XML文件以及Java Mapper接口或者Dao类。
为了更加灵活和具有扩展性,MyBatis Generator提供了很多的属性和扩展接口来定制。为了解释这些属性的含义和用法,MyBatis Generator工具也提供了一个官方的帮助文档USER’S GUIDE。我把这个官方的说明文档读了一遍,简单的使用没有问题,但是一些属性的含义还是看的云里雾里,有的句子单个单词的含义都明白,但是放到一块,就不知道讲的什么了。还好官方GitHub上还提供了相关的sample,结合相关的示例程序,一些属性的含义就比较清楚了。下面根据我自己的理解解释下一些属性的用法。
在说明相关属性含义之前先说一下GitHub上提供的源代码如何去编译运行。首先从GitHub上下载源代码,其中有个core的目录,进入到这个目录里,可以看到这个是个maven工程,其中的mybatis-generator-core就是MyBatis Generator的源代码,mybatis-generator-maven-plugin是针对maven的扩展插件的源代码。剩余的几个即是几个表现不同功能的示例代码。直接在core文件夹下打开命令窗口,执行mvn clean install命令,就开始将相关的这几个项目进行编译打包。
并且从输出的日志中可以看到相应的示例代码已经开始执行生成MyBatis相关的代码文件的命令,并在其文件夹下也生成了target文件夹,并且里面还包含generated-sources文件夹,这里面包含了由MyBatis Generator工具生成的代码。通过研究示例代码中提供的generatorConfig.xml中的相关属性配置再结合生成结果文件就可以很好的理解相关属性的含义。
这里再插句话,有可能你maven在执行的时候,下载jar包会非常慢,经常会卡在那里一动不动,这时你需要在maven的settings.xml文件中增加一个mirror,中国现在比较快的一个镜像是阿里云提供的,速度十分的快,用起来很爽,详细的配置信息见这个网站maven 亲测可用国内镜像 阿里云
好了,下面说一下MyBatis Generator一些属性配置的自我理解。

  • Running MyBatis Generator With Maven
    Running MyBatis Generator With Maven中提到了如何在maven项目中使用MyBatis Generator。刚开始不是很理解为什么可以使用mvn mybatis-generator:generate这种命令来执行MyBatis Generator来生成相应的代码。最后在mybatis-generator-maven-plugin的MyBatisGeneratorMojo.java源代码中找到了原因:
@Mojo(name = "generate",defaultPhase = LifecyclePhase.GENERATE_SOURCES)
public class MyBatisGeneratorMojo extends AbstractMojo 

    /**
     * Maven Project.
     *
     */
    @Parameter(property="project",required=true,readonly=true)
    private MavenProject project;

    /**
     * Output Directory.
     */
    @Parameter(property="mybatis.generator.outputDirectory", defaultValue="$project.build.directory/generated-sources/mybatis-generator", required=true)
    private File outputDirectory;

    /**
     * Location of the configuration file.
     */
    @Parameter(property="mybatis.generator.configurationFile",defaultValue="$project.basedir/src/main/resources/generatorConfig.xml", required=true)
    private File configurationFile;

    /**
     * Specifies whether the mojo writes progress messages to the log.
     */
    @Parameter(property="mybatis.generator.verbose", defaultValue="false")
    private boolean verbose;

    /**
     * Specifies whether the mojo overwrites existing files. Default is false.
     */
    @Parameter(property="mybatis.generator.overwrite", defaultValue="false")
    private boolean overwrite;

    /**
     * Location of a SQL script file to run before generating code. If null,
     * then no script will be run. If not null, then jdbcDriver, jdbcURL must be
     * supplied also, and jdbcUserId and jdbcPassword may be supplied.
     */
    @Parameter(property="mybatis.generator.sqlScript")
    private String sqlScript;

    /**
     * JDBC Driver to use if a sql.script.file is specified.
     */
    @Parameter(property="mybatis.generator.jdbcDriver")
    private String jdbcDriver;

    /**
     * JDBC URL to use if a sql.script.file is specified.
     */
    @Parameter(property="mybatis.generator.jdbcURL")
    private String jdbcURL;

    /**
     * JDBC user ID to use if a sql.script.file is specified.
     */
    @Parameter(property="mybatis.generator.jdbcUserId")
    private String jdbcUserId;

    /**
     * JDBC password to use if a sql.script.file is specified.
     */
    @Parameter(property="mybatis.generator.jdbcPassword")
    private String jdbcPassword;

    /**
     * Comma delimited list of table names to generate.
     */
    @Parameter(property="mybatis.generator.tableNames")
    private String tableNames;

    /**
     * Comma delimited list of contexts to generate.
     */
    @Parameter(property="mybatis.generator.contexts")
    private String contexts;

    /**
     * Skip generator.
     */
    @Parameter(property="mybatis.generator.skip", defaultValue="false")
    private boolean skip;
    ...

所以可以使用上述的命令来执行。归根结底还是自己对maven的原理不清楚。
另外从这个类中也可以看出可以在maven中配置的一些属性,包括configurationFile、sqlScript等属性。这也是mybatis-generator-maven-plugin做出的一些扩展。这也是为什么在示例程序的pom.xml中会指定sqlScript等属性,这样就可以根据指定的sql脚本来创建相关的数据库结构。例如:

<plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>$project.version</version>
        <executions>
          <execution>
            <id>Generate MyBatis Artifacts</id>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <sqlScript>classpath:mbg/test/common/scripts/CreateDB.sql</sqlScript>
          <jdbcDriver>org.hsqldb.jdbcDriver</jdbcDriver>
          <jdbcURL>jdbc:hsqldb:mem:aname</jdbcURL>
          <jdbcUserId>sa</jdbcUserId>
          <overwrite>true</overwrite>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>$hsqldb.version</version>
          </dependency>
          <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-systests-common</artifactId>
            <version>$project.version</version>
          </dependency>
        </dependencies>
      </plugin>
  • <columnOverride>元素中的delimitedColumnName属性
    这个属性的含义实际上就是指定生成的xml文件中的sql语句的对应的列用限定符来明确标示出来。具体的限定符在<context>中指定,默认的是”。此外,MBG会自动的将列含有空格符的用限定符标示出来。
    例如<columnOverride column="from" delimitedColumnName="true" >,那么生成的xml映射文件中生成的sql语句中对应的列就是"from"
    理解了这个属性,在<context>元素中的beginningDelimiter和endingDelimiter属性也就好理解了。

  • <table>元素中一些属性的解析
    schema属性表示的是数据库中的schema,如果指定了这个属性,那么在生成的映射xml文件中的sql语句中在表名前面就会加上shema的名称。
    例如`

    对应生成的映射xml文件中的sql语句是这样的:

select 
    <include refid="Base_Column_List" />
    from MBGTEST.ANOTHERAWFULTABLE
    where ID = #id,jdbcType=INTEGER

alias属性:如果在table元素中加上了这个属性,那么生成的sql语句中表就会有别名,并且列也有别名,别名的命名是”alias_actualColumnName”的形式。
例如
<table tableName="PKFields" alias="B" >
<columnOverride column="wierd$Field" delimitedColumnName="true"/>
</table>

生成的映射xml文件中的sql语句中是这样的

<sql id="Base_Column_List">
    B.ID2 as B_ID2, B.ID1 as B_ID1, B.FIRSTNAME as B_FIRSTNAME, B.LASTNAME as B_LASTNAME, 
    B.DATEFIELD as B_DATEFIELD, B.TIMEFIELD as B_TIMEFIELD, B.TIMESTAMPFIELD as B_TIMESTAMPFIELD, 
    B.DECIMAL30FIELD as B_DECIMAL30FIELD, B.DECIMAL60FIELD as B_DECIMAL60FIELD, B.DECIMAL100FIELD as B_DECIMAL100FIELD, 
    B.DECIMAL155FIELD as B_DECIMAL155FIELD, B."wierd$Field" as "B_wierd$Field", B."birth date" as "B_birth date", 
    B.STRINGBOOLEAN as B_STRINGBOOLEAN
  </sql>

<select id="selectByPrimaryKey" parameterType="mbg.test.mb3.generated.hierarchical.model.PkfieldsKey" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from PKFIELDS B
    where B.ID2 = #id2,jdbcType=INTEGER
      and B.ID1 = #id1,jdbcType=INTEGER
  </select>

domainObjectName属性:即生成的java POJOs的名字,默认是根据tableName来生成的。
例如:

<table tableName="FieldsOnly" domainObjectName="subpackage.FieldsOnlyEntity"
           mapperName="different.subpackage.FieldsOnlyMapper" />

这里指定的domainObjectName还含有包的名称,所以生成的java POJOs的名称是FieldsOnlyEntity,而所在的包是
package mbg.test.mb3.generated.hierarchical.model.subpackage;
对于mapperName属性也是同理。这里不再赘述。

以上是关于MyBatis Generator的一些知识点释疑的主要内容,如果未能解决你的问题,请参考以下文章

mybatis-generator

mybatis记录:mybatis generator在ideal中的一些坑

mybatis-generator + mysql/ptsql

SpringBoot知识体系+Vue3 实战WIKI知识库系统笔记 demo1_mybatis_generator

SpringBoot知识体系+Vue3 实战WIKI知识库系统笔记 demo1_mybatis_generator

JavaScript之this释疑