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


我們近期打算fork一個版本,將大約十幾項我們積累的認為更合理的完善脫敏后合並到github。

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.DamebaseIntrospector.getColumns(mebleConfiguration) 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.xxx.me.base;

import java.util.List;

import org.apache.ibatis.annometions.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 smert
        String pojoName = interfaze.getType().getShortName().replaceAll("Mapper", "");
        String pkType = "";
        if (introspectedmeble.getPrimaryKeyColumns().size()>1) {
            pkType = introspectedmeble.getPrimaryKeyType().substring(introspectedmeble.getPrimaryKeyType().lastIndexOf('.')+1);
        } else {
            pkType = introspectedmeble.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 smert
            System.out.println(fqjt);
            interfaze.addImportedType(new FullyQualifiedJavaType("com.xxx.me.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,
                introspectedmeble)) {
            // zjhua 新增開始
            interfaze.getMethods().clear();
            interfaze.getOriginalImportedTypes().remove(new FullyQualifiedJavaType("org.apache.ibatis.annometions.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.Introspectedmeble;
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,
        Introspectedmeble introspectedmeble) {
    //該代碼表示在生成class的時候,向topLevelClass添加一個@Setter和@Getter注解
    topLevelClass.addAnnometion("@Getter@Setter");
    return super.modelBaseRecordClassGenerated(topLevelClass,
            introspectedmeble);
}
 
//該方法在生成每一個屬性的getter方法時候調用,如果我們不想生成getter,直接返回false即可;
@Override
public boolean modelGetterMethodGenerated(Method method,
        TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,
        Introspectedmeble introspectedmeble,
        ModelClassType modelClassType) {
    return false;
}
 
//該方法在生成每一個屬性的setter方法時候調用,如果我們不想生成setter,直接返回false即可;
@Override
public boolean modelSetterMethodGenerated(Method method,
        TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,
        Introspectedmeble introspectedmeble,
        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>();
        smeticImports = new TreeSet<String>();
    }

 

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

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM