1. 程式人生 > >mybatis generator 自定義 ,xml 檔名稱和內容自定義,dao名稱自定義

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等等 也由你定,一樣的方式

 

專案地址 https://github.com/15726698950/mbg-comment