mybatis generator自动生成sqlmap代码的不完善之处以及解决方法

Posted 太白的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis generator自动生成sqlmap代码的不完善之处以及解决方法相关的知识,希望对你有一定的参考价值。

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("@[email protected]");
    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代码的不完善之处以及解决方法的主要内容,如果未能解决你的问题,请参考以下文章

mybatis-generator代码生成报错?

generator自动生成mybatis后怎么用

使用Mybatis-Generator自动生成DaoModelMapping

使用Mybatis Generator自动生成Mybatis相关代码

Java MyBatis Generator使用generator自动生成Dao,Mapping和实体文件

mybatis代码生成器——MyBatis Generator