mybatis 逆向工程(MBG)最常用的方式就是通过XML配置的方式来生成文件,这个配置文件告诉MBG:
- 如何去链接数据库
- 生成什么对象以及如何生成对象
- 应该使用那些表去生成相应的对象
下面是MBG配置文件的一个例子,通过对这个配置文件的研究学习来了解页面中的每个元素以及这些元素的属性该如何设值。
<?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="/Program Files/IBM/SQLLIB/java/db2java.zip" />
<context id="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
connectionURL="jdbc:db2:TEST"
userId="db2admin"
password="db2admin">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="test.xml" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
</context>
</generatorConfiguration>
下面是一些需要特别注意的地方
- 这个文件指定使用传统的DB2 CLI驱动去连接数据库,也指定了在哪里可以找到这些驱动。
- 不要强制使用Java Type Resolver来处理BigDecimal类型的字段。这就意味着如果可以使用内置类型(比如,Short,Integer,Long)来取代BigDecimal类型。这样做的目的是为了让数据库的Decimal类型和Number类型更易于处理。
- 在使用java模型生成器的时候应指定子包,意思就是说所生成的java对象类应被放置在一个叫做test.model.db2admin中(因为表是在DB2ADMIN模式中),如果将enableSubPackages 属性设置为false,这个包名应该是test.model.java模型生成器会对所有字符串进行前后取出空格操作,这就意味着对于任何字符串属性的设置都会调用trim方法,当你的数据库返回空格字符串的时候他就会有意义。
- SQL Map生成器应该指定子包。这意味着在本场景中生成的XML文件会被放置在一个叫做test.xml.db2admin的包中,因为这个表是在DB2ADMIN模式中。如果enableSubPackages属性被设置为false。这个包名应是test.xml
- DAO生成器应该使用子包。这意味着在本案例中所生成的DAO类应该被放置在test.dao.db2admin包中,如果enableSubPackage属性被设置为false,这个包名就是test.dao。这个DAO生成器应该生成引用XML配置的mapper接口
- 这个文件仅指定了一个表来生成。但是我们可以指定多个表。下面是关于指定表需要注意的地方
- 所生成的对象是基于Customer的名字(例如:CustomerKey,Customer,CustomerMapper)不是table的表名。
- 实际的列名称将作为对象属性的名称。如果这个属性被设置为false(或者没有指定值),MBG将跳过这个列,也就是不在生成这个列所对应的属性。还有一种情况是这个属性名可能会被<cloumnOverride>元素覆盖。
- 如果数据库的列是一个自动生成的键,并且是唯一主键,如果数据库类型是DB2。这将导致MBG在生成<insert>语句中会生成特殊的<selectKey>元素。这样做是为了让新生成的主键在插入的同时返回主键(需要使用DB2特有的SQL)
- 如果useActualColumnNames 属性被设置为false,DATE_FIELD将被映射到一个startDate的属性,这将会覆盖本场景中默认的DATE_FIELD或dateField名称
- FRED标识的列会被忽略掉,不会有SQL来列出这个字段,同时也不会生成相应的java属性。
- LONG_VARCHAR_FIELD标识的字段将会被作为VARCHAR类型来处理,忽视其实际的数据类型