您的位置:首页 > 编程语言

mybatis-genarator 自定义插件

2016-09-20 13:09 423 查看
摘要: 一些mybatis-generator 的自定义插件: 分页插件(支持mysql oracle),自定义序列化插件,取消Example的生成,改为额外的selectCountByMap selectListByMap 两种方法进行代替, 增加自定义注释部分(表结构注释,列注释) 数据库表结构注释代码生成实体类

http://git.oschina.net/alexgaoyh/MutiModule-parent

一些自定义的mybatis-generator 代码生成器部分的插件:

1、自定义的序列化 类文件 插件 ;

2、mysql oracle 两种数据源的分页配置插件 根据 _databaseId 的区别来区分当前数据源是oracle还是mysql,方便数据迁移过程中的分页逻辑不报错;

3、取消 Example 类文件的生成,在进行代码生成器的过程中,生成 selectCountByMap selectListByMap 两种方法,代替 Example 方法的生成 ;

4、自定义注释部分(实体类entity生成过程中,将配置的数据库部分的注释部分生成,关键节点的注解部分生成);

取消 Example 类的生成,改为自定义生成 selectCountByMap selectListByMap 两个方法来替代(原因为生成 Example类的情况下,代码重用度过低,不好进行维护操作);

取消使用分页插件对mybatis 进行分页操作,而是通过使用 代码生成器生成对应的 sql段落,通过 _databaseId 进行数据源部分的区分;

如果数据库的表结构设计部分包含大量的注释(ramark)部分,那么在生成实体类过程中,将这一部分数据库表结构的注释部分加上,这样的话,有助于理解各个字段的含义;

<?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" >
<!--  每次修改的部分为替换  targetPackage tableName 部分,对应数据库不同的表结构,不同的包名,自动映射出来相关的类文件  -->
<!--  注意如果是单表结构的逻辑,增加 两个自定义插件,并且必须有 id deleteFlag createTime 表字段   -->
<!--  如果为关联关系的表结构,注释掉两个自定义插件,并且关联关系的两个表字段,设定为复合主键,之后生成的实体类型,默认为 Key 后缀的主键名称   -->
<generatorConfiguration>

<!-- 引入配置文件 -->
<properties resource="mybatis-generator.properties"/>

<classPathEntry location="${classPath}" />

<context id="context1" targetRuntime="MyBatis3">

<!-- 由于beginningDelimiter和endingDelimiter的默认值为双引号("),在Mysql中不能这么写,所以还要将这两个默认值改为**反单引号(`)**,配置如下:  -->
<property name="beginningDelimiter" value=""/>
<property name="endingDelimiter" value=""/>

<!-- 这个插件用来在XXXExample类中生成大小写敏感的LIKE方法 -->
<!-- <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"></plugin>   -->

<!-- 这个插件主要用来为生成的Java模型类添加序列化接口,并生成serialVersionUID字段; -->
<!-- <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin> -->

<!-- 为生成的Java模型创建一个toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>

<!-- page plugin && add deleteLogicByIds method  -->
<!-- 单表逻辑的话, 可以增加下面的两个两个自定义插件,关联关系的话,建议注释掉如下的两个插件-->
<!-- <plugin type="com.MutiModule.common.mybatis.plugin.PaginationPlugin"></plugin>
<plugin type="com.MutiModule.common.mybatis.plugin.DeleteLogicByIdsPlugin"></plugin> -->

<!--  自定义的序列化 类文件 插件 -->
<plugin type="com.MutiModule.common.mybatis.plugin.serializable.SerializablePlugin"></plugin>

<!-- mysql oracle 两种数据源的分页配置插件 根据 _databaseId 的区别来区分当前数据源是oracle还是mysql,方便数据迁移过程中的分页逻辑不报错 -->
<plugin type="com.MutiModule.common.mybatis.plugin.mutiDatasource.MutiDatasourcePaginationPlugin"></plugin>

<!-- 取消 Example 类文件的生成,在进行代码生成器的过程中,生成 selectCountByMap selectListByMap 两种方法,代替 Example 方法的生成 -->
<plugin type="com.MutiModule.common.mybatis.plugin.SelectCountAndListByMapPlugin"></plugin>

<!-- 自定义注释部分(实体类entity生成过程中,将配置的数据库部分的注释部分生成,关键节点的注解部分生成) -->
<plugin type="com.MutiModule.common.mybatis.plugin.MyTableAnnotationPlugin"></plugin>

<!-- 自定义 注释部分,增加字段方面的注释 -->
<commentGenerator type="com.MutiModule.common.mybatis.plugin.MyCommentGeneratorPlugin">
<property name="suppressAllComments" value="true" />
</commentGenerator>

<jdbcConnection driverClass="${driverClass}"
connectionURL="${connectionURL}"
userId="${userId}" password="${password}" />

<javaModelGenerator targetPackage="${targetPackageBase}.${myBussinessPackage}" targetProject="${targetProject}\src\main\java" >
<!-- alexgaoyh 20160602 增加基础bean的继承操作,将通用属性集成到BaseEntity内部 -->
<property name="rootClass" value="com.MutiModule.common.mybatis.base.BaseEntity"/>
</javaModelGenerator>

<sqlMapGenerator targetPackage="${targetPackageBase}.${myBussinessPackage}" targetProject="${targetProject}\src\main\resources" />

<javaClientGenerator targetPackage="${targetPackageBase}.${myBussinessPackage}" targetProject="${targetProject}\src\main\java" type="XMLMAPPER" />

<!-- domainObjectName 部分,如果不加的话,好像数据库表结构是驼峰式的话,生成的*。java类文件不是驼峰式的结构,故加上这个配置部分 -->
<!-- table 中增加属性 alias 部分,这一部分的设定,用来给表结构增加别名,如果出现关联查询的情况下,可以通过设定表结构的别名,来避免  Oracle00-918:未明确定义列的错误 -->
<!-- alias:如果指定,这个值会用在生成的select查询SQL的表的别名和列名上。 列名会被别名为 alias_actualColumnName(别名_实际列名) 这种模式。 -->
<!-- 选择一个table来生成相关文件,可以有一个或多个table,必须要有table元素
选择的table会生成一下文件:
1,SQL map文件
2,生成一个主键类;
3,除了BLOB和主键的其他字段的类;
4,包含BLOB的类;
5,一个用户生成动态查询的条件类(selectByExample, deleteByExample),可选;
6,Mapper接口(可选)

tableName(必要):要生成对象的表名;
注意:大小写敏感问题。正常情况下,MBG会自动的去识别数据库标识符的大小写敏感度,在一般情况下,MBG会
根据设置的schema,catalog或tablename去查询数据表,按照下面的流程:
1,如果schema,catalog或tablename中有空格,那么设置的是什么格式,就精确的使用指定的大小写格式去查询;
2,否则,如果数据库的标识符使用大写的,那么MBG自动把表名变成大写再查找;
3,否则,如果数据库的标识符使用小写的,那么MBG自动把表名变成小写再查找;
4,否则,使用指定的大小写格式查询;
另外的,如果在创建表的时候,使用的""把数据库对象规定大小写,就算数据库标识符是使用的大写,在这种情况下也会使用给定的大小写来创建表名;
这个时候,请设置delimitIdentifiers="true"即可保留大小写格式;

可选:
1,schema:数据库的schema;
2,catalog:数据库的catalog;
3,alias:为数据表设置的别名,如果设置了alias,那么生成的所有的SELECT SQL语句中,列名会变成:alias_actualColumnName
4,domainObjectName:生成的domain类的名字,如果不设置,直接使用表名作为domain类的名字;可以设置为somepck.domainName,那么会自动把domainName类再放到somepck包里面;
5,enableInsert(默认true):指定是否生成insert语句;
6,enableSelectByPrimaryKey(默认true):指定是否生成按照主键查询对象的语句(就是getById或get);
7,enableSelectByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询语句;
8,enableUpdateByPrimaryKey(默认true):指定是否生成按照主键修改对象的语句(即update);
9,enableDeleteByPrimaryKey(默认true):指定是否生成按照主键删除对象的语句(即delete);
10,enableDeleteByExample(默认true):MyBatis3Simple为false,指定是否生成动态删除语句;
11,enableCountByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询总条数语句(用于分页的总条数查询);
12,enableUpdateByExample(默认true):MyBatis3Simple为false,指定是否生成动态修改语句(只修改对象中不为空的属性);
13,modelType:参考context元素的defaultModelType,相当于覆盖;
14,delimitIdentifiers:参考tableName的解释,注意,默认的delimitIdentifiers是双引号,如果类似MYSQL这样的数据库,使用的是`(反引号,那么还需要设置context的beginningDelimiter和endingDelimiter属性)
15,delimitAllColumns:设置是否所有生成的SQL中的列名都使用标识符引起来。默认为false,delimitIdentifiers参考context的属性

注意,table里面很多参数都是对javaModelGenerator,context等元素的默认属性的一个复写;
-->
<table schema="" tableName="${tableName}" domainObjectName="${domainObjectName}" delimitAllColumns="true"
alias="${alias}" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">

<!-- 生成的实体类字段和数据库表结构中的字段一致 -->
<!-- <property name="useActualColumnNames" value="true" /> -->

<!-- 数据库生成的主键id,用来指定自动生成主键的属性(identity字段或者sequences序列)。如果指定这个元素,MBG在生成insert的SQL映射文件中插入一个<selectKey>元素 -->
<!-- 单元测试的话 ,使用 demoMapper.insert(demo); 之后,调用  demo。getId() 即可获取到当前的id集合-->
<!-- <generatedKey column="id" sqlStatement="Mysql" identity="true" type="post"/>

-->
<columnOverride column="delete_flag" property="deleteFlag"
javaType="com.MutiModule.common.vo.enums.DeleteFlagEnum" typeHandler="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.enums.handler.DeleteFlagEnumHandler"></columnOverride>
<columnOverride column="create_time" property="createTime"
typeHandler="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.GMT.handler.GMTDateTransHandler"/>
<!-- 生成代码字段名默认按驼峰命名, 单表逻辑的话, id createTime deleteFlag 三个字段为必须的,关联关系表结构的话,要注释掉如下的三个字段 -->
<columnOverride column="resource_type" property="resourceType"
javaType="com.MutiModule.common.vo.enums.MenuResourceTypeEnum" typeHandler="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.enums.handler.MenuResourceTypeEnumHandler"></columnOverride>

</table>

</context>

</generatorConfiguration>


部分生成效果展示:

@MyBatisTableAnnotation(name = "demo_attachment", namespace = "com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.manager.demo.upload.DemoAttachmentMapper", remarks = "测试模块-文件上传 ", aliasName = "demo_attachment demo_attachment")
public class DemoAttachment extends BaseEntity implements Serializable {
/**
* 名称,所属表字段为demo_attachment.NAME
*/
@MyBatisColumnAnnotation(name = "NAME", value = "demo_attachment_NAME", chineseNote = "名称", tableAlias = "demo_attachment")
private String name;

private static final long serialVersionUID = 1L;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", name=").append(name);
sb.append("]");
return sb.toString();
}
}


import com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.manager.demo.upload.DemoAttachment;
import java.util.List;
import java.util.Map;

public interface DemoAttachmentMapper {
int deleteByPrimaryKey(String id);

int selectCountByMap(Map<Object, Object> map);

List<DemoAttachment> selectListByMap(Map<Object, Object> map);

int insert(DemoAttachment record);

int insertSelective(DemoAttachment record);

DemoAttachment selectByPrimaryKey(String id);

int updateByPrimaryKeySelective(DemoAttachment record);

int updateByPrimaryKey(DemoAttachment record);
}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper
namespace="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.manager.demo.upload.DemoAttachmentMapper">
<resultMap id="BaseResultMap"
type="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.manager.demo.upload.DemoAttachment">
<id column="demo_attachment_ID" property="id" jdbcType="VARCHAR" />
<result column="demo_attachment_DELETE_FLAG" property="deleteFlag"
jdbcType="VARCHAR"
typeHandler="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.enums.handler.DeleteFlagEnumHandler" />
<result column="demo_attachment_CREATE_TIME" property="createTime"
jdbcType="VARCHAR"
typeHandler="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.GMT.handler.GMTDateTransHandler" />
<result column="demo_attachment_NAME" property="name" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List">
demo_attachment.ID as demo_attachment_ID,
demo_attachment.DELETE_FLAG as
demo_attachment_DELETE_FLAG,
demo_attachment.CREATE_TIME as demo_attachment_CREATE_TIME,
demo_attachment.NAME as
demo_attachment_NAME
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap"
parameterType="java.lang.String">
select
<include refid="Base_Column_List" />
from demo_attachment demo_attachment
where demo_attachment.ID =
#{id,jdbcType=VARCHAR}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.String">
delete from
demo_attachment
where ID = #{id,jdbcType=VARCHAR}
</delete>
<insert id="insert"
parameterType="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.manager.demo.upload.DemoAttachment">
insert into demo_attachment (ID, DELETE_FLAG,
CREATE_TIME,
NAME)
values (#{id,jdbcType=VARCHAR},
#{deleteFlag,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.enums.handler.DeleteFlagEnumHandler},
#{createTime,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.GMT.handler.GMTDateTransHandler},
#{name,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective"
parameterType="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.manager.demo.upload.DemoAttachment">
insert into demo_attachment
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
ID,
</if>
<if test="deleteFlag != null">
DELETE_FLAG,
</if>
<if test="createTime != null">
CREATE_TIME,
</if>
<if test="name != null">
NAME,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=VARCHAR},
</if>
<if test="deleteFlag != null">
#{deleteFlag,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.enums.handler.DeleteFlagEnumHandler},
</if>
<if test="createTime != null">
#{createTime,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.GMT.handler.GMTDateTransHandler},
</if>
<if test="name != null">
#{name,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective"
parameterType="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.manager.demo.upload.DemoAttachment">
update demo_attachment
<set>
<if test="deleteFlag != null">
DELETE_FLAG =
#{deleteFlag,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.enums.handler.DeleteFlagEnumHandler},
</if>
<if test="createTime != null">
CREATE_TIME =
#{createTime,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.GMT.handler.GMTDateTransHandler},
</if>
<if test="name != null">
NAME = #{name,jdbcType=VARCHAR},
</if>
</set>
where ID = #{id,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKey"
parameterType="com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.manager.demo.upload.DemoAttachment">
update demo_attachment
set DELETE_FLAG =
#{deleteFlag,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.enums.handler.DeleteFlagEnumHandler},
CREATE_TIME =
#{createTime,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.GMT.handler.GMTDateTransHandler},
NAME = #{name,jdbcType=VARCHAR}
where ID = #{id,jdbcType=VARCHAR}
</update>
<sql id="OracleDialectPrefix">
<if test="page != null and _databaseId == 'oracle'">
select * from ( select row_.*, rownum rownum_ from (
</if>
</sql>
<sql id="OracleDialectSuffix">
<if test="page != null and _databaseId == 'oracle'">
<![CDATA[ ) row_ ) where rownum_ > #{page.begin} and rownum_ <= #{page.end} ]]>
</if>
</sql>
<sql id="MysqlDialect">
<if test="page != null and _databaseId == 'mysql'">
limit #{page.begin} , #{page.length}
</if>
</sql>
<select id="selectCountByMap" parameterType="map" resultType="int">
select count(*) from demo_attachment demo_attachment
<include refid="Base_Query_Map_Condition" />
</select>
<select id="selectListByMap" parameterType="map" resultMap="BaseResultMap">
<include refid="OracleDialectPrefix" />
select
<include refid="Base_Column_List" />
from demo_attachment demo_attachment
<include refid="Base_Query_Map_Condition" />
order by ID desc
<include refid="OracleDialectSuffix" />
<include refid="MysqlDialect" />
</select>
<sql id="Base_Query_Map_Condition">
<trim prefix="where" prefixOverrides="and | or">
<if test="id != null and id != ''">
demo_attachment.ID = #{id,jdbcType=VARCHAR}
</if>
<if test="deleteFlag != null and deleteFlag != ''">
demo_attachment.DELETE_FLAG =
#{deleteFlag,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.enums.handler.DeleteFlagEnumHandler}
</if>
<if test="createTime != null and createTime != ''">
demo_attachment.CREATE_TIME =
#{createTime,jdbcType=VARCHAR,typeHandler=com.alexgaoyh.MutiModule.Dubbo.RWSeperate.persist.util.GMT.handler.GMTDateTransHandler}
</if>
<if test="name != null and name != ''">
demo_attachment.NAME = #{name,jdbcType=VARCHAR}
</if>
</trim>
</sql>
</mapper>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息