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>