隨筆-67  評論-522  文章-0  trackbacks-0
    前兩篇對mybatis-generator-core源碼進行了修改,在一定程度上做到了方便使用。這一篇先將寫個測試程序看看生成的結果,然后用maven assembly將它打包生成一個zip文件。
    新建一個類StartUp,找到org.mybatis.generator.api.ShellRunner這個類,它就是生成文件的入口類,拷貝106-117行代碼,再稍微作下修改。
    
    
    
generatorConfig.xmlresources目錄下面,它里面要定義輸出文件的目錄,如果不指定具體的路徑,默認是在當前文件夾下面生成。
    

    但是呢,這里有個比較蛋疼的地方,mybatis-generator-core默認是不給你生成文件夾的,不信?請看org.mybatis.generator.internal.DefaultShellCallback的第50行,當指定的目錄不存在時,就拋出ShellException異常,所以輸出文件也就不可能有了。這里我們注釋掉51行代碼,添加如下代碼:
    
    
    現在再來執行StartUp看看,發現在與src、target同級目錄下生成了mybatis3目錄,里面有相應的pojoxml,打開之后看看效果,與我們改動代碼后預想的結果一致。那么接下來就看看,如何將它打包輸出成下面這樣的效果。
    

    首先我們新建一個src/main/scripts/run.bat文件,內容如下:
    java -jar mybatis-generator-1.3.2.jar -configfile generatorConfig.xml –overwrite
    pause

    其實就是一個java命令行,里面加的參數都是ShellRunner需要的,加上pause是方便查看輸出信息。
    然后修改pom文件,既然最終輸出有源文件JAR和編譯后的class JAR,所以我們需要增加maven-source-pluginmaven-jar-plugin這兩個插件,另外還用到了maven-assembly-plugin插件。這些plugin具體的用法,我就不講了,我只說下要注意的地方。
    

    注意紅色框的內容,表示我將打包的源代碼只會是原來的,增加的com.bolo.StartUp是不會包含進去的,而且這也沒必要添加進去。
    

    編譯之后的打包同樣只包含原來的代碼,并且一定要在這里指定入口類。classpathPrefix是類目錄,為空就是生成在當前目錄下。如果寫成<classpathPrefix>lib/</classpathPrefix>這樣,則表示生成的mybatis-generator-1.3.2.jar會在lib目錄下面。
    

    上圖descriptor里面的內容表明了assembly.xml的位置,它可以做很多自定義設置。
    

    這里定義的id默認是加到生成的文件名后面的,但我們在上圖中設置了<appendAssemblyId>false</appendAssemblyId>,所以,這個all-in-one就不會加到生成的文件名后面了,如果想要這個名字,將false改成true即可。<format>zip</format>表示將生成一個以zip為后綴的壓縮包。
    

    我們最終是想把幾個文件都放在一個目錄下面,所以outputDirectory就不需要再定義其它的名字。通過前面的輸出知道,最后只會包含generatorConfig.xmlrun.bat這兩個文件,其它的配置文件并不是我們需要的,因此這里需要排除它們。
    另外還有兩個fileSet是指定源代碼的JAR和編譯classJAR,這兩個設置和前面類似。
    
    有點補充說明:此例都是以MySQL數據庫為例,所以運行是需要mysql的數據庫驅動的,但我又不想在輸出里面包含這個jar,因此就在generatorConfig.xml文件里面進行了配置,不清楚的可以看看。
    最后的最后,這些我們都做完了,那么就可以打包輸出了,使用mvn package或是在Run As -> Maven Build -> Goals里面填寫package,點擊 Run。
    源碼下載: mybatis-generator-1.3.2.zip
    本文為菠蘿大象原創,如要轉載請注明出處。http://www.268147.live/bolo
posted on 2015-04-10 14:24 菠蘿大象 閱讀(15218) 評論(21)  編輯  收藏 所屬分類: mybatis-generator

評論:
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三)[未登錄] 2015-06-05 11:36 | Eric
你有沒有QQ啊,加來交流下,我現在也在修改代碼,但是不知道pom里面要怎么寫,才不會出錯  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-07-22 16:59 | 隔壁小王
大象,我自己寫了一個分頁插件,使用classpath把插件包加進去,可是還是會提示“org.mybatis.generator.plugins.MysqlPaginationPlugin”,這個腫么辦???跪謝了  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-07-22 17:20 | 隔壁小王
@隔壁小王
剛剛說錯了,是generatorConfig.xml里的classPathEntry  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-07-24 10:55 | 菠蘿大象
@隔壁小王
你自定義的插件只需要在配置文件里加上<plugin>標簽就可以了,另外分頁不都是擴展mybatis的Interceptor接口來實現的么?為什么要在mybatis-generator里寫呢?  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-07-24 17:26 | 隔壁小王
@菠蘿大象
org.mybatis.generator.plugins.MysqlPaginationPlugin這個插件是我自己寫的,不在mgb包里,我用classPathEntry配置好以后還是會報錯“Unexpected error while running MyBatis Generator.
Cannot instantiate object of type org.mybatis.generator.plugins.MysqlPaginationPlugin
”,大象可不可以加下我的qq(164286472)請教你一下啊  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-09-29 16:26 | 隔壁王叔
基本看完,收獲挺多,但是還沒有解決我的問題,我想問的是,自動生成實體類的時候,那個實體類的注釋亂碼問題怎么破?  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-09-30 10:13 | 菠蘿大象
@隔壁王叔
這個地方我寫掉了,你要改下org.mybatis.generator.api.MyBatisGenerator這個類的314行,把gjf.getFileEncoding()換成"UTF-8"就好了。我估計是因為我們中文windows系統的原因,如果不改,就會取當前系統的文件格式,而windows默認的文件格式就是ANSI  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-16 21:14 | masque
INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.766s
[INFO] Finished at: Wed Dec 16 21:06:13 CST 2015
[INFO] Final Memory: 7M/110M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project imonline: ORA-00900: 無效 SQL 語句 -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project imonline: ORA-00900: 無效 SQL 語句

at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: org.apache.maven.plugin.MojoExecutionException: ORA-00900: 無效 SQL 語句

at org.mybatis.generator.maven.MyBatisGeneratorMojo.execute(MyBatisGeneratorMojo.java:213)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
... 25 more

你好 我把改動的class覆蓋原來的class出現這個錯誤  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-16 21:25 | masque
我下載下來的源碼比你的小多了
我再用對比工具看看  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-16 22:57 | masque
@masque
不好意思 我想我找到原因了
我鏈接的是oracle  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-17 00:06 | masque
try {
java.sql.Statement statement = databaseMetaData.getConnection().createStatement();
java.sql.ResultSet rs = statement.executeQuery("SELECT * FROM all_tab_comments WHERE TABLE_name = '"+atn.getTableName()+"'");
String remark = "";
while (rs.next()) {
remark = rs.getString("COMMENTS");
}
table.setRemarks(remark);
closeResultSet(rs);
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}

OK獲取表注釋  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-17 12:37 | 菠蘿大象
@masque
我這個例子是基于MySQL數據庫寫的,第一篇就說了的,不過也恭喜你解決問題  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-19 15:26 | masque
oracle無法生成字段注釋

org.mybatis.generator.internal.db.ConnectionFactory

Connection org.mybatis.generator.internal.db.ConnectionFactory.getConnection(JDBCConnectionConfiguration config) throws SQLException

加上props.put("remarksReporting","true");

就可以生成注釋了

希望能幫到更多人  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-21 14:15 | 菠蘿大象
@masque
感謝分享,給你32個贊  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-21 16:42 | coco
@masque
你好,能不能把改好的工具發我一份啊,360846574@qq.com  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-21 17:54 | coco
@菠蘿大象
能不能把生成oracle修復一下,把生成表注釋加進來啊,看masque的方法,自己動手改class好麻煩,再好把addJavaFileComment的自定義注釋搞成配置項,這樣根據每個人需求配置就好了。謝謝啦  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2015-12-23 12:39 | 菠蘿大象
@coco
這篇最下面有下載,直接打包就可以生成工具了,我寫這個主要是分享,起一個拋磚引玉的作用,你可以自己動手改一下,再加上現在確實沒時間。  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2016-03-15 14:50 | 王小利
classPathEntry 這個具體是在哪里配置的  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2016-06-26 14:42 | 神馬技術
Exception in thread "main" java.net.MalformedURLException
at java.net.URL.<init>(URL.java:617)
at java.net.URL.<init>(URL.java:480)
at java.net.URL.<init>(URL.java:429)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:626)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1291)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1258)
at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:260)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1151)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1047)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:960)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:240)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at org.mybatis.generator.config.xml.ConfigurationParser.parseConfiguration(ConfigurationParser.java:109)
at org.mybatis.generator.config.xml.ConfigurationParser.parseConfiguration(ConfigurationParser.java:82)
at org.mybatis.generator.config.xml.ConfigurationParser.parseConfiguration(ConfigurationParser.java:74)
at test.test.main(test.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)



我按照你的教程修改了,為什么運行的時候會報錯呢?這是什么原有  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2016-08-05 18:00 | 王先森
@神馬技術
我和你遇到一樣的問題,希望大象幫忙!  回復  更多評論
  
# re: 修改mybatis-generator-1.3.2源碼實現自定義代碼生成詳解(三) 2016-08-08 14:09 | 菠蘿大象
@王先森
@神馬技術
你們遇到的問題是自己修改代碼后,寫個測試類無法運行是嗎?其實這很簡單吶,我把代碼貼下。
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<String>();
File configFile = new File(StartUp.class.getResource("/generatorConfig.xml").toURI());
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback shellCallback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings);
myBatisGenerator.generate(null);
System.out.println(warnings);
}
因為工程是基于maven構建,generatorConfig.xml是在resources目錄下,你們再試試看有沒有問題。  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。


網站導航:
 
湖北快3号码表 1山东十一选五体彩 2019年股票配资平台排行 黑龙江p62开奖查询 贵州十一选五平台有哪些 北京快三走势图一定牛 安徽福彩快3遗漏数据 中国股票配资平台排行榜 浙江省6 1走势图 股票分析方法包括 体育彩票十一选五开奖