maven项目加入mybatis generator依赖
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
generator.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>
<!-- 数据库驱动包位置 -->
<classPathEntry location="D:\software\lib\mysql-connector-java-5.1.21.jar" />
<context id="MysqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 由于beginningDelimiter和endingDelimiter的默认值为双引号("),在Mysql中不能这么写,所以还要将这两个默认值改为` -->
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!-- 为生成的Java模型类添加序列化接口,并生成serialVersionUID字段 -->
<plugin type="com.brh.core.plugin.SerializablePlugin">
<property name="suppressJavaInterface" value="false"/>
</plugin>
<!-- 生成的代码去掉注释 -->
<commentGenerator type="com.brh.core.plugin.CommentGenerator">
<property name="suppressAllComments" value="true" />
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 数据库连接 -->
<jdbcConnection driverClass="${generator.jdbc.driver}"
connectionURL="${generator.jdbc.url}"
userId="${generator.jdbc.username}"
password="root" />
<!-- model生成 -->
<javaModelGenerator targetPackage="com.brh.core.bean" targetProject="src/main/java" />
<!-- MapperXML生成 -->
<sqlMapGenerator targetPackage="com.brh.core.dao" targetProject="src/main/java" />
<!-- Mapper接口生成 -->
<javaClientGenerator targetPackage="com.brh.core.dao" targetProject="src/main/java" type="XMLMAPPER" />
<!-- 需要映射的表 -->
<table tableName="forward_record"
domainObjectName="ForwardRecord"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="MySql" identity="true" />
</table>
<table tableName="user_play_record"
domainObjectName="UserPlayRecord"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="MySql" identity="true" />
</table>
<table tableName="user_prize_record"
domainObjectName="UserPrizeRecord"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
<property name="useActualColumnNames" value="true"/>
<generatedKey column="id" sqlStatement="MySql" identity="true" />
</table>
</context>
</generatorConfiguration>
1. 配置文件头
<?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" >
2. 根节点<generatorConfiguration>
generatorConfiguration节点没有任何属性,直接写节点即可,如下:
<generatorConfiguration>
<!-- 具体配置内容 -->
</generatorConfiguration>
3. <generatorConfiguration>子元素
从这段开始,就是配置的主要内容,这些配置都是generatorConfiguration元素的子元素。
包含以下子元素(有严格的顺序):
1. <properties> (0个或1个)
2. <classPathEntry> (0个或多个)
3. <context> (1个或多个)
3.1 <properties> 元素
这个元素用来指定外部的属性元素,不是必须的元素。
元素用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用 ${property}这种形式的引用,通过这种方式引用属性文件中的属性值。 对于后面需要配置的**jdbc信息**和targetProject属性会很有用。
这个属性可以通过resource或者url来指定属性文件的位置,这两个属性只能使用其中一个来指定,同时出现会报错。
* resource:指定**classpath**下的属性文件,使用类似com/myproject/generatorConfig.properties这样的属性值。
* url:可以指定文件系统上的特定位置,例如file:///C:/myfolder/generatorConfig.properties
3.2 <classPathEntry> 元素
这个元素可以0或多个,不受限制。
最常见的用法是通过这个属性指定驱动的路径,例如:
<classPathEntry location="D:\software\lib\mysql-connector-java-5.1.21.jar" />
3.3 <context> 元素
在MBG的配置中,至少需要有一个<context>元素。
<context>元素用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的<context>。
该元素只有一个**必选属性**id,用来唯一确定一个<context>元素,该id属性可以在运行MBG的使用。
此外还有几个**可选属性**:
* defaultModelType:**这个属性很重要**,这个属性定义了MBG如何生成**实体类**。
这个属性有以下可选值:
* conditional:*这是默认值*,这个模型和下面的hierarchical类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。 因此,如果一个表 的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
* flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。**这种模型最简单,推荐使用。**
* hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然 后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。
* targetRuntime:此属性用于指定生成的代码的运行时环境。该属性支持以下可选值:
* MyBatis3:*这是默认值*
* MyBatis3Simple
* Ibatis2Java2
* Ibatis2Java5 一般情况下使用默认值即可,有关这些值的具体作用以及区别请查看中文文档的详细内容。
一般情况下,我们使用如下的配置即可:
<context id="Mysql" defaultModelType="flat">
如果你希望不生成和Example查询有关的内容,那么可以按照如下进行配置:
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
使用MyBatis3Simple可以避免在后面的<table>中逐个进行配置(后面会提到)。
MBG配置中的其他几个元素,基本上都是<context>的子元素,这些子元素(有严格的配置顺序)包括:
* <property> (0个或多个)
* <plugin> (0个或多个)
* <commentGenerator> (0个或1个)
* <jdbcConnection> (1个)
* <javaTypeResolver> (0个或1个)
* <javaModelGenerator> (1个)
* <sqlMapGenerator> (0个或1个)
* <javaClientGenerator> (0个或1个)
* <table> (1个或多个)
其中<property>属性比较特殊,后面讲解的时候都会和父元素一起进行讲解。在讲解<property>属性前,我们先看看**什么是分隔符?**。
这里通过一个例子说明。假设在MySQL数据库中有一个表名为user info,你没有看错,中间是一个空格,这种情况下如果写出select * from user info这样的语句,肯定是要报错的,在Mysql中的时候我们一般会写成如下的样子:
select * from `user info`
这里的使用的**反单引号(`)**就是**分隔符**,**分隔符**可以用于**表名**或者**列名**。
下面继续看<property>支持的属性:
* autoDelimitKeywords
* beginningDelimiter
* endingDelimiter
* javaFileEncoding
首先是autoDelimitKeywords,当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段名添加**分隔符**。
然后这里继续上面的例子来讲beginningDelimiter和endingDelimiter属性。
由于beginningDelimiter和endingDelimiter的默认值为双引号("),在Mysql中不能这么写,所以还要将这两个默认值改为**反单引号(`)**,配置如下:
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
属性javaFileEncoding设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到。
3.3.1 <plugin> 元素
该元素可以配置0个或者多个,不受限制。
<plugin>元素用来定义一个插件。插件用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码。
插件将按在配置中配置的顺序执行。
<!-- 为生成的Java模型创建一个toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<!-- Java模型生成equals和hashcode方法 -->
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
3.3.2 <commentGenerator> 元素
该元素最多可以配置1个。
这个元素非常有用,相信很多人都有过这样的需求,就是希望MBG生成的代码中可以包含**注释信息**,具体就是生成表或字段的备注信息。
使用这个元素就能很简单的实现我们想要的功能。这里先介绍该元素,介绍完后会举例如何扩展实现该功能。
该元素有一个可选属性type,可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator接口。
而且必有一个默认的构造方法。这个属性接收默认的特殊值DEFAULT,会使用默认的实现类org.mybatis.generator.internal.DefaultCommentGenerator。
默认的实现类中提供了两个可选属性,需要通过<property>属性进行配置。
* suppressAllComments:**阻止**生成注释,默认为false
* suppressDate:**阻止**生成的注释包含时间戳,默认为false
一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用**版本控制**的时候每次都会提交,因而一般情况下我们都会屏蔽注释信息,可以如下配置:
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
接下来我们简单举例实现生成包含表字段注释信息的注释
因为系统提供了一个默认的实现类,所以对我们来说,自己实现一个会很容易,最简单的方法就是复制默认实现类代码到一个新的文件中,修改类名如MyCommentGenerator,在你自己的实现类中,你可以选择是否继续支持上面的两个属性,你还可以增加对其他属性的支持。
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().equals("")) {
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
addJavadocTag(field, false);
field.addJavaDocLine(" */");
}
}
这个方法是给字段添加注释信息的,其中IntrospectedColumn包含了字段的完整信息,通过getRemarks方法可以获取字段的注释信息。上面这个方法修改起来还是很容易的。除了字段的注释外还有Getter和Setter,以及类的注释。
3.3.3 <jdbcConnection> 元素
<jdbcConnection>用于指定数据库连接信息,该元素必选,并且只能有一个。
配置该元素只需要注意如果JDBC驱动不在**classpath**下,就需要通过<classPathEntry>元素引入jar包,这里**推荐**将jar包放到**classpath**下。
该元素有两个必选属性:
* driverClass:访问数据库的JDBC驱动程序的完全限定类名
* connectionURL:访问数据库的JDBC连接URL
该元素还有两个可选属性:
* userId:访问数据库的用户ID
* password:访问数据库的密码
此外该元素还可以接受多个<property>子元素,这里配置的<property>属性都会添加到JDBC驱动的属性中。
这个元素配置起来最容易,这里举个简单例子:
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
userId="root"
password="">
</jdbcConnection>
3.3.4 <javaTypeResolver> 元素
这个元素的配置用来指定JDBC类型和Java类型如何转换。
可以配置的属性为forceBigDecimals,该属性可以控制是否强制DECIMAL和NUMERIC类型的字段转换为Java类型的java.math.BigDecimal,默认值为false,一般不需要配置。
<javaTypeResolver >
<property name="forceBigDecimals" value="true" />
</javaTypeResolver>
3.3.5 <javaModelGenerator> 元素
该元素必须配置一个,并且最多一个。
该元素用来控制生成的实体类
该元素只有两个属性,都是必选的。
* targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(<table>中会提到)。
* targetProject:指定目标项目路径,使用的是文件系统的绝对路径。
3.3.6 <sqlMapGenerator> 元素
该元素只有两个属性(和前面提过的<javaModelGenerator>的属性含义一样),都是必选的。
* targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(<table>中会提到)。
* targetProject:指定目标项目路径,使用的是文件系统的绝对路径。
3.3.7 <javaClientGenerator> 元素
该元素可选,最多配置一个。
如果不配置该元素,就不会生成Mapper接口。
该元素有3个必选属性:
type:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator类,必选有一个默认的构造方法。 该属性提供了以下预定的代码生成器,首先根据<context>的targetRuntime分成三类:
* MyBatis3:
* ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
* MIXEDMAPPER:XML和注解的混合形式,(上面这种情况中的)SqlProvider注解方法会被XML替代。
* XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
* MyBatis3Simple:
* ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
* XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(<table>中会提到)。
targetProject:指定目标项目路径,使用的是文件系统的绝对路径。
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"
targetProject="E:\MyProject\src\main\java"/>
3.3.8 <table> 元素
该元素至少要配置一个,可以配置多个。
该元素用来配置要通过内省的表。只有配置的才会生成实体类和其他文件。
该元素有一个必选属性:
* tableName:指定要生成的表名,可以使用SQL通配符匹配多个表。
例如要生成全部的表,可以按如下配置:
<table tableName="%" />
该元素包含多个可选属性:
* schema:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如schema.tableName的形式。
* domainObjectName:生成对象的基本名称。如果没有指定,MBG会自动根据表名来生成名称。
* enableXXX:XXX代表多种SQL方法,该属性用来指定是否生成对应的XXX语句。
* selectByExampleQueryId:该属性用来指定是否生成对应的selectByExampleQueryId语句。
下面对这4个元素进行详细讲解。
1. <generatedKey> 元素
这个元素最多可以配置一个。
这个元素用来指定自动生成主键的属性(identity字段或者sequences序列)。如果指定这个元素,MBG在生成insert的SQL映射文件中插入一个<selectKey>元素。 这个元素**非常重要**,这个元素包含下面两个必选属性:
* column:生成列的列名。
* sqlStatement:将返回新值的 SQL 语句。如果这是一个identity列,您可以使用其中一个预定义的的特殊值。预定义值如下:
* Cloudscape
* DB2
* DB2_MF
* Derby
* HSQLDB
* Informix
* MySql
* SqlServer
* SYBASE
* JDBC
这会配置MBG使用MyBatis3支持的JDBC标准的生成key来生成代码。 这是一个独立于数据库获取标识列中的值的方法。 重要: 只有当目标运行为MyBatis3时才会产生正确的代码。 如果与iBATIS2一起使用目标运行时会产生运行时错误的代码
* identity:当设置为true时,该列会被标记为identity列, 并且<selectKey>元素会被插入在insert后面。 当设置为false时,<selectKey>会插入到insert之前(通常是序列)
<property name="useActualColumnNames" value="true"/>
* 使用列名作为属性名
MybatisGeneratorUtil.Java示例:
package com.brh.core.util;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
public class MybatisGeneratorUtil{
public static void main(String[] args) {
try {
System.out.println("start generator ...");
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File(MybatisGeneratorUtil2.class.getResource("/generatorConfig.xml").getFile());
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);
for (String warning : warnings) {
System.out.println(warning);
}
System.out.println("end generator!");
} catch (IOException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
} catch (InvalidConfigurationException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
* 直接使用mybatis-generator-core-1.3.2.jar也可以 指定数据库驱动包位置 -configfile generator.xml配置文件 -overwrite 覆盖