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 ,它將包含:
    
相關文章
相關標籤/搜索