`

用Maven插件生成Mybatis代码

阅读更多

在pom.xml增加以下插件:

<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>
</plugin>

1.3.2版本,才能取消注释。 

配置好Maven插件,下面需要配置插件需要的配置文件

<?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:\repo\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar" />
    <context id="context1" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://xxxxxxx:8406/CL_DEMO?useUnicode=true&amp;characterEncoding=UTF-8"
            userId="root" password="password" />
        <javaModelGenerator targetPackage="xxx.account.model"
            targetProject="D:\workspace\项目名\src\main\java" />
        <sqlMapGenerator targetPackage="xxxx.account.persistence"
            targetProject="D:\workspace\项目名\包名\src\main\resources" />
        <javaClientGenerator targetPackage="xxxx.account.persistence
            targetProject="D:\\workspace\项目名\src\main\java" type="XMLMAPPER" />
        <table schema="CL_DEMO" tableName="tb_user" />
        <table schema="CL_DEMO" tableName="tb_role" />
        <table schema="CL_DEMO" tableName="tb_permission" />
        <table schema="CL_DEMO" tableName="tb_role_user" />
        <table schema="CL_DEMO" tableName="tb_permission_role" />
    </context>
</generatorConfiguration>

 插件默认会读到src/main/resources目录下的generatorConfig.xml 文件。

 

如果是在eclipse中,选择pom.xml文件,击右键先择Run AS——>Maven Build… ——>在Goals框中输入:mybatis-generator:generate 

如果在命令行输入Maven命令即可,注意:一定是当前项目目录下运行该命令:

mvn mybatis-generator:generate

 

generatorConfig配置项说明

<context>元素

在MBG的配置中,至少需要有一个<context>元素。

<context>元素用于指定生成一组对象的环境。

例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的<context>。

该元素只有一个必选属性id,用来唯一确定一个<context>元素,该id属性可以在运行MBG的使用。

此外还有几个可选属性:

defaultModelType:**这个属性很重要**,这个属性定义了MBG如何生成**实体类**。

targetRuntime:此属性用于指定生成的代码的运行时环境。

 

<javaTypeResolver> 元素

这个元素的配置用来指定JDBC类型和Java类型如何转换。

该属性有一个可以配置的<property>元素。

可以配置的属性为forceBigDecimals,该属性可以控制是否强制DECIMAL和NUMERIC类型的字段转换为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

如果设置为true,那么一定会使用java.math.BigDecimal,配置示例如下:

<javaTypeResolver >

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

</javaTypeResolver>

 

<javaClientGenerator> 元素用于生成Mapper接口。

type:type=XMLMAPPER所有的方法都在XML中,接口调用依赖XML文件。

targetPackage:生成实体类存放的包名,一般就是放在该包下。

targetProject:指定目标项目路径,使用的是文件系统的绝对路径。

trimStrings:是否对数据库查询结果进行trim操作,如果设置为true就会生成类似这样public void setUsername(String username) {this.username = username == null ? null : username.trim();}的setter方法。默认值为false。

 

<table> 该元素用来配置要通过内省的表。只有配置的表才会生成实体类和其他文件。

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

<update id="updateByExample" parameterType="map">
update lk_user
set id = #{record.id,jdbcType=NUMERIC},
  account = #{record.account,jdbcType=VARCHAR},
  password = #{record.password,jdbcType=VARCHAR},
  is_removed = #{record.isRemoved,jdbcType=CHAR},
  gmt_create = #{record.gmtCreate,jdbcType=TIMESTAMP},
  gmt_modified = #{record.gmtModified,jdbcType=TIMESTAMP},
  creator_id = #{record.creator,jdbcType=NUMERIC},
  modifier_id = #{record.modifier,jdbcType=NUMERIC}
<if test="_parameter != null">
  <include refid="Update_By_Example_Where_Clause" />
</if>
</update>

 

<table>元素的子元素

<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一起使用目标运行时会产生运行时错误的代码。

这个元素还包含两个可选属性:

配置示例一:

<table tableName="user login info" domainObjectName="UserLoginInfo">
    <generatedKey column="id" sqlStatement="Mysql"/>
</table>

 

对应的生成的结果:

<insert id="insert" parameterType="test.model.UserLoginInfo">
    <selectKey keyProperty="id" order="BEFORE" 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>

 

这个插件,有很多地方需要自定义。

例如,删除操作,它使用的是物理删除,一般我们都使用逻辑删除。

我们可以通过修改源码,然个性化生成的代码。

IntrospectedTableMyBatis3Impl  true属性是用来控制是否合并生成xml文件,这里显然默认就是合并

XMLMapperGenerator增加后缀Ext

OutputUtilities更改xml空格

UpdateByPrimaryKeySelectiveElementGenerator 增加is_delete=n

SelectByPrimaryKeyElementGenerator 增加is_delete=n

修改DeleteByPrimaryKeyMethodGenerator,可以修改delete方法的入参

 

大对象类型的处理:

mybatis-generator默认会把所有jdbcType为:BINARY、BLOB、CLOB、LONGVARBINARY、LONGVARCHAR、VARBINARY这些类型都作为大对象,

反应出来的效果就是生成的pojo类会多一个类名+WithBLOBs.java的文件(含有的大对象个数大于1时),

而在XML里面也会增加一个id为ResultMapWithBLOBs的resultMap,它继承BaseResultMap。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics