1. 程式人生 > >mybatis generator自動生成sqlmap代碼的不完善之處以及解決方法

mybatis generator自動生成sqlmap代碼的不完善之處以及解決方法

div sql sdn array trees object system cimport rac

a) 建表時,字段名稱建議用"_"分隔多個單詞,比如:AWB_NO、REC_ID...,這樣生成的entity,屬性名稱就會變成漂亮的駝峰命名,即:awbNo、recId

b)oracle中,數值形的字段,如果指定精度,比如Number(12,2),默認生成entity屬性是BigDecimal型 ,如果不指定精度,比如:Number(9),指默認生成的是Long型

如果不指定精度,比如number,會生成Short類型,此時要生成Integer,只能修改源代碼org.mybatis.generator.internal.db.DatabaseIntrospector.getColumns(TableConfiguration) 624行,如下:

            // zjhua add for oracle, 默認情況下precision,scale都為0, 生成Short類型是不正確的
            if (rs.getInt("COLUMN_SIZE") == 0) {
//                scale>0;length>18:使用BigDecimal;
//                scale=0;length[10,18]:使用Long;
//                scale=0;length[5,9]:使用Integer;
//                scale=0;length<5:使用Short;
                
// 所以隨便選個8就好了 introspectedColumn.setLength(8); } else { introspectedColumn.setLength(rs.getInt("COLUMN_SIZE")); //$NON-NLS-1$ }

c)oracle中的nvarchar/nvarchar2,mybatis-generator會識別成Object型,建議不要用nvarchar2,改用varchar2

d) 如果要生成繼承基礎類的mapper,比如:

package com.hundsun.ta.base;

import java.util.List; import org.apache.ibatis.annotations.Param; public interface BaseMapper<T, E, PK> { T selectByPrimaryKey(PK pk); List<T> selectByExample(E example); int insert(T record); int insertSelective(T record); int updateByPrimaryKeySelective(T record); int updateByExampleSelective(@Param("record") T record, @Param("example") E example); int deleteByPrimaryKey(PK pk); int deleteByExample(E example); default int insertBatch(List<T> record) { throw new UnsupportedOperationException();}; int truncate(); }

也需要修改源代碼org.mybatis.generator.codegen.mybatis3.javamapper.JavaMapperGenerator.getCompilationUnits() 85行開始,如下:

// zjhua add start
        String pojoName = interfaze.getType().getShortName().replaceAll("Mapper", "");
        String pkType = "";
        if (introspectedTable.getPrimaryKeyColumns().size()>1) {
            pkType = introspectedTable.getPrimaryKeyType().substring(introspectedTable.getPrimaryKeyType().lastIndexOf(‘.‘)+1);
        } else {
            pkType = introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType().getShortName();
        }
        
        rootInterface = "BaseMapper<" + pojoName + "," + pojoName + "Example," + pkType + ">";
        // zjhua add end
        if (stringHasValue(rootInterface)) {
            FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType(
                    rootInterface);
            interfaze.addSuperInterface(fqjt);
            interfaze.addImportedType(fqjt);
            // zjhua add start
            System.out.println(fqjt);
            interfaze.addImportedType(new FullyQualifiedJavaType("com.hundsun.ta.base.BaseMapper"));
            // zjhua add end
        }
        
        // addCountByExampleMethod(interfaze);
        addDeleteByExampleMethod(interfaze);
        addDeleteByPrimaryKeyMethod(interfaze);
        addInsertMethod(interfaze);
        addInsertSelectiveMethod(interfaze);
        addSelectByExampleWithBLOBsMethod(interfaze);
        addSelectByExampleWithoutBLOBsMethod(interfaze);
        addSelectByPrimaryKeyMethod(interfaze);
        addUpdateByExampleSelectiveMethod(interfaze);
        addUpdateByExampleWithBLOBsMethod(interfaze);
        addUpdateByExampleWithoutBLOBsMethod(interfaze);
        addUpdateByPrimaryKeySelectiveMethod(interfaze);
        addUpdateByPrimaryKeyWithBLOBsMethod(interfaze);
        addUpdateByPrimaryKeyWithoutBLOBsMethod(interfaze);

        List<CompilationUnit> answer = new ArrayList<CompilationUnit>();
        if (context.getPlugins().clientGenerated(interfaze, null,
                introspectedTable)) {
            // zjhua 新增開始
            interfaze.getMethods().clear();
            interfaze.getOriginalImportedTypes().remove(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Param"));
            interfaze.getOriginalImportedTypes().remove(new FullyQualifiedJavaType("java.util.List"));
            // 新增結束
            answer.add(interfaze);
        }

這樣就可以按需滿足了。

最後,pojo應該使用lombok的Getter和Setter。這可以通過增加一個自定義插件實現,如下:

package cn.wolfcode.mybatis.plugins;

import java.util.List;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;

public class IngoreSetterAndGetterPlugin extends PluginAdapter {
     
@Override
public boolean validate(List<String> warnings) {
    return true;
}
 
@Override
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass,
        IntrospectedTable introspectedTable) {
    //該代碼表示在生成class的時候,向topLevelClass添加一個@Setter和@Getter註解
    topLevelClass.addAnnotation("@Getter@Setter");
    return super.modelBaseRecordClassGenerated(topLevelClass,
            introspectedTable);
}
 
//該方法在生成每一個屬性的getter方法時候調用,如果我們不想生成getter,直接返回false即可;
@Override
public boolean modelGetterMethodGenerated(Method method,
        TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,
        IntrospectedTable introspectedTable,
        ModelClassType modelClassType) {
    return false;
}
 
//該方法在生成每一個屬性的setter方法時候調用,如果我們不想生成setter,直接返回false即可;
@Override
public boolean modelSetterMethodGenerated(Method method,
        TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,
        IntrospectedTable introspectedTable,
        ModelClassType modelClassType) {
    return false;
}
 
}

然後修改org.mybatis.generator.api.dom.java.TopLevelClass構造器,引入lombok.Getter和lombok.Setter,如下:

    public TopLevelClass(FullyQualifiedJavaType type) {
        super(type);
        importedTypes = new TreeSet<FullyQualifiedJavaType>();
        // zjhua add
        importedTypes.add(new FullyQualifiedJavaType("lombok.Getter"));
        importedTypes.add(new FullyQualifiedJavaType("lombok.Setter"));
        // zjhua add end
        fileCommentLines = new ArrayList<String>();
        staticImports = new TreeSet<String>();
    }

最後,在generatorConfig-oracle.xml加上插件,如下:

<plugin type="cn.wolfcode.mybatis.plugins.IngoreSetterAndGetterPlugin" />

這樣就符合我們的要求了。

Mybatis generator 接口增加自定義方法和sql配置可以參考:https://blog.csdn.net/limclg/article/details/80816923

mybatis generator自動生成sqlmap代碼的不完善之處以及解決方法