mybatis-genarator 自定义插件
mybatis-genarator 自定义插件
alexgaoyh 发表于2年前
mybatis-genarator 自定义插件
  • 发表于 2年前
  • 阅读 2486
  • 收藏 7
  • 点赞 0
  • 评论 1

【腾讯云】买域名送云解析+SSL证书+建站!>>>   

摘要: 一些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>

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 73
博文 81
码字总数 64562
作品 1
评论 (1)
itxx2016
呵呵,这个已经out了.
推荐国内最著名的mybatis代码生成网站 --- fwjava.com
无需任何安装配置,直接在线生成,且十分规范好用.
×
alexgaoyh
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: