<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-67  評論-522  文章-0  trackbacks-0
        上一篇對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.BaseRecordGenerator61行增加下面這行代碼:
        commentGenerator.addClassComment(topLevelClass, introspectedTable);
        因為mybatis-generator源碼中本來就是不加類注釋的。
        大家都在不同的公司,要求肯定都不一樣,大象沒法滿足所有人,只對該類做了一定程度的修改,姑且把它當做一個示例模板吧,主要是弄明白怎么改就成了。

        mybatis-generator1.3.2版里對生成xmlnamespace作了修改,不再用表名當為namespace的值,而是用包結構+類名+Mapper后綴的形式設置,大象不喜歡這么復雜做法,所以這里需要改一改,只保留類名+Mapper的命名形式。去掉org.mybatis.generator.api.IntrospectedTable類的907行與908行代碼。

        接下來再來說說對大對象類型的處理,mybatis-generator默認會把所有jdbcType為:BINARYBLOBCLOBLONGVARBINARYLONGVARCHARVARBINARY這些類型都作為大對象,反應出來的效果就是生成的pojo類會多一個類名+WithBLOBs.java的文件(含有的大對象個數大于1),而在XML里面也會增加一個idResultMapWithBLOBsresultMap,它繼承BaseResultMap,大象一向喜歡簡單的風格,這看得太不爽了。如果你覺得無所謂,不需要修改,請跳過這段往下看。
        表中的textblob等類型,通過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.IntrospectedColumnjdbcTypeName屬性里,最關鍵的地方到了,IntrospectedColumn類第156行有個isBLOBColumn()方法,它就是用來判斷是否生成xxxWithBLOBs.javaResultMapWithBLOBs的條件。當然mybatis-generator不會這么直接用,它在里面定義了一個Rules接口,由它來統一進行調用。所以我們只需要把isBLOBColumn()里面的代碼都去掉,直接返回false就可以了,再結合配置文件中的columnOverride屬性就能達到目的。
        

        jdbcType指定的值就是生成xmlresult里面對應的類型,javaType與生成的pojo里面屬性類型一致,這里其實可以不定義javaType,但是當數據庫的表字段有的定義為tinyint時,如果不給它指定類型,那么默認生成的java類型就是java.lang.Byte,假如你想轉換類型,而且保證不會超出字段類型的大小限制,那么你可以將它的javaType設為java.lang.Integer
        經過這么一番修改之后,輸出結果已經比較理想了,但是xml文件看上去還是有點問題,元素與元素之間沒空行,看起來好別扭。恩,這里要給它加上空行,所以請找到org.mybatis.generator.api.dom.xml.XmlElement類的getFormattedContent方法,這個方法有個參數:indentLevel,通過名字我們可以很直觀的理解它的作用就是來控制縮進等級,它的初始值為0,這表示不縮進,當變成1時就是縮進一級,也即縮進四個空格,后面以此類推,我們應該還注意到,方法內部用到了遞歸,所以它是從最底元素開始,再一步步返回,所以我們就應該在indentLevel1的元素后面加上換行。
        

        在生成xml的文件里面,我們看到有一個update元素,idupdateByPrimaryKey,這個基本上用不到,但是你還不能在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的布爾值上面。
        

        上面啰嗦了一大堆,現在再來解決之前提到的問題,如何去掉idupdateByPrimaryKeyupdate元素,注釋掉addUpdateByPrimaryKeyWithoutBLOBsElement()或直接去掉這行代碼,跟蹤代碼你會發現,它和addUpdateByPrimaryKeySelectiveElement()rules驗證里面都用到了enableUpdateByPrimaryKey的值。或者你不想采取我說的這個辦法,而是改BaseRulesgenerateUpdateByPrimaryKeyWithoutBLOBs(),讓它直接返回false
        最后大象再嘮叨一句,這些addXXX方法的順序決定了生成xml文件中的元素順序,所以有代碼潔癖的人可以作下調整。
        上一篇加這一篇都是講怎么少量的改動源碼以實現自定義文件輸出,寫的比較凌亂,不是很系統,完全是從實用的角度出發,關鍵還是大象水平有限,有什么錯誤還請大家幫我指出來,謝謝!
        改了這么多,總要看下效果吧,下一篇大象將寫個測試看看生成的結果,然后用maven assembly將它打包生成一個zip,它將包含:
        
        本文為菠蘿大象原創,如要轉載請注明出處。http://m.tkk7.com/bolo
    posted on 2015-03-25 16:33 菠蘿大象 閱讀(26588) 評論(0)  編輯  收藏 所屬分類: mybatis-generator
    主站蜘蛛池模板: 亚洲综合视频在线观看| 国产亚洲福利一区二区免费看| 中文亚洲AV片在线观看不卡| 一级毛片成人免费看a| 免费大片黄手机在线观看| 美女黄频a美女大全免费皮| 国产成人免费全部网站| 亚洲1区2区3区精华液| 在线免费观看国产视频| 亚洲AV综合色区无码一二三区 | 精品国产成人亚洲午夜福利| 18成禁人视频免费网站| 亚洲日韩国产精品无码av| 97免费人妻无码视频| 亚洲日韩看片无码电影| 日本无卡码免费一区二区三区| 美女黄色毛片免费看| 亚洲精品线路一在线观看| 国产性生大片免费观看性| 国产成人亚洲综合无码精品| 无码一区二区三区免费| 亚洲一区二区三区国产精品无码| 91在线视频免费看| 美女隐私免费视频看| 国产亚洲精品岁国产微拍精品| 91香焦国产线观看看免费| 亚洲人成777在线播放| 成年丰满熟妇午夜免费视频| 色网站在线免费观看| 亚洲AV日韩精品久久久久久久| 麻豆视频免费观看| 无码色偷偷亚洲国内自拍| 中文字幕在亚洲第一在线| 37pao成人国产永久免费视频| 亚洲欧美成人综合久久久| www亚洲一级视频com| 免费人成毛片动漫在线播放| 亚洲精品二三区伊人久久| 亚洲色偷拍区另类无码专区| 亚洲黄色片免费看| 农村寡妇一级毛片免费看视频|