mybatis generator 自定義 ,xml 檔名稱和內容自定義,dao名稱自定義
最近在用mybatis generator 生成程式碼的時候,生成的xml檔案 和類檔案 不是自己想要的,於是修改mybatis generator 的原始碼,重寫方法來達到效果,這裡記錄一下,後期如果需要還可以隨便改成自己想要的!
一 修改註釋
mybatis generator 生成的註釋不是自己想要的中文註釋,預設是不生成註釋的,如果開啟註釋,用mybatis generator 自帶的生成的註釋帶的東西全是英文,而且不是自己想要的中午註釋!
網上有很多例子不想寫了,我認為比較好的,解釋的很清楚。
問題的關鍵是是放棄預設實現CommentGenerator介面的類DefaultCommentGenerator。自己重新實現CommentGenerator,主要重新定義,截圖
如下
紅線部分 的修改因為,實體類實現serializable介面的時候 ,serialVersionUID位置修改成第一行(反正我generatorConfig.xml加開啟的時候,生成他的位置不是首行亂放),這樣解決了註釋問題
二類檔名稱問題
在generatorConfig.xml 看到這麼一個關鍵字,主要用來生成檔案的實現類,我這裡改成了自己的。
原始碼自帶的有這麼幾種實現方式有mybatis的和ibatis的 如圖
下面主要說是我定義一個類重新實現IntrospectedTableMyBatis3Impl
程式碼如下
package generator.mbgcomment; import org.mybatis.generator.api.ProgressCallback; import org.mybatis.generator.codegen.AbstractJavaClientGenerator; import org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3Impl; import org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator; import java.text.MessageFormat; import java.util.List; import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; //MyBatis3 的實現 public class TkMyBatis3Impl extends IntrospectedTableMyBatis3Impl { @Override protected void calculateXmlMapperGenerator(AbstractJavaClientGenerator javaClientGenerator, List<String> warnings, ProgressCallback progressCallback) { if (javaClientGenerator == null) { if (this.context.getSqlMapGeneratorConfiguration() != null) { this.xmlMapperGenerator = new MyXMLMapperGenerator(); } } else { this.xmlMapperGenerator = new MyXMLMapperGenerator();; } this.initializeAbstractGenerator(this.xmlMapperGenerator, warnings, progressCallback); } @Override protected String calculateMyBatis3XmlMapperFileName() { StringBuilder sb = new StringBuilder(); if (stringHasValue(tableConfiguration.getMapperName())) { String mapperName = tableConfiguration.getMapperName(); int ind = mapperName.lastIndexOf('.'); if (ind != -1) { mapperName = mapperName.substring(ind + 1); } //支援mapperName = "{0}Dao" 等用法 sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length())+"Mapper"); // sb.append(MessageFormat.format(mapperName, fullyQualifiedTable.getDomainObjectName())); sb.append(".xml"); //$NON-NLS-1$ } else { sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length())); sb.append("Mapper.xml"); //$NON-NLS-1$ } return sb.toString(); } @Override protected void calculateJavaClientAttributes() { if (context.getJavaClientGeneratorConfiguration() == null) { return; } StringBuilder sb = new StringBuilder(); sb.append(calculateJavaClientImplementationPackage()); sb.append('.'); sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length())); sb.append("DAOImpl"); //$NON-NLS-1$ setDAOImplementationType(sb.toString()); sb.setLength(0); sb.append(calculateJavaClientInterfacePackage()); sb.append('.'); sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length())); sb.append("DAO"); //$NON-NLS-1$ setDAOInterfaceType(sb.toString()); sb.setLength(0); sb.append(calculateJavaClientInterfacePackage()); sb.append('.'); if (stringHasValue(tableConfiguration.getMapperName())) { //支援mapperName = "{0}Dao" 等用法 sb.append(MessageFormat.format(tableConfiguration.getMapperName(), fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length()))); } else { sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length())); sb.append("Mapper"); //$NON-NLS-1$ } setMyBatis3JavaMapperType(sb.toString()); sb.setLength(0); sb.append(calculateJavaClientInterfacePackage()); sb.append('.'); if (stringHasValue(tableConfiguration.getSqlProviderName())) { //支援mapperName = "{0}SqlProvider" 等用法 sb.append(MessageFormat.format(tableConfiguration.getSqlProviderName(), "SystmMerchantMapper")); } else { sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length())); sb.append("SqlProvider"); //$NON-NLS-1$ } setMyBatis3SqlProviderType(sb.toString()); } }
詳解每個方法的用處
圖一
這個方法我下面再說
圖二generatorConfig.xml 配置
圖三修改實現類
圖四
圖二程式碼的意思是我要把Mapper 介面和mapper.xml改成 TbSystemModelDao 和TbSystemModelDaoMapper.xml
但在還是達不到效果
圖三加上圖四紅線部分就是修改mapper.xml 和dao名稱。我想達到的效果是 介面改成SystemModelDao.java,對映檔案改成SystemMapper.xml,而DomainObjectName是TbSystemModel,如果不做修改這裡mapper.xml就變成TbSystemDao.xml ,介面dao就是TbSystemDao,但是這不是我想要的
三修改mapper.xml 生成的內容
我值舉一個例子剩下的我會把專案放到git 上面 我舉一個查詢的例子
首先第一步就是上面剛剛看的圖一
紅線部分是生成xml 內容的類,我自己重新寫了一個,裡面有很多方法 生成增刪該查 resultMap 等等的方法 如圖
紅線部分新增自己需要的方法,現在我們想改select方法,點選進去
紅線部分是自己寫的實現類
好了到了這裡 怎麼生成sql ,xml需要的內容有你掌控,同理改其他sql等等 也由你定,一樣的方式