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>