mybatis-generator相关(二)

上一篇对 mybatis-generator-core 源码的基础修改做了说明,也能够说是最想改的地方,这一篇将在此基础上再作进一步的修改。
     首先说说上一篇最后提到的关于自定义注释的问题,想实现这个功能就须要修改 org.mybatis.generator.internal.DefaultCommentGenerator 这个类。我将里面一些主要的方法讲下。
     addJavaFileComment(CompilationUnit compilationUnit)
     Java 文件加注释,这个注释是在文件的顶部,也就是 package 上面。
    

     addComment(XmlElement xmlElement)
     给生成的 XML 文件加注释。大象将这个方法清空了,不生成注释。

    addClassComment(InnerClass innerClass,IntrospectedTable introspectedTable)
    Java类的类注释。
    

    请注意红线的getRemarks()方法,这个remarks属性在原来的FullyQualifiedTable里面是没有的,这是大象本身加上去的,就是为了保存表的注释信息。那是在哪里加进去的呢?请看org.mybatis.generator.internal.db.DatabaseIntrospector这个类,大概浏览下就会发现,数据库表以及列的信息读取,类型设置都是由它来完成的,定位到608行,正好这里是个空行,插入几行代码。以下:
    
     这样咱们就取到了表的注释信息,看到这里应该就会明白了吧?
     另外我须要说明的是,想经过 databaseMetaData . getTables() 来得到表注释的童鞋,这个作法是没用的,大象已经试过了,这个结果集里面的 rs.getString( "REMARKS" ) 获得的是一个空字符串,什么都木有。并且大象还想吐槽下,网上一大堆说返回的这个结果集是 10 列,呵呵,是的么?我 debug 了很久发现它仍是只有 5 列,不知道这 10 列是从哪来的,请打印出 10 列的童鞋告之是怎么作的,我用的 mysql 驱动是 5.1.29

     addFieldComment(Field field, IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
     Java 属性注释。注释为空就不给属性添加。
    

     addGetterComment(Method method,IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
     getter 方法加注释。这里添加注释的方法和 Field 同样,大象把这个方法以及 addSetterComment 方法都清空了,由于我比较习惯把注释加到属性上面,若是你习惯在 getter 方法上面加注释能够自行改一下。
     上面这些修改作完后,记得要在 org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator 61 行增长下面这行代码:
     commentGenerator.addClassComment(topLevelClass,  introspectedTable );
     由于 mybatis-generator 源码中原本就是不加类注释的。
     你们都在不一样的公司,要求确定都不同,大象无法知足全部人,只对该类作了必定程度的修改,姑且把它当作一个示例模板吧,主要是弄明白怎么改就成了。

     mybatis-generator 1.3.2 版里对生成 xml namespace 做了修改,再也不用表名当为 namespace 的值,而是用包结构 + 类名 +Mapper 后缀的形式设置,大象不喜欢这么复杂作法,因此这里须要改一改,只保留类名 +Mapper 的命名形式。去掉 org.mybatis.generator.api.IntrospectedTable 类的 907 行与 908 行代码。

     接下来再来讲说对大对象类型的处理, mybatis-generator 默认会把全部 jdbcType 为: BINARY BLOB CLOB LONGVARBINARY LONGVARCHAR VARBINARY 这些类型都做为大对象,反应出来的效果就是生成的 pojo 类会多一个类名 +WithBLOBs.java 的文件 ( 含有的大对象个数大于 1 ) ,而在 XML 里面也会增长一个 id ResultMapWithBLOBs resultMap ,它继承 BaseResultMap ,大象一贯喜欢简单的风格,这看得太不爽了。若是你以为无所谓,不须要修改,请跳过这段往下看。
     表中的 text blob 等类型,经过 databaseMetaData . getColumns() 取出来后,它的 rs.getInt( "DATA_TYPE" ) 值是与 java.sql.Types 对应的。
     text 类型的值: Types. LONGVARCHAR
     blob 类型是 值: Types. LONGVARBINARY
     它用 org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl 解析 java 类型与 jdbc 类型,而后设置到 org.mybatis.generator.api.IntrospectedColumn jdbcTypeName 属性里,最关键的地方到了, IntrospectedColumn 类第 156 行有个 isBLOBColumn() 方法,它就是用来判断是否生成 xxxWithBLOBs.java ResultMapWithBLOBs 的条件。固然 mybatis-generator 不会这么直接用,它在里面定义了一个 Rules 接口,由它来统一进行调用。因此咱们只须要把 isBLOBColumn() 里面的代码都去掉,直接返回 false 就能够了 ,再结合配置文件中的 columnOverride 属性就能达到目的。
    

     jdbcType 指定的值就是生成 xml result 里面对应的类型, javaType 与生成的 pojo 里面属性类型一致,这里其实能够不定义 javaType ,可是当数据库的表字段有的定义为 tinyint 时,若是不给它指定类型,那么默认生成的 java 类型就是 java.lang.Byte ,假如你想转换类型,并且保证不会超出字段类型的大小限制,那么你能够将它的 javaType 设为 java.lang.Integer
     通过这么一番修改以后,输出结果已经比较理想了,可是 xml 文件看上去仍是有点问题,元素与元素之间没空行,看起来好别扭。恩,这里要给它加上空行,因此请找到 org.mybatis.generator.api.dom.xml.XmlElement 类的 getFormattedContent 方法,这个方法有个参数: indentLevel ,经过名字咱们能够很直观的理解它的做用就是来控制缩进等级,它的初始值为 0 ,这表示不缩进,当变成 1 时就是缩进一级,也即缩进四个空格,后面以此类推,咱们应该还注意到,方法内部用到了递归,因此它是从最底元素开始,再一步步返回,因此咱们就应该在 indentLevel 1 的元素后面加上换行。
    

     在生成 xml 的文件里面,咱们看到有一个 update 元素, id updateByPrimaryKey ,这个基本上用不到,可是你还不能在 table 里加上 enableUpdateByPrimaryKey = "false" ,若是你这么作,虽然 updateByPrimaryKey 没有了,但 updateByPrimaryKeySelective 也会消失。因此这时 请看看 org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator 这个类, getSqlMapElement() 里面,有大量的 addXXX 方法,这些方法里面每一个都用到了 Rules 规则来处理是否执行,好比咱们在 table 里面加了 enableDeleteByExample = "false" ,它对应的是 addDeleteByExampleElement() ,而它又调用了 introspectedTable. getRules().generateDeleteByExample() 方法,再进入到 generateDeleteByExample() 里面,咱们能够看到红线部分,上一篇大象讲过,在加载配置文件的时候, TableConfiguration 会将 table 中的这些属性设置到对应的属性里,因此说其实最后仍是回到了判断 enableDeleteByExample 的布尔值上面。
    

     上面啰嗦了一大堆,如今再来解决以前提到的问题,如何去掉 id updateByPrimaryKey update 元素,注释掉 addUpdateByPrimaryKeyWithoutBLOBsElement() 或直接去掉这行代码,跟踪代码你会发现,它和 addUpdateByPrimaryKeySelectiveElement() rules 验证里面都用到了 enableUpdateByPrimaryKey 的值。或者你不想采起我说的这个办法,而是改 BaseRules generateUpdateByPrimaryKeyWithoutBLOBs() ,让它直接返回 false
     最后大象再唠叨一句,这些 addXXX 方法的顺序决定了生成 xml 文件中的元素顺序,因此有代码洁癖的人能够做下调整。
     上一篇加这一篇都是讲怎么少许的改动源码以实现自定义文件输出,写的比较凌乱,不是很系统,彻底是从实用的角度出发,关键仍是大象水平有限,有什么错误还请你们帮我指出来,谢谢!
     改了这么多 ,总要看下效果吧,下一篇大象将写个测试看看生成的结果,而后用 maven  assembly 将它打包生成一个 zip ,它将包含:
    
相关文章
相关标签/搜索