MyBatis代码生成器——MyBatis Generator

MyBatis Generator能够根据配置生成不同类型的代码,代码包含了数据库表对应的实体类、mapper接口类、mapperXML文件和Example对象等。这些代码中几乎包含了全部的表单操作方法,可以极大程度上方便我们使用MyBatis。

说实话,刚刚接触MyBatis时,我不知道有这玩意这么好使,pojo和mapper.xml文件都是自己敲的,算是练练手吧。所以,这是什么?自动生成pojo和mapper.xml文件,提高开发效率,作为一个优秀的程序员,“懒”是很重要的优点。当然,自动生成的都是固定的,对于CRUD操作自然是省事,但是对于一些特殊的业务和表操作,还是需要写的。

generatorConfig.xml

话不多说,上配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis/dtd/mybatis-generator-config_1_0.dtd">


<generatorConfiguration>
    <!--generatorConfiguration标签包含三个子标签,propertiesclassPathEntrycontext。
        注意三个子标签的顺序不能更改。-->

    <!--properties用于指定外部属性元素,最多可以配置1个。
        properties标签包含resourceurl两个属性,只能使用其中一个来指定properties文件。
        然后可以在配置文件中通过${property}引用。-->
    <!--<properties resource="classpath:xxx.properties"/>-->

    <!--classPathEntry标签可以配置多个,也可不配置
        常见用法通过location属性指定驱动的路径。-->
    <!--<classPathEntry location="E:\xxx.jar"/>-->

    <!--context标签,重要!至少配置一个,也可配置多个
        context标签用于指定生成一组对象环境,数据库、生成的类型和数据库中的表等。-->
    <context id="testTables" defaultModelType="flat" targetRuntime="MyBatis3Simple">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/test" userId="root"
                        password="root">
        </jdbcConnection>
        <!-- 默认false,把JDBC DECIMAL  NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 
            NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.seu.fn.pojo"
                            targetProject=".\src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.seu.fn.mapper"
                         targetProject=".\src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!-- targetPackagemapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.seu.fn.mapper"
                             targetProject=".\src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- 指定数据库表 -->
        <table schema="" tableName="class_and_grade"></table>
        <table schema="" tableName="students"></table>
        <table schema="" tableName="score_tb"></table>
    </context>
</generatorConfiguration>

这里使用一些常用操作进行测试,下面将会叙述每个标签的功能和用法,包括例子中没有提及的标签。generatorConfiguration标签下包含三个子标签properties、classPathEntry和context标签,前两个标签在上面的例子中已经说明,下面重点看一下context标签。

context标签属性

context标签只有一个必选属性id,用来唯一确定。此外还有几个可选属性值:

l  defaultModelType:重要,定义了如何生成实体类,可选值有:

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

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

Ø  hierarchical:如果有主键,那么会产生一个单独的主键实体类,会为BLOB字段单独生成一个实体类,剩下字段生成一个实体类。

l  targetRuntime:此属性用于指定生成的代码的运行时环境,可选属性值:

Ø  MyBatis3:默认,会生成与Example相关的方法。

Ø  MyBatis3Simple:不会生成Example相关的方法。

l  introspectedColumnImplement:指定扩展org.mybatis.generator.api.IntrospectedColumn类的实现类。

context标签子标签

子标签有严格的配置顺序,包括:

property(0个或多个)

plugin(0个或多个)

commentGenerator(0个或多个)

jdbcConnection(1个)

javaTypeResolver(0个或1个)

javaModelGenerator(1个)

sqlMapGenerator(0个或1个)

javaClientGenerator(0个或1个)

table(1个或多个)

property标签

property中包含以下属性:

autoDelimitKeywords,自动给关键字添加分隔符

beginningDelimiter,配置前置分隔符属性

endingDelimiter,配置后置分隔符属性

javaFileEncoding:要使用的Java文件的编码,GBK或UTF-8

plugin标签

用来定义一个插件,扩展或修改生成的代码,按配置顺序执行。主要包括缓存插件、序列化插件、ToString插件等。因为使用情况并不多,关于这些插件的介绍可以查看官方文档www.mybatis/generator/reference/plugins.html。

commentGenerator标签

用来配置如何生成注释信息。通过property属性进行配置,可选值有:

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

suppressDate:阻止生成注释包含时间戳,默认false

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

一般情况下自动生成的注释信息没有任何价值。

jdbcConnection标签

用于指定自动生成要连接的数据库信息,必选唯一。如果JDBC驱动不在classpath下,需要通过classPathEntry便签引入jar包。

必选两个属性:

driverClass:访问数据库的JDBC驱动完全限定类名,如com.mysql.jdbc.Driver。

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

userId,password分别为用户名和密码,需要时填写。

同时还可以配置多个property子标签。

javaTypeResolver标签

用来指定JDBC类型和Java类型如何转换。

可选属性type,一般使用默认不配置。

还可配置property子标签,可配置属性为forceBigDecimals,是否将DECIMAL和NUMERIC类型的JDBC字段转换为Java的BigDecimal,默认false,一般使用默认。

javaModelGenerator标签

必须配置一个且仅一个,用来控制生成的实体类。

只有两个必选属性:

targetPackage:生成实体类存放的包名。

targetProject:指定目标项目路径,绝对或相对。

子标签property属性:

constructorBased:只对MyBatis3有效,为true使用构造方法入参,false使用setter方式,默认false。

enableSubPackages:如果为true,会根据catalog和schema来生成子包。

immutable:实体类属性是否可变。

rootClass:设置所有实体类的基类。

trimString:判断是否对数据库查询结果进行trim操作,默认false。

sqlMapGenerator标签

用于配置SQL映射生成器(Mapper.xml文件)的属性。

两个必选属性:

targetPackage:生成SQL映射文件存放的包名。

targetProject:指定目标项目路径,绝对或相对。

子标签property属性:

enableSubPackages:如果为true,会根据catalog和schema来生成子包。

javaClientGenerator标签

用于配置Java客户端生成器(Mapper接口)的属性。

三个必选属性:

type:用于选择客户端带(Mapper接口)生成器,用户可自定义实现。该属性提供了以下预设的代码生成器,首先根据context的targetRuntime分成两类:

l  MyBatis3:

ANNOTATEDMAPPER:基于注解的mapper接口,没有xml文件

MIXEDMAPPER:XML和注解的混合形式

XMLMAPPER:所有方法都在xml中,接口调用依赖xml文件(推荐使用)

l  MyBatis3Simple

ANNOTATEDMAPPER:基于注解的mapper接口,没有xml文件

XMLMAPPER所有方法都在xml中,接口调用依赖xml文件(推荐使用)

targetPackage:生成mapper接口存放的包名。

targetProject:指定目标项目路径,绝对或相对。

table标签

配置需要生成最终代码的表。

必选属性:

tableName,指定要生成的表名,可用通配符表示多个表。还有其他多个属性,这里不在一一列出。

实例

根据上面配置的generatorConfig.xml文件,编写如下代码:

public class GeneratorSqlmap {

   
public void generator() throws Exception {

        List<String> warnings =
new ArrayList<String>();
        boolean
overwrite = true;
       
//指定逆向工程配置文件
       
File configFile = new File("generatorConfig.xml");
       
ConfigurationParser cp = new ConfigurationParser(warnings);
       
Configuration config =cp.parseConfiguration(configFile);
       
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
       
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
               
callback, warnings);
       
myBatisGenerator.generate(null);

   
}

   
public static void main(String[] args) {
       
try {
            GeneratorSqlmapgeneratorSqlmap =
new GeneratorSqlmap();
           
generatorSqlmap.generator();
       
} catch (Exception e) {
            e.printStackTrace()
;
       
}
    }
}

运行后在src下会生成对应的pojo和mapper文件,省时高效。可用根据需要进行修改配置文件。

更多推荐

MyBatis代码生成器——MyBatis Generator