PAP 快速開發框架:mybatis-genarator分頁查詢插件

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

一些自定義的mybatis-generator 代碼生成器部分的插件:mysql

    一、自定義的序列化 類文件 插件 ;git

    二、mysql oracle 兩種數據源的分頁配置插件 根據 _databaseId 的區別來區分當前數據源是oracle仍是mysql,方便數據遷移過程當中的分頁邏輯不報錯;sql

    三、取消 Example 類文件的生成,在進行代碼生成器的過程當中,生成 selectCountByMap selectListByMap 兩種方法,代替 Example 方法的生成 ;數據庫

    四、自定義註釋部分(實體類entity生成過程當中,將配置的數據庫部分的註釋部分生成,關鍵節點的註解部分生成); mybatis

 

    取消 Example 類的生成,改成自定義生成 selectCountByMap selectListByMap 兩個方法來替代(緣由爲生成 Example類的狀況下,代碼重用度太低,很差進行維護操做);oracle

    取消使用分頁插件對mybatis 進行分頁操做,而是經過使用 代碼生成器生成對應的 sql段落,經過 _databaseId  進行數據源部分的區分;app

    若是數據庫的表結構設計部分包含大量的註釋(ramark)部分,那麼在生成實體類過程當中,將這一部分數據庫表結構的註釋部分加上,這樣的話,有助於理解各個字段的含義;dom

<?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>

 

部分生成效果展現:ide

@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>
相關文章
相關標籤/搜索