MyBatis Eclipse插件安装
1、在线安装generator插件
打开eclipse,点击Help>Software Update
选择 "Available Software" 标签,点击 "Add Site" 按钮
输入以下信息:
Location:
点击ok,自动进入 "mybatis generator Feature"
点击“install”按钮进行安装。。。。mybatis generator 插件安装完成
2、离线安装generator插件
参看:
简单来说直接把下载来的文件解压缩,然后拷贝‘features’和‘plugins’ 文件夹到 ‘eclipse’的安装目录下,重启eclipse就可以了。
3、generator调用
generator插件安装好之后,然后编写生成配置文件generatorConfig.xml(可以是任何名字),eclipse中在这个文件上右键,就有Generate Mybatis/iBatis Artifacts,由此就可以生成代码了。
使用eclipse插件的方式有个不同就是targetProject的配置是项目名开头的,比如其他配置是targetProject="src/main/java",在这里就要是targetProject="项目名/src/main/java"。这里为什么要加上项目名,可能是因为eclipse插件是针对ide的,需要指定ide内是哪个项目。
MyBatis Generator中文文档
MyBatis Generator中文文档地址: 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。 本文使用Markdown进行编辑,但是博客显示效果不好,所以建议 本文是作为个人筹划的《Mybatis最佳实践》(gitbook)其中的一节。 本文中所有节点的链接都是对应的中文文档地址,可以点击查看详细信息。注:本文后面提到的**MBG**全部指代MyBatis Generator。 有4种运行MBG的方法,具体请看文档 MBG下载地址: 后续会专门为gitbook完善此部分 在MBG中,最主要也最重要的就是XML配置文件,因此本篇文章主要的内容就是XML配置。 这里按照配置的顺序对配置逐个讲解,更细的内容可以配合中文文档参照。 1. 配置文件头使用最新版的MBG需要使用上面的xml头,配置文件必须包含上面的 2. 根节点
3. |
该元素包含多个可选属性:
schema
:数据库的schema,可以使用匹配。如果设置了该值,生成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
含义一样,这里可以针对表进行配置,这里的配置会覆盖<context>
的defaultModelType
配置。escapeWildcards
:这个属性表示当查询列,是否对schema和表名中的SQL通配符 ('_' and '%') 进行转义。 对于某些驱动当schema或表名中包含SQL通配符时(例如,一个表名是MY_TABLE,有一些驱动需要将下划线进行转义)是必须的。默认值是false
。delimitIdentifiers
:是否给标识符增加**分隔符**。默认false
。当catalog
,schema
或tableName
中包含空白时,默认为true
。delimitAllColumns
:是否对所有列添加**分隔符**。默认false
。
该元素包含多个可用的<property>
子元素,可选属性为:
constructorBased
:和<javaModelGenerator>
中的属性含义一样。ignoreQualifiersAtRuntime
:生成的SQL中的表名将不会包含schema
和catalog
前缀。immutable
:和<javaModelGenerator>
中的属性含义一样。modelOnly
:此属性用于配置是否为表只生成实体类。如果设置为true
就不会有Mapper接口。如果配置了<sqlMapGenerator>
,并且modelOnly
为true
,那么XML映射文件中只有实体对象的映射元素(<resultMap>
)。如果为true
还会覆盖属性中的enableXXX
方法,将不会生成任何CRUD方法。rootClass
:和<javaModelGenerator>
中的属性含义一样。rootInterface
:和<javaClientGenerator>
中的属性含义一样。runtimeCatalog
:运行时的catalog
,当生成表和运行环境的表的catalog
不一样的时候可以使用该属性进行配置。runtimeSchema
:运行时的schema
,当生成表和运行环境的表的schema
不一样的时候可以使用该属性进行配置。runtimeTableName
:运行时的tableName
,当生成表和运行环境的表的tableName
不一样的时候可以使用该属性进行配置。selectAllOrderByClause
:该属性值会追加到selectAll
方法后的SQL中,会直接跟order by
拼接后添加到SQL末尾。useActualColumnNames
:如果设置为true,那么MBG会使用从数据库元数据获取的列名作为生成的实体对象的属性。 如果为false(默认值),MGB将会尝试将返回的名称转换为驼峰形式。 在这两种情况下,可以通过 元素显示指定,在这种情况下将会忽略这个(useActualColumnNames)属性。useColumnIndexes
:如果是true,MBG生成resultMaps的时候会使用列的索引,而不是结果中列名的顺序。useCompoundPropertyNames
:如果是true,那么MBG生成属性名的时候会将列名和列备注接起来. 这对于那些通过第四代语言自动生成列(例如:FLD22237),但是备注包含有用信息(例如:"customer id")的数据库来说很有用. 在这种情况下,MBG会生成属性名FLD2237_CustomerId。
除了<property>
子元素外,<table>
还包含以下子元素:
- (0个或1个)
- (0个或1个)
- (0个或多个)
- (0个或多个)
下面对这4个元素进行详细讲解。
1. 元素
这个元素最多可以配置一个。
这个元素用来指定自动生成主键的属性(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
之前(通常是序列)。**重要**: 即使您type
属性指定为post
,您仍然需要为identity
列将该参数设置为true
。 这将标志MBG从插入列表中删除该列。默认值是false
。type
:type=post and identity=true
的时候生成的<selectKey>
中的order=AFTER
,当type=pre
的时候,identity只能为false
,生成的<selectKey>
中的order=BEFORE
。可以这么理解,自动增长的列只有插入到数据库后才能得到ID,所以是AFTER
,使用序列时,只有先获取序列之后,才能插入数据库,所以是BEFORE
。
配置示例一:
对应的生成的结果:
SELECT LAST_INSERT_ID() insert into `user login info` (Id, username, logindate, loginip) values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{logindate,jdbcType=TIMESTAMP}, #{loginip,jdbcType=VARCHAR})
配置示例二:
对应的生成结果:
select SEQ_ID.nextval from dual insert into `user login info` (Id, username, logindate, loginip) values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{logindate,jdbcType=TIMESTAMP},#{loginip,jdbcType=VARCHAR})
2. 元素
该元素最多可以配置一个,使用该元素可以在生成列之前,对列进行重命名。这对那些存在同一前缀的字段想在生成属性名时去除前缀的表非常有用。 例如假设一个表包含以下的列:
CUST_BUSINESS_NAME
CUST_STREET_ADDRESS
CUST_CITY
CUST_STATE
生成的所有属性名中如果都包含CUST
的前缀可能会让人不爽。这些前缀可以通过如下方式定义重命名规则:
注意,在内部,MBG使用java.util.regex.Matcher.replaceAll
方法实现这个功能。 请参阅有关该方法的文档和在Java中使用正则表达式的例子。
当<columnOverride>
匹配一列时,这个元素(<columnRenamingRule>
)会被忽略。<columnOverride>
优先于重命名的规则。
该元素有一个必选属性:
searchString
:定义将被替换的字符串的正则表达式。
该元素有一个可选属性:
replaceString
:这是一个用来替换搜索字符串列每一个匹配项的字符串。如果没有指定,就会使用空字符串。
关于<table>
的<property>
属性useActualColumnNames
对此的影响可以查看完整文档。
3. 元素
该元素可选,可以配置多个。
该元素从将某些属性默认计算的值更改为指定的值。
该元素有一个必选属性:
column
:要重写的列名。
该元素有多个可选属性:
property
:要使用的Java属性的名称。如果没有指定,MBG会根据列名生成。 例如,如果一个表的一列名为STRT_DTE
,MBG会根据<table>
的useActualColumnNames
属性生成STRT_DTE
或strtDte
。javaType
:该列属性值为完全限定的Java类型。如果需要,这可以覆盖由JavaTypeResolver
计算出的类型。 对某些数据库来说,这是必要的用来处理**“奇怪的”**数据库类型(例如MySql的unsigned bigint
类型需要映射为java.lang.Object
)。jdbcType
:该列的JDBC类型(INTEGER, DECIMAL, NUMERIC, VARCHAR
等等)。 如果需要,这可以覆盖由JavaTypeResolver
计算出的类型。 对某些数据库来说,这是必要的用来处理怪异的JDBC驱动 (例如DB2的LONGVARCHAR
类型需要为iBATIS 映射为VARCHAR
)。typeHandler
:用户定义的需要用来处理这列的类型处理器。它必须是一个继承iBATIS的TypeHandler
类或TypeHandlerCallback
接口(该接口很容易继承)的全限定的类名。如果没有指定或者是空白,iBATIS会用默认的类型处理器来处理类型。**重要**:MBG不会校验这个类型处理器是否存在或者可用。 MGB只是简单的将这个值插入到生成的SQL映射的配置文件中。delimitedColumnName
:指定是否应在生成的SQL的列名称上增加**分隔符**。 如果列的名称中包含空格,MGB会自动添加**分隔符**, 所以这个重写只有当列名需要强制为一个合适的名字或者列名是数据库中的保留字时是必要的。
配置示例:
4. 元素
该元素可选,可以配置多个。
该元素可以用来屏蔽不需要生成的列。
该元素有一个必选属性:
column
:要忽略的列名。
该元素还有一个可选属性:
delimitedColumnName
:匹配列名的时候是否区分大小写。如果为true
则区分。默认值为false
,不区分大小写。
MyBatis Generator最佳实践
本节内容针对MyBatis3,使用iBATIS的不一定适用。
以下根据个人经验(对此有意见的可以留言)对一些配置看法列出如下几点:
-
关于
Example
方法,Example
方法虽然很强大,但是SQL不易管理,因此不建议使用。 -
取消
Example
方法的配置,通过<table>
上的enablexxExample
方法可以屏蔽,但是最好的方法是在<context>
上设置targetRuntime="MyBatis3Simple"
。 -
关于实体类的
modelType
,建议使用defaultModelType="flat"
,只有一个对象的情况下管理毕竟方便,使用也简单。 -
关于注释
<commentGenerator>
,不管你是否要重写自己的注释生成器,有一点不能忘记,那就是注释中一定要保留@mbggenerated
,MBG通过该字符串来判断代码是否为代码生成器生成的代码,有该标记的的代码在重新生成的时候会被删除,不会重复。不会在XML中出现重复元素。 -
使用MBG生成的代码时,建议尽可能不要去修改自动生成的代码,而且要生成带有
@mbggenerated
,这样才不会在每次重新生成代码的时候需要手动修改好多内容。 -
仍然是注释相关,在
<commentGenerator>
中,建议一定要保留suppressAllComments
属性(使用默认值false
),一定要取消(设为true
)时间戳suppressDate
,避免重复提交SVN。 -
<jdbcConnection>
建议将JDBC驱动放到项目的**classpath**下,而不是使用<classPathEntry>
来引入jar包,主要考虑到所有开发人员的统一性。 -
当数据库字段使用
CHAR
时,建议在<javaModelGenerator>
中设置<property name="trimStrings" value="true" />
,可以自动去掉不必要的空格。 -
在
<javaClientGenerator>
中,建议设置type="XMLMAPPER"
,不建议使用注解或混合模式,比较代码和SQL完全分离易于维护。 -
建议尽可能在
<table>
中配置<generatedKey>
,避免手工操作,以便于MBG重复执行代码生成。
如果有其他有价值的经验,会继续补充。
综合以上信息,这里给出一个Mysql
的简单配置:
<table>
这里用的通配符匹配全部的表,另外所有表都有自动增长的id
字段。如果不是所有表的配置都一样,可以做针对性的配置。
generatorConfig.xm配置文件实例:
<?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="init.properties"/> <!-- 指定数据连接驱动jar地址 --> <classPathEntry location="${classPath}" /> <!-- 一个数据库一个context --> <context id="infoGuardian"> <!-- 注释 --> <commentGenerator > <property name="suppressAllComments" value="false"/><!-- 是否取消注释 --> <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳--> </commentGenerator> <!-- jdbc连接 --> <jdbcConnection driverClass="${jdbc_driver}" connectionURL="${jdbc_url}" userId="${jdbc_user}" password="${jdbc_password}" /> <!-- 类型转换 --> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成实体类地址 --> <javaModelGenerator targetPackage="com.oop.eksp.user.model" targetProject="${project}" > <!-- 是否在当前路径下新加一层schema,eg:fase路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --> <property name="enableSubPackages" value="false"/> <!-- 是否针对string类型的字段在set的时候进行trim调用 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成mapxml文件 --> <sqlMapGenerator targetPackage="com.oop.eksp.user.data" targetProject="${project}" > <!-- 是否在当前路径下新加一层schema,eg:fase路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- 生成mapxml对应client,也就是接口dao --> <javaClientGenerator targetPackage="com.oop.eksp.user.data" targetProject="${project}" type="XMLMAPPER" > <!-- 是否在当前路径下新加一层schema,eg:fase路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 配置表信息 --> <table schema="${jdbc_user}" tableName="s_user" domainObjectName="UserEntity" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> <!-- schema即为数据库名 tableName为对应的数据库表 domainObjectName是要生成的实体类 enable*ByExample 是否生成 example类 --> <!-- 忽略列,不生成bean 字段 --> <ignoreColumn column="FRED" /> <!-- 指定列的java数据类型 --> <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> </table> </context> </generatorConfiguration>
附带上我的init.properties
#Mybatis Generator configuration
project = EKSP classPath=E:/workplace/EKSP/WebContent/WEB-INF/lib/ojdbc14.jar jdbc_driver = oracle.jdbc.driver.OracleDriver jdbc_url=jdbc:oracle:thin::1521:orcl jdbc_user=INFOGUARDIAN jdbc_password=info_idap132