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

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

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

    隨筆-67  評(píng)論-522  文章-0  trackbacks-0
        上一篇對(duì)mybatis-generator-core源碼的基礎(chǔ)修改作了說(shuō)明,也可以說(shuō)是最想改的地方,這一篇將在此基礎(chǔ)上再做進(jìn)一步的修改。
        首先說(shuō)說(shuō)上一篇最后提到的關(guān)于自定義注釋的問(wèn)題,想實(shí)現(xiàn)這個(gè)功能就需要修改org.mybatis.generator.internal.DefaultCommentGenerator這個(gè)類。我將里面一些主要的方法講下。
        addJavaFileComment(CompilationUnit compilationUnit)
        Java文件加注釋,這個(gè)注釋是在文件的頂部,也就是package上面。
        

        addComment(XmlElement xmlElement)
        給生成的XML文件加注釋。大象將這個(gè)方法清空了,不生成注釋。

        addClassComment(InnerClass innerClass,IntrospectedTable introspectedTable)
        Java類的類注釋。
        

        請(qǐng)注意紅線的getRemarks()方法,這個(gè)remarks屬性在原來(lái)的FullyQualifiedTable里面是沒(méi)有的,這是大象自己加上去的,就是為了保存表的注釋信息。那是在哪里加進(jìn)去的呢?請(qǐng)看org.mybatis.generator.internal.db.DatabaseIntrospector這個(gè)類,大概瀏覽下就會(huì)發(fā)現(xiàn),數(shù)據(jù)庫(kù)表以及列的信息讀取,類型設(shè)置都是由它來(lái)完成的,定位到608行,正好這里是個(gè)空行,插入幾行代碼。如下:
        
        這樣我們就取到了表的注釋信息,看到這里應(yīng)該就會(huì)明白了吧?
        另外我需要說(shuō)明的是,想通過(guò)databaseMetaData.getTables()來(lái)獲得表注釋的童鞋,這個(gè)做法是沒(méi)用的,大象已經(jīng)試過(guò)了,這個(gè)結(jié)果集里面的rs.getString("REMARKS")得到的是一個(gè)空字符串,什么都木有。而且大象還想吐槽下,網(wǎng)上一大堆說(shuō)返回的這個(gè)結(jié)果集是10列,呵呵,是的么?我debug了好久發(fā)現(xiàn)它還是只有5列,不知道這10列是從哪來(lái)的,請(qǐng)打印出10列的童鞋告之是怎么做的,我用的mysql驅(qū)動(dòng)是5.1.29

        addFieldComment(Field field, IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
        Java屬性注釋。注釋為空就不給屬性添加。
        

        addGetterComment(Method method,IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
        getter方法加注釋。這里添加注釋的方法和Field一樣,大象把這個(gè)方法以及addSetterComment方法都清空了,因?yàn)槲冶容^習(xí)慣把注釋加到屬性上面,如果你習(xí)慣在getter方法上面加注釋可以自行改一下。
        上面這些修改做完后,記得要在org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator61行增加下面這行代碼:
        commentGenerator.addClassComment(topLevelClass, introspectedTable);
        因?yàn)?/span>mybatis-generator源碼中本來(lái)就是不加類注釋的。
        大家都在不同的公司,要求肯定都不一樣,大象沒(méi)法滿足所有人,只對(duì)該類做了一定程度的修改,姑且把它當(dāng)做一個(gè)示例模板吧,主要是弄明白怎么改就成了。

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

        接下來(lái)再來(lái)說(shuō)說(shuō)對(duì)大對(duì)象類型的處理,mybatis-generator默認(rèn)會(huì)把所有jdbcType為:BINARYBLOBCLOBLONGVARBINARYLONGVARCHARVARBINARY這些類型都作為大對(duì)象,反應(yīng)出來(lái)的效果就是生成的pojo類會(huì)多一個(gè)類名+WithBLOBs.java的文件(含有的大對(duì)象個(gè)數(shù)大于1時(shí)),而在XML里面也會(huì)增加一個(gè)idResultMapWithBLOBsresultMap,它繼承BaseResultMap,大象一向喜歡簡(jiǎn)單的風(fēng)格,這看得太不爽了。如果你覺(jué)得無(wú)所謂,不需要修改,請(qǐng)?zhí)^(guò)這段往下看。
        表中的textblob等類型,通過(guò)databaseMetaData.getColumns()取出來(lái)后,它的rs.getInt("DATA_TYPE")值是與java.sql.Types對(duì)應(yīng)的。
        text類型的值:Types.LONGVARCHAR
        blob類型是值:Types.LONGVARBINARY
        它用org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl解析java類型與jdbc類型,然后設(shè)置到org.mybatis.generator.api.IntrospectedColumnjdbcTypeName屬性里,最關(guān)鍵的地方到了,IntrospectedColumn類第156行有個(gè)isBLOBColumn()方法,它就是用來(lái)判斷是否生成xxxWithBLOBs.javaResultMapWithBLOBs的條件。當(dāng)然mybatis-generator不會(huì)這么直接用,它在里面定義了一個(gè)Rules接口,由它來(lái)統(tǒng)一進(jìn)行調(diào)用。所以我們只需要把isBLOBColumn()里面的代碼都去掉,直接返回false就可以了,再結(jié)合配置文件中的columnOverride屬性就能達(dá)到目的。
        

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

        在生成xml的文件里面,我們看到有一個(gè)update元素,idupdateByPrimaryKey,這個(gè)基本上用不到,但是你還不能在table里加上enableUpdateByPrimaryKey="false",如果你這么做,雖然updateByPrimaryKey沒(méi)有了,但updateByPrimaryKeySelective也會(huì)消失。所以這時(shí)請(qǐng)看看org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator這個(gè)類,getSqlMapElement()里面,有大量的addXXX方法,這些方法里面每個(gè)都用到了Rules規(guī)則來(lái)處理是否執(zhí)行,比如我們?cè)?/span>table里面加了enableDeleteByExample="false",它對(duì)應(yīng)的是addDeleteByExampleElement(),而它又調(diào)用了introspectedTable.getRules().generateDeleteByExample()方法,再進(jìn)入到generateDeleteByExample()里面,我們可以看到紅線部分,上一篇大象講過(guò),在加載配置文件的時(shí)候,TableConfiguration會(huì)將table中的這些屬性設(shè)置到對(duì)應(yīng)的屬性里,所以說(shuō)其實(shí)最后還是回到了判斷enableDeleteByExample的布爾值上面。
        

        上面啰嗦了一大堆,現(xiàn)在再來(lái)解決之前提到的問(wèn)題,如何去掉idupdateByPrimaryKeyupdate元素,注釋掉addUpdateByPrimaryKeyWithoutBLOBsElement()或直接去掉這行代碼,跟蹤代碼你會(huì)發(fā)現(xiàn),它和addUpdateByPrimaryKeySelectiveElement()rules驗(yàn)證里面都用到了enableUpdateByPrimaryKey的值。或者你不想采取我說(shuō)的這個(gè)辦法,而是改BaseRulesgenerateUpdateByPrimaryKeyWithoutBLOBs(),讓它直接返回false
        最后大象再嘮叨一句,這些addXXX方法的順序決定了生成xml文件中的元素順序,所以有代碼潔癖的人可以作下調(diào)整。
        上一篇加這一篇都是講怎么少量的改動(dòng)源碼以實(shí)現(xiàn)自定義文件輸出,寫(xiě)的比較凌亂,不是很系統(tǒng),完全是從實(shí)用的角度出發(fā),關(guān)鍵還是大象水平有限,有什么錯(cuò)誤還請(qǐng)大家?guī)臀抑赋鰜?lái),謝謝!
        改了這么多,總要看下效果吧,下一篇大象將寫(xiě)個(gè)測(cè)試看看生成的結(jié)果,然后用maven assembly將它打包生成一個(gè)zip,它將包含:
        
        本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請(qǐng)注明出處。http://www.tkk7.com/bolo
    posted on 2015-03-25 16:33 菠蘿大象 閱讀(26603) 評(píng)論(0)  編輯  收藏 所屬分類: mybatis-generator
    主站蜘蛛池模板: 久久亚洲精品无码AV红樱桃| 成年女人毛片免费观看97| 亚洲综合色区在线观看| 羞羞视频免费观看| 国产免费观看网站| 色欲色欲天天天www亚洲伊| 日本免费一区二区三区最新| 亚洲AV日韩综合一区尤物 | 亚洲国产无线乱码在线观看| 免费阿v网站在线观看g| 亚洲国产高清视频在线观看| 91嫩草国产在线观看免费| 亚洲AV一二三区成人影片| 黄页网站免费观看| 亚洲色成人网站WWW永久四虎 | 亚洲成a人片在线观看天堂无码| 免费看AV毛片一区二区三区| 久久亚洲精品高潮综合色a片| 免费一级毛片不卡不收费| 一级毛片高清免费播放| 亚洲精品成人片在线播放| 久久久久久毛片免费播放| 日韩亚洲国产高清免费视频| 国产成人在线免费观看| 丝瓜app免费下载网址进入ios| 亚洲国产精品高清久久久| 中文字幕免费视频| 亚洲精品无码高潮喷水A片软| 亚洲精品色婷婷在线影院| 日韩免费无码一区二区三区 | 亚洲国产欧美日韩精品一区二区三区| 国产高清视频在线免费观看| 一个人看的www在线免费视频| 亚洲成色WWW久久网站| 欧美a级成人网站免费| 女人裸身j部免费视频无遮挡| 亚洲国产第一页www| 成人免费毛片观看| 在线观看肉片AV网站免费| 亚洲AV色吊丝无码| 亚洲中文字幕无码久久综合网|