1. 程式人生 > >擴充套件mybatis-generator自動生成程式碼專案

擴充套件mybatis-generator自動生成程式碼專案

專案結構預覽

專案結構圖

實現功能

  1. 通用的新增方法
  2. 通用的分頁方法
  3. 通用的修改方法

注意事項

  • 需要修改的位置

generatorConfig.properties檔案中

  1. 專案路徑
  2. jdbcConnection 連線的相關配置

generatorConfig.xml檔案中

  1. 生成對應表及類名 這個配置需要修改,你需要對哪些表生產程式碼就新增哪些表

執行

直接執行GeneratorStartUp類即可

相關擴充套件介紹

  1. 自定義文件註釋
    由於 mybatis-generator 自帶的文件註釋對我們中國人不太友好。為了專案需要,我在此專案中擴充套件了一下文件註釋。
    首先,我自定義了MyCommentGenerator
    類,其繼承自DefaultCommentGenerator 在該類中我們需要以下幾個方法
    1. addGeneralMethodComment 方法,該方法用於給方法新增文件註釋
    2. addFieldComment 方法,該方法用於給屬性新增文件註釋
    3. addGetterComment,addSetterComment這兩個方法分別是給get,set方法新增文件註釋
    4. 做好這些之後,我們需要修改一下generatorConfig.xml中的配置<commentGenerator type="com.jay.generator.internal.MyCommentGenerator">
      <property name="javaFileEncoding" value="UTF-8"/>
      </commentGenerator>
  2. 配置屬性化
    原有的mybatis-generator的工具,相關的配置個人感覺不是很方便。所以我也做了相應的修改。
    首先,新建一個屬性檔案,如generatorConfig.properties
    然後把相關配置放在該屬性檔案中:
    如:
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/ssh_employee?useUnicode\=true&characterEncoding\=UTF-8
user=root
password=1234

我們先在generatorConfig.xml

新增properties
<properties resource="generatorConfig.properties"></properties>

然後就可以使用相關的key,如: <jdbcConnection driverClass="${driverClass}" connectionURL="${jdbcUrl}" userId="${user}" password="${password}">

3. 新增自定義方法
到了最重要的一個環節,當mybatis-generator自動內建的方法不滿足我們的需求的時候,我們可以擴充套件自定義方法。步驟如下:
1. 自定義類MyIntrospectedTableMyBatis3SimpleImpl 繼承IntrospectedTableMyBatis3SimpleImpl,如下:

 /**
     * XML的生成方法
     * @param javaClientGenerator
     * @param warnings
     * @param progressCallback
     */
    @Override
    protected void calculateXmlMapperGenerator(AbstractJavaClientGenerator javaClientGenerator, List<String> warnings, ProgressCallback progressCallback) {
        this.xmlMapperGenerator = new MySimpleXMLMapperGenerator();
        this.initializeAbstractGenerator(this.xmlMapperGenerator, warnings, progressCallback);
    }

    /**
     * Mapper類的生成方法
     * @return
     */
    @Override
    protected AbstractJavaClientGenerator createJavaClientGenerator() {
        if (this.context.getJavaClientGeneratorConfiguration() == null) {
            return null;
        } else {
            String type = this.context.getJavaClientGeneratorConfiguration().getConfigurationType();
            Object javaGenerator;
            if ("XMLMAPPER".equalsIgnoreCase(type)) {
                javaGenerator = new MySimpleJavaClientGenerator();
            } else if ("ANNOTATEDMAPPER".equalsIgnoreCase(type)) {
                javaGenerator = new MySimpleAnnotatedClientGenerator();
            } else if ("MAPPER".equalsIgnoreCase(type)) {
                javaGenerator = new MySimpleJavaClientGenerator();
            } else {
                javaGenerator = (AbstractJavaClientGenerator) ObjectFactory.createInternalObject(type);
            }
            return (AbstractJavaClientGenerator)javaGenerator;
        }
    }

    /**
     * model類的生成方法
     * @param warnings
     * @param progressCallback
     */
    @Override
    protected void calculateJavaModelGenerators(List<String> warnings, ProgressCallback progressCallback) {
        super.calculateJavaModelGenerators(warnings, progressCallback);
    }   

分別新建:MySimpleXMLMapperGenerator類,MySimpleJavaClientGenerator類,用於生成xml檔案和mapper檔案。
3. MySimpleXMLMapperGenerator 類繼承SimpleXMLMapperGenerator類重寫getSqlMapElement方法

 @Override
    protected XmlElement getSqlMapElement() {
        FullyQualifiedTable table = this.introspectedTable.getFullyQualifiedTable();
        this.progressCallback.startTask(Messages.getString("Progress.12", table.toString()));
        XmlElement answer = new XmlElement("mapper");
        String namespace = this.introspectedTable.getMyBatis3SqlMapNamespace();
        answer.addAttribute(new Attribute("namespace", namespace));
        this.context.getCommentGenerator().addRootComment(answer);
        this.addResultMapElement(answer);
        this.addDeleteByPrimaryKeyElement(answer);
        this.addInsertElement(answer);
        this.addUpdateByPrimaryKeyElement(answer);
        this.addSelectByPrimaryKeyElement(answer);
        this.addSelectAllElement(answer);
        this.addCountListElement(answer);
        this.addQueryPageListElement(answer);
        return answer;

    }
  1. MySimpleJavaClientGenerator 類繼承SimpleJavaClientGenerator類重寫getCompilationUnits方法,如
 @Override
    public List<CompilationUnit> getCompilationUnits() {
        this.progressCallback.startTask(Messages.getString("Progress.17", this.introspectedTable.getFullyQualifiedTable().toString()));
        CommentGenerator commentGenerator = this.context.getCommentGenerator();
        FullyQualifiedJavaType type = new FullyQualifiedJavaType(this.introspectedTable.getMyBatis3JavaMapperType());
        Interface interfaze = new Interface(type);
        interfaze.setVisibility(JavaVisibility.PUBLIC);
        //新增新增類註釋,這個是新增到類頭部,沒有多大作用
        commentGenerator.addJavaFileComment(interfaze);
        String rootInterface = this.introspectedTable.getTableConfigurationProperty("rootInterface");
        if (!StringUtility.stringHasValue(rootInterface)) {
            rootInterface = this.context.getJavaClientGeneratorConfiguration().getProperty("rootInterface");
        }
        if (StringUtility.stringHasValue(rootInterface)) {
            FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType(rootInterface);
            interfaze.addSuperInterface(fqjt);
            interfaze.addImportedType(fqjt);
        }
        this.addDeleteByPrimaryKeyMethod(interfaze);
        this.addInsertMethod(interfaze);
        this.addSelectByPrimaryKeyMethod(interfaze);
        this.addSelectAllMethod(interfaze);
        this.addUpdateByPrimaryKeyMethod(interfaze);
        this.addCountListMethod(interfaze);
        this.addQueryPageListMethod(interfaze);
        List<CompilationUnit> answer = new ArrayList<CompilationUnit>();
        if (this.context.getPlugins().clientGenerated(interfaze, (TopLevelClass) null, this.introspectedTable)) {
            answer.add(interfaze);
        }

        List<CompilationUnit> extraCompilationUnits = this.getExtraCompilationUnits();
        if (extraCompilationUnits != null) {
            answer.addAll(extraCompilationUnits);
        }

        return answer;
    }

generatorConfig.xml的幾點說明

  1. table 的配置的相關屬性說明:<table tableName="sh_department" domainObjectName="ShDepartment"
    enableInsert="true" enableDeleteByPrimaryKey="false" enableUpdateByPrimaryKey="true"
    enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
    enableSelectByExample="false" selectByExampleQueryId="false" selectByPrimaryKeyQueryId="false"></table>

    說明:tableName="sh_department" 表示表名為sh_department,
    domainObjectName="ShDepartment"表示實體類(model)的名稱為ShDepartment
    enableInsert="true" 表示 生成 insert方法
    enableDeleteByPrimaryKey="false"表示不生成deleteByPrimaryKey方法
    所以 enablexxx="false"為true表示生成某方法,為false表示不生成某方法。

mybatis-generator-core相關技術探究

專案結構介紹

  1. api包主要提供外部介面,供擴充套件使用,切入點可以試MyPluginAdapter
  2. codegen 包是生成檔案的核心包,入口是IntrospectedTableMyBatis3Impl類,生成對應檔案檔案需要的類在對應的
    子包中,如:生成xml檔案相關的類在 xmlmapper包中。
  3. internal 包下 DefaultCommentGenerator 類是用於生成對應的文件註釋。可以擴充套件,擴充套件之後再修改一下generatorConfig.xml

涉及到的設計模式

參考文件:

資源下載