Mybatis代码生成器

MyBatis Generator:代码生成器,帮助我们自动生成基本的增、删、改、查的代码,方便我们开发,减少不必要的体力活动。

当数据库表的字段比较少的时候,写起来还能接受,一旦字段过多或者需要在很多表中写这些基本方法时,就会很麻烦,不仅需要很大的代码量,而且字段过多时很容易出现错误。

作为一个优秀的程序员,”懒”是很重要的优点。我们不仅要会写代码,还要会利用工具生成代码。Mybatis的开发团队提供了一个很强大的代码生成器——MyBatis Generator,后文中使用缩写MBG来代替。

MBG通过丰富的配置可以生成不同类型的代码,代码包含了数据库表对应的实体类、Mapper接口类、MapperXML文件和Example对象等,这些代码文件中几乎包含了全部的单表操作方法,使用MBG可以极大程度上方便我们使用MyBatis,还可以减少很多重复操作。

官方文档:http://www.mybatis.org/generator/


非图形化方式

首先,我讲解官方推出的方式,mybatis-generator有三种用法:命令行、eclipse插件、maven插件。个人觉得maven插件最方便,可以在eclipse/intellij idea等ide上可以通用。

不管哪种方式,都需要学会MBG的xml配置文件,下面,我们来学习一下吧~~~

XML配置详解

首先按照MBG的要求添加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">

在文件头之后,需要加上XML文件的根节点:generatorConfiguration

<generatorConfiguration>

    <!--其他配置内容-->

</generatorConfiguration>

以上两部分内容是MBG必备的基本信息,后面是MBG中的自定义配置部分。下面介绍 generatorConfiguration 标签下的 3 个子级标签

分别是:propertiesclassPathEntrycontext。在配置这三个标签时,注意它们的顺序,必须和这里列举的顺序一致才行!!!


第一个是properties标签。这个标签用来指定外部的属性元素,最多可以配置一个,也可以不配置。

properties标签用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用 ${property} 这种形式的引用,通过这种方式引用属性文件中的属性值,对于后面需要配置的JDBC信息会很有用。

properties标签包括 resource 和 url 两个属性,只能使用其中一个属性来指定,同时出现则会报错。

  • resource:指定classpath下的属性文件,类似:com/liuzhuo/mybatis/generatorConfig.properties 这样的属性值。

  • url:指定文件系统上的特定位置,例如:file:///E:/myfolder/generatorConfig.properties


第二个是 classPathEntry 标签。这个标签可以配置多个,也可以不配置。

classPathEntry标签最常见的用法是通过属性 location指定驱动的路径,代码如下:

<classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/>


第三个是 context 标签。这个标签是要重点讲解的,该标签至少配置一个,可以配置多个。

context标签用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的context。

context标签只有一个必选属性id,用来唯一确定该标签,该id属性可以运行MBG时使用。此外还有几个可选属性:

  • defaultModelType:这个属性很重要,定义了MBG如何生成实体类。该属性可选值有:

(1)conditional:默认值,和下面的 hierarchical 类似,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,而是会将该字段合并到基本实体类中。

(2)flat:该模型只为每张表生成一个实体类。这个实体类包含表中的所有字段。这种模型最简单,推荐使用。

(3)hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段,则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段另外生成一个单独的实体类。MBG会在所有生成的实体类之间维护一个继承关系。

  • targetRuntime:此属性用于指定生成的代码的运行环境,支持以下可选值

(1)MyBatis3:默认值

(2)MyBatis3Simple:这种情况不会生成与Example相关的方法。

  • introspecedColumnImpl:该参数可以指定扩展 org.mybatis.generator.api.Introspected Column类的实现类。

一般情况下,使用如下配置即可。

<context id="Mysql" defaultModeType="flat">


MBG配置中的其他几个标签基本上都是 context的子标签,这些子标签(有严格的配置顺序)包括以下几个:

  • property(0个或多个)

  • plugin(0个或多个)

  • commentGenerator(0个或多个)

  • jdbcConnection(1个)

  • javaTypeResolver(0个或多个)

  • javaModelGenerator(1个)

  • sqlMapGenerator(0个或多个)

  • javaClientGenerator(0个或多个)

  • table(1个或多个)

下面逐条介绍这些重要的标签。


property标签

在介绍property标签之前,先来了解一下数据库中的分隔符

举一个简单的例子,假设数据库中有一个表,名为 user info ,注意这个名字,user 和 info 中间存在一个空格。如果直接写如下查询,在数据库执行这个查询时会报错。

select * from user info

可能会提示 user 表不存在或者user附件有语法错误,这种情况下该怎么写 user info表呢?

这时,就会用到分隔符了,在MySQL中可以使用反单引号 “ ` “ 作为分隔符,例如:

`user info`

在SQL Server中则是 [user info]。通过分隔符可以将其中的内容作为一个整体的字符串进行处理,当SQL中有数据库关键字时,使用反单引号括住关键字,可以避免数据库产生错误。

之所以先介绍分隔符,就是因为property标签中包含以下3个和分隔符相关的属性。

  • autoDelimitKeywords

  • beginningDelimiter

  • endingDelimiter

从名字可以看出,第一个是自动给关键字添加分隔符的属性。MBG中维护了一个关键字列表,当数据库中的字段或表与这些关键字一样时,MBG会自动给这些字段或表添加分隔符。关键字列表可以查看MBG中的 org.mybatis.generator.internal.db.SqlReservedWords类。

后面两个属性很简单,一个是配置前置分隔符的属性,一个是配置后置分隔符的属性。在MySQL中,两个分隔符都是 “ ` “,在SQL Server中分别为 “ [ “ 和 “ ] “。

MySQL中的property配置写法如下:

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

   <!--其他配置-->
</context>

除了上面3个和分隔符相关的属性外,还有以下3个属性。

  • javaFileEncoding

  • javaFormatter

  • xmlFormatter

属性 javaFileEncoding 设置要使用的Java文件的编码,例如 GBK 或 UTF-8。默认使用当前运行环境的编码。后面的不常用,就不介绍了。


plugin标签

plugin标签可以配置0个或多个,个数不受限制。

plugin标签用来定义一个插件,用于扩展或修改通过MBG生成的代码。该插件将按照在配置中的顺序执行。MBG插件使用的情况并不多,如果对开发插件有兴趣,可以参考MBG文档,或者参考下面要介绍的缓存插件的例子,这个例子包含在MBG插件中。

下面要介绍的缓存插件的全限定名称为: org.mybatis.generator.plugins.CachePlugin。

这个插件可以在生成的SQL XML映射文件中增加一个 cache 标签。只有当targetRuntime 为 MyBatis3时,该插件才有效。

该插件接受下列可选属性。

  • cache_eviction

  • cache_flushInterval

  • cache_readOnly

  • cache_size

  • cache_type

配置方法如下:

<plugin type="org.mybatis.generator.plugins.CachePlugin">

   <property name="cache_eviction" value="LRU"/>
   <property name="cache_size" value="1024"/>

</plugin>

添加这个配置后,生成的Mapper.xml文件中会增加如下的缓存相关配置。

<cache eviction="LRU" size="1024">

</cache>

commentGenerator标签

该标签用来配置如何生成注释信息,最多可以配置1个。

该标签有一个可选属性 type,可以指定用户的实现类,该类需要实现 org.mybatis.generator.api.CommentGenerator接口,而且必有一个默认空的构造方法。

type属性接收默认的特殊值:DEFAULT,使用默认的实现类 org.mybatis.generator.internal.DefaultCommentGenerator。

默认的实现类中提供了三个可选属性,需要通过property属性进行配置。

  • suppressAllComments:阻止生成注释,默认为false。

  • suppressDate:阻止生成的注解包含时间戳,默认为false。

  • addRemarkComments:注释是否添加数据库表的备注信息,默认为false。

一般情况下,由于MBG生成的注解信息没有任何价值,而且时间戳的情况下每次生成的注释都不一样,使用版本控制的时候每次都会提交,因而一般情况下都会屏蔽注释信息,可以如下配置:

<commentGenerator>

   <property name="suppressDate" value="true"/>
   <property name="addRemarkComments" value="true"/>

</commentGenerator>
jdbcConnection标签

jdbcConnection标签用于指定MBG要连接的数据库信息,该标签必选,并且只能有一个。

配置该标签需要注意,如果JDBC驱动不在classpath下,就要通过 classPathEntry 标签引入 jar 包,这里推荐将jar包放到classpath下,或者参考前面classPathEntry配置的JDBC驱动的方法。

该标签有两个必选属性。

  • driverClass:访问数据库的JDBC驱动程序的完全限定类名。

  • connectionURL:访问数据库的JDBC连接URL。

该标签还有两个可选属性。

  • userId:访问数据库的用户ID。

  • password:访问数据库的密码。

此外,该标签还可以接受多个property子标签,这里配置的property属性都会添加到JDBC驱动的属性中(使用property标签的name属性反射赋值)。

这个标签配置起来非常容易,基本配置如下:

<jdbcConnection driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/mybatis"
                userId="root"
                password="">
</jdbcConnection>

Oracle的配置:

<jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"
                connectionURL="jdbc:oracle:thin:@//localhost:1521/oracle"
                userId="mybatis"
                password="mybatis">
    <property name="remarksReporting" value="true"/>
</jdbcConnection>
javaTypeResolver标签

该标签的配置用来指定 JDBC类型Java类型 如何转换,最多可以配置一个。

该标签提供了一个可选的属性type。另外,和commentGenerator类似,该标签提供了默认的实现 DEFAULT ,一般情况下使用默认即可,需要特殊处理的情况可以通过其他标签配置来解决,不建议修改该属性。

该属性还有一个可以配置的property标签,可以配置的属性为:forceBigDecimals,该属性可以控制是否强制将 DECIMAL 和 NUMERIC 类型的JDBC 字段转换为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。

如果将 forceBigDecimals 设置为 true,那么一定会使用 java.math.BigDecimal类型。

<javaTyepResolver>
   <property name="forceBigDecimals" value="false" />
</javaTyepResolver>
javaModelGenerator标签

该标签用来控制生成的实体类,根据context标签中配置的 defaultModelType属性值的不同,一个表可能会对应生成多个不同的实体类。一个表对应多个类时使用并不方便,所以前面推荐使用 flat,保证一个表对应一个实体类。该标签必须配置一个,并且最多配置一个。

该标签只有两个必选属性。

  • targetPackage:生成实体类存放的包名。一般就是放在该包下,实际还会受到其他配置的影响。

  • targetProject:指定目标项目路径,可以使用相对路径或绝对路径。

该标签还支持以下几个property子标签属性。

  • constructorBased:该属性只对 MyBatis3 有效,如果为 true就会使用构造方法入参,如果为 false就会使用setter方式。默认为false。

  • enableSubPackages:如果为true,MBG会根据 catalog 和 schema 来生成子包。如果为 false 就会直接使用 targetPackage属性。默认为false。

  • immutable:用来配置实体类属性是否可变。如果设置为 true,那么constructorBased不管设置成什么,都会使用构成方法入参,并且不会生成setter方法。如果false,实体类属性就可以改变。默认为false。

  • rootClass:设置所有实体类的基类。如果设置,则需要使用类的全限定名称。并且,如果MBG能够加载 rootClass(可以通过classPathEntry引入jar包,或者classpath方式),那么MBG不会覆盖和父类中完全匹配的属性。匹配规则如下:

(1)属性名完全相同

(2)属性类型相同

(3)属性有getter方法

(4)属性有setter方法

  • trimStrings:判断是否对数据库查询结果进行trim操作,默认值为false。如果设置为 true就会生成如下代码:
    public void setUsername(String username){
      this.username = username == null ? null : username.trim();
    }
    

javaModelGenerator配置如下:

<javaModelGenerator targetPackage="com.liuzhuo.model"
                    targetProject="src\main\java" >  <!--相对路径-->

     <property name="enableSubPackages" value="false" />
     <property name="trimStrings" values="false" />

</javaModelGenerator>
sqlMapGenerator标签

该标签用于配置SQL映射生成器(Mapper.xml文件)的属性,该标签可选,最多配置一个。

如果targetRuntime设置为MyBatis3,则只有当javaClientGenerator配置需要XML时,该标签才必须配置一个。如果没有配置:javaClientGenerator,则使用以下规则。

  • 如果指定了一个sqlMapGenerator,那么MBG将只生成XML的SQL映射文件和实体类。

  • 如果没有指定sqlMapGenerator,那么MBG将只生成实体类。

该标签只有两个必选属性。

  • targetPackage:生成SQL映射文件(XML文件)存放的包名。一般就是放在该包下,实际还会受到其他配置的影响。

  • targetProject:指定目标项目路径,可以使用相对路径或绝对路径。

该标签还有一个可选的property子标签属性:enableSubPackages,如果为true,MBG会根据catalog和schema来生成子包。如果为false就会直接用targetPackage属性,默认为false。

sqlMapGenerator配置如下:

<sqlMapGenerator targetPackage="com.liuzhuo.mapper"
                 targetProject="E:\Myproject\src\main\resources">  <!--绝对路径-->

      <property name="enableSubPackages" values="false" />
</sqlMapGenerator>
javaClientGenerator标签

该标签用于配置Java客户端生成器(Mapper接口)的属性,该标签可选,最多配置一个。如果不配置该标签,就不会生成Mapper接口。

该标签有以下3个必选属性。

  • type:用于选择客户端代码(Mapper接口)的属性,用户可以自定义实现,需要继承 org.mybatis.generator.codegen.AbstractJavaClientGenerator类,必须有一个默认空的构造方法。该属性提供了以下预设的代码生成器,首先根据context的targetRuntime分成两类(不考虑iBATIS)。

(1)MyBatis3

ANNOTATEDMAPPER: 基于注解的Mapper接口,不会有对应的XML映射文件。
MIXEDMAPPER:    XML和注解的混合模式,上面这种情况中的SQL Provider注解方法会被XML方式替代。
XMLMAPPER:      所有方法都在XML中,接口调用依赖XML文件。

(2)MyBatis3Simple

ANNOTATEDMAPPER: 基于注解的Mapper接口,不会有对应的XML映射文件。
XMLMAPPER:      所有方法都在XML中,接口调用依赖XML文件。
  • targePackage:生成Mapper接口存放的包名。一般就是放在该包下,实际还会受到其他配置的影响。

  • targetProject:指定目标项目路径,可以使用相对路径或绝对路径。

javaClientGenerator标签配置:

<javaClientGenerator type="XMLMAPPER" targetPackage="com.liuzhuo.mapper"
                     targetProject="src\main\java" />

    <property name="enableSubPackages" value="true"/>

</javaClientGenerator>
table标签

table标签是最重要的一个标签,该标签用于配置需要通过内省数据库的表,只有在table中配置过的表,才能经过上述其他配置生成最终的代码,该标签至少要配置一个,可以配置多个。

table标签有一个必选属性 tableName ,该属性指定要生成的表名,可以使用SQL通配符匹配多个表。

例如要生成全部的表,可以配置如下:

<table tableName="%" />

table标签包含多个可选属性。

  • schema:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如 schema.tableName的形式。

  • catalog:数据库的catalog,如果设置了该值,生成SQL的表名会变成如:catalog.tableName的形式。

  • alias:如果指定,这个值会用在生成的 select 查询SQL表的别名和列名上,例如 alias_actualColumnName(别名_实际列名)。

  • domainObjectName:生成对象的基本名称。如果没有指定,MBG会自动根据表名来生成名称。

  • enableXXX:XXX代表多种SQL方法,该属性用来指定是否生成对应的XXX语句。

  • selectByPrimaryKeyQueryId:DBA跟踪工具中会用到,具体请参考详细文档。

  • selectByExampleQueryid:DBA跟踪工具中会用到,具体请参考详细文档。

  • modelType:和context的defaultModelType含义一样,这里可以针对表进行配置,胡覆盖defaultModelType的配置。

  • escapeWildcards:表示查询列是否对 schema和表名中的SQL通配符( _ 和 % )进行转义。对于某些驱动,当 schema或表名中包含SQL通配符时,转义是必须的。有一些驱动则需要将下画线进行转义,例如:MY_TABLE。默认值是 false。

  • delimitidentifiers:是否给标识符增加分隔符。默认是false。当 catalog、schema、tableName中包含空白时,默认为true。

  • delimitAllColumns:是否对所有列添加分隔符。默认为 false。


除了 property 子标签外, table 还包含以下子标签。

  • generatedKey (0个或 多个)

  • columnRenamingRule(0 个或 多个)

  • columnOverride (0个或多个)

  • ignoreColumn (0个或多个)


generatedKey:该标签用来指定自动生成主键的属性。

该标签包含以下两个必选属性。

  • column:生成列的列名

  • sqlStatement:返回新值的SQL语句。如果这是一个identity列,则可以使用其中一个预定义的特殊值,预定义值如下:

(1) Cloudscape

(2)DB2

(3)DB2_MF

(4)Derby

(5)HSQLDB

(6)Informix

(7)MySQL

(8)SQL Server

(9)SYBASE

(10)JDBC:使用该值时,Mybatis会使用JDBC标准接口来获取值,这是一个独立于数据库获取标识列中的值的方法。

该标签还包含两个可选属性。

  • identity:当设置为 true 时,该列会被标记为 identity 井且 selectKey标签会被插入在 insert后面;当设置为 false时,selectKey标签会被插入在 insert前面面。

  • type: type = post 且 identity=true 时,生成的 selectKey 中 order=AFTER;当type=pre时,identity只能为false,生成selectKey中的 order=BEFORE。


table的示例:

<table tableName="user login info" domainObjectName= "UserLogininfo">

       <generatedKey column="id" sqlStatement="MySql" />
</table> 

改配置生成的对应的insert方法如下:

<insert id="insert" parameterType="com.liuzhuo.model.UserLogininfo">
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST INSERT ID () 
    </selectKey> 
    insert into `user login info` (Id, username , logindate , loginip) 
    values (#{id,jdbcType=INTEGER} , #{username , jdbcType=VARCHAR} , 
            #{logindate,jdbcType=TIMESTAMP}
            #{loginip,jdbcType=VARCHAR}) 
</ insert> 

完整的配置

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

    <classPathEntry
            location="D:\mysql-connect-jar\mysql-connector-java-5.1.39.jar"/>

    <context id="mySqlContext" targetRuntime="MyBatis3" 
             defaultModelType="flat">

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

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

        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="root"
                        password=""/>

        <javaModelGenerator targetPackage="com.liuzhuo.entity"
                            targetProject="src\main\java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="com.liuzhuo.mapper"
                         targetProject="src\main\resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <javaClientGenerator targetPackage="com.liuzhuo.mapper"
                             targetProject="src\main\java"
                             type="MIXEDMAPPER">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!--<table tableName="T_FEE_AGTBILL" domainObjectName="FeeAgentBill"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false"/>-->

        <table tableName="student" domainObjectName="Student">
              <generatedKey column="id" sqlStatement="MySql"/>
        </table>

    </context>
</generatorConfiguration>

有关配置有几点重要说明。

(1)context属性 targetRuntime 设置为 MyBatis3Simple,可以避免生成与Example相关的代码和方法,如果需要Example相关的代码,则设置为:MyBatis3.

(2)context属性 defaultModelType 设置为 flat,目的是使每个表只生成一个实体类,当没有复杂的类继承时,使用起来更方便。

(3)因为此处使用的数据库为MySQL,所以前后分隔符都设置为 “ ` “。


运行MyBatis Generator

MBG提供了很多种运行方式,常用的有以下几种:

  • 使用java编写代码运行

  • 从命令提示符运行

  • 使用 Maven Plugin运行

  • 使用 Eclipse插件运行


使用java编写方式

在写代码之前,需要先把MBG的jar包添加到项目当中。

第一种方式是,从地址:https://github.com/mybatis/generator/releases 下载jar包。

第二种方式是,使用Maven方式直接引入依赖,在pom.xml中添加如下依赖:

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator</artifactId>
    <version>1.3.7</version>
</dependency>

在MyBatis项目中添加 com.mybatis.generator包,创建Generator.java类。

public class Generator {

   public static void main(String[] args) throws Exception{
    //MBG执行过程中的警告信息
    List<String> warning = new ArrayList<String>();
    //当生成的代码重复时,覆盖原代码
    boolean overwrite = true;
    //读取MBG配置文件
    InputStream is = Generator.class.getResourceAsStream("/generator/generatorConfig.xml");
    ConfigurationParser cp = new ConfigurationParser(warnings);
    Configuration config = cp.parseConfiguration(is);
    is.close();

    DefaultShellCallback callback =  new DefaultShellCallback(overwrite);

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

使用Java编码方式运行的好处是,generatorConfig.xml配置的一些特殊的类(如commentGenerator 标签中 type 属性配置的 MyCommentGenerator 类)只要在当前项目中,或者在当前项目的 classpath 中, 就可以直接使用。使用其他方式时都需要特别配置才能在MBG执行过程中找到 MyCommentGenerator 类并实例化,否则都会由于找不到这个类而抛出异常。

从命令提示符运行

从命令提示符运行就必须使用 jar包,将这个jar包与generatorConfig.xml文件放在一起。从这里就可以体会到为什么说这种配置方式不方便了,因为需要修改generatorConfig.xml配置文件。

将 MySQL JDBC 驱动 (如 mysql-connector java-5.1.38.jar )放到当前目录中,然后在配置文件中添加classPathEntry:

<generatorConfiguration>

<classPathEntry location="mysql-connector java-5.1.38.jar"/>

<context id="MySqlContext" defaultModelTyp="flat">
  <!--其他原有配置-->
</context>

</generatorConfiguration> 

除此之外,在当前目录中添加src文件夹,在src中再添加 main文件夹,main文件夹中添加 java 和 resources文件夹。

下面介绍一下MBG命令行可以接受的几个参数:

  • -configfile fileName :指定配置文件的名称。

  • -overwrite(可选):指定了该参数后,如果生成的java文件已经存在同名的文件,新生成的文件则会覆盖原有的文件。否则,会新生成一个唯一的名字。

  • -verbose(可选):指定该参数,执行过程中会输出到控制台。

  • -forceJavaLogging(可选):指定该参数,MBG将会使用Java日志记录而不会使用Log4J,即使Log4J在运行时的类路径中。

  • contextids context1,context2,···(可选):指定该参数,逗号隔开这些的context会被执行。

  • tables table1,table2,···(可选):指定该参数,逗号隔开的这些表会被运行。


java -jar mybatis-generator-core-1.3.3.jar -configfile generatorConfig.xml


java -Dfile.encoding=UTF-8 -jar mybatis-generator-core-1.3.3.jar -configfile generatorConfig.xml -overwrite

使用Maven Plugin运行

使用 Maven Plugin 插件方式和 java编码方式类似,都是和项目绑定在一起的,当需要引用其他类时,需要给 Maven插件添加依赖,否则找不到类。

在pom.xml文件中添加插件配置:

    <build>
        <plugins>
            <plugin>
            <groupid>org.mybatis.generator</groupid> 
            <artifactid>mybatis-generator-maven-plugin</artifactid> 
            <version>l.3.3</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.l.38</version> 
                 </dependency> 
                 <dependency> 
                     <groupid>com.liuzhuo</groupid> 
                     <artifactid>mybatis</artifactid> 
                     <version>0.0.1-SNAPSHOT</version> 
                  </dependency> 
            </dependencies> 
            </plugin> 
        </plugins>
    </build>

这里<configuration>就和命令行的参数一样,不用讲了,特殊之处在于插件中的<dependencies>,在generatorConfig.xml配置文件中,没有通过classPathEntry方式配置 JDBC驱动了,这里通过添加依赖将 JDBC驱动添加到了MBG的classpath中,另外还添加了当前项目的依赖。

需要特别注意的是:当前项目必须执行 mvn install(通过Maven命令将当前项目安装到本地仓库),否则会找不到当前项目的依赖。

配置好插件后,可以执行:

mvn mybatis-generator:generate


Eclipse插件方式

(1)安装Eclipse插件:

从MBG的发布页面 https://github.com/mybatis/generator/releases 中下载插件:

org.mybatis.generator.eclipse.site-1.3.7.201807042148.zip

下载好插件后,在Eclipse中选中菜单 Help 中的 Install New Software:

点击Add按钮,在弹出的窗口中选择 Archive,选择下载完成的 MBG 插件,输入 Name MBG后,点击OK。

从下拉列表中选择全部的 MyBatis Generator,点击Next,一步步完成安装,安装完成后重启Eclipse。

(2)使用Eclipse插件

Eclipse 插件的运行方式有点特殊, JDBC 驱动需要通过 classPathEntry 进行配置,其他定制类只要在当前项目或当前项目classpath中即可使用。

<generatorConfiguration>

    <classPathEntry
            location="D:\mysql-connect-jar\mysql-connector-java-5.1.39.jar"/>

    <context id="mySqlContext" targetRuntime="MyBatis3" 
             defaultModelType="flat">

        <property name="begnningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        <!--其他配置-->
</generatorConfiguration>

(3) 运行

完成上述修改后,在配置文件中单击鼠标右键,选择:Generate MyBatis/iBATIS Artifacts

点击 Generate MyBatis 后就会自动生成代码。


使用IDEA的方式

我自己使用的是IDEA的方式。

随便创建一个 Springboot的web项目:

我填写的是:
groupId:com.generator
artifactId:mybatis

项目结构:

pom.xml文件:

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

    <groupId>com.generator</groupId>
    <artifactId>mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mybatis</name>
    <description>generator-mybatis</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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>
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.39</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

</project>

在resources中,添加:generator.properties 文件:

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/mybatis
jdbc.userId=root
jdbc.password=123456
jdbc.database=mybatis

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="generator.properties"></properties>

    <!--指定特定数据库的jdbc驱动jar包的位置 -->
    <!--<classPathEntry location="${jdbc.driverLocation}"/>-->

    <context id="default" targetRuntime="MyBatis3">


        <!-- optional,旨在创建class时,对注释进行控制 -->
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressDate" value="false"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>


        <!--jdbc的数据库连接 -->
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection
                driverClass="${jdbc.driverClass}"
                connectionURL="${jdbc.connectionURL}"
                userId="${jdbc.userId}"
                password="${jdbc.password}">
        </jdbcConnection>


        <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
            targetPackage     指定生成的model生成所在的包名
            targetProject     指定在该项目下所在的路径
        -->
        <javaModelGenerator targetPackage="com.liuzhuo.model.student" targetProject="src/main/java">
            <!-- 是否对model添加 构造函数 -->
            <property name="constructorBased" value="true"/>

            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>

            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>

            <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 -->
        <sqlMapGenerator targetPackage="com.liuzhuo.mapper.student" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>


        <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
                type="ANNOTATEDMAPPER",生成Java Model 和 基于注解的Mapper对象
                type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
                type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
        -->
        <javaClientGenerator targetPackage="com.liuzhuo.mapper.student" targetProject="src/main/java"
                             type="MIXEDMAPPER">
            <property name="enableSubPackages" value="true"/>
            <!--
                    定义Maper.java 源代码中的ByExample() 方法的可视性,可选的值有:
                    public;
                    private;
                    protected;
                    default
                    注意:如果 targetRuntime="MyBatis3",此参数被忽略
             -->
            <property name="exampleMethodVisibility" value="public"/>
            <!--
              方法名计数器
              Important note: this property is ignored if the target runtime is MyBatis3.
            <property name="methodNameCalculator" value=""/>
             -->
            <!--
                  为生成的接口添加父接口
            <property name="rootInterface" value=""/>
            -->
        </javaClientGenerator>

        <!--tableName:表名
            schema:数据库名
            domainObjectName:实体类的名字
        -->
        <!--详细的表-->
        <!--
       <table tableName="tbl_file_permission_map" schema="${jdbc.database}"
               domainObjectName="FilePermissionMap"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">

               optional , only for mybatis3 runtime
               自动生成的键值(identity,或者序列值)
               如果指定此元素,MBG将会生成<selectKey>元素,然后将此元素插入到SQL Map的<insert> 元素之中
               sqlStatement 的语句将会返回新的值
               如果是一个自增主键的话,你可以使用预定义的语句,或者添加自定义的SQL语句. 预定义的值如下:
                  Cloudscape    This will translate to: VALUES IDENTITY_VAL_LOCAL()
                  DB2:      VALUES IDENTITY_VAL_LOCAL()
                  DB2_MF:       SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
                  Derby:        VALUES IDENTITY_VAL_LOCAL()
                  HSQLDB:   CALL IDENTITY()
                  Informix:     select dbinfo('sqlca.sqlerrd1') from systables where tabid=1
                  MySql:        SELECT LAST_INSERT_ID()
                  SqlServer:    SELECT SCOPE_IDENTITY()
                  SYBASE:   SELECT @@IDENTITY
                  JDBC:     This will configure MBG to generate code for MyBatis3 suport of JDBC standard generated keys. This is a database independent method of obtaining the value from identity columns.
                  identity: 自增主键  If true, then the column is flagged as an identity column and the generated <selectKey> element will be placed after the insert (for an identity column). If false, then the generated <selectKey> will be placed before the insert (typically for a sequence).

            <generatedKey column="" sqlStatement="" identity="" type=""/>

            optional.
                     列的命名规则:
                     MBG使用 <columnRenamingRule> 元素在计算列名的对应 名称之前,先对列名进行重命名,
                     作用:一般需要对BUSI_CLIENT_NO 前的BUSI_进行过滤
                     支持正在表达式
                     searchString 表示要被换掉的字符串
                     replaceString 则是要换成的字符串,默认情况下为空字符串,可选

            <columnRenamingRule searchString="" replaceString=""/>

            optional.告诉 MBG 忽略某一列
                    column,需要忽略的列
                    delimitedColumnName:true ,匹配column的值和数据库列的名称 大小写完全匹配,false 忽略大小写匹配
                    是否限定表的列名,即固定表列在Model中的名称

            <ignoreColumn column="" delimitedColumnName=""/>


            optional.覆盖MBG对Model 的生成规则
                 column: 数据库的列名
                 javaType: 对应的Java数据类型的完全限定名
                 在必要的时候可以覆盖由JavaTypeResolver计算得到的java数据类型. For some databases, this is necessary to handle "odd" database types (e.g. MySql's unsigned bigint type should be mapped to java.lang.Object).
                 jdbcType:该列的JDBC数据类型(INTEGER, DECIMAL, NUMERIC, VARCHAR, etc.),该列可以覆盖由JavaTypeResolver计算得到的Jdbc类型,对某些数据库而言,对于处理特定的JDBC 驱动癖好 很有必要(e.g. DB2's LONGVARCHAR type should be mapped to VARCHAR for iBATIS).
                 typeHandler:

            <columnOverride column="" javaType="" jdbcType="" typeHandler="" delimitedColumnName=""/>
        </table>
        -->

        <!--其他表的简单配置-->
        <table tableName="student" domainObjectName="Student"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

resources目录结构:


使用 Maven 插件运行:

运行后的结果:


图像化方式

mybatis-generator-gui是基于mybatis generator开发一款界面工具, 本工具可以使你非常容易及快速生成Mybatis的Java POJO文件及数据库Mapping文件。

地址是:https://github.com/zouzg/mybatis-generator-gui

要求:本工具由于使用了Java 8的众多特性,所以要求JDK 1.8.0.60以上版本,另外JDK 1.9暂时还不支持。


方式一下载软件

直接下载软件: http://tools.mingzhi.ink

(1)下载完成后,直接运行该软件(前提,你的本机的java环境变量要配置为:JDK 1.8.0.60以上版本)。

(2)点击保存后:

(3)点击代码生成:

方式二下载源码启动

两种方式下载源码
  • 直接下载源码:

  • 使用git工具:git clone https://github.com/zouzg/mybatis-generator-gui

两种方式启动
  • 直接进入下载好的源码目录

直接下载的目录为:mybatis-generator-gui-master ,git后的目录为:mybatis-generator-gui

(1)在根目录下,启动 cmd

然后输入:mvn jfx:jar

注意:你的本机要先安装好 maven,并配置好相关的环境变量。

输入命令后,会开始下载相关的jar包:

(2) 进入target/jfx/app/目录下

输入:cd target/jfx/app/

然后输入:java -jar mybatis-generator-gui.jar

回车后,就会弹出界面系统:


  • 使用Eclipse或IDEA启动下载好的源代码

要求,你的IDE配置的JDK必须大于:1.8.0.40。

在 com.zzg.mybatis.generator下,找到:MainUI 主类:

运行主类即可:



注意事项

(1) 本自动生成代码工具只适合生成单表的增删改查,对于需要做数据库联合查询的,请自行写新的XML与Mapper;

(2) 部分系统在中文输入方法时输入框中无法输入文字,请切换成英文输入法;

(3) 如果不明白对应字段或选项是什么意思的时候,把光标放在对应字段或Label上停留一会然后如果有解释会出现解释;


还有一款图形化生成器:https://github.com/spawpaw/mybatis-generator-gui-extension

大家可以自行尝试,运行。


  目录