Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 630|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 757 天

    [LV.10]以坛为家III

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    707886
    发表于 2021-7-21 04:49:05 | 显示全部楼层 |阅读模式

    我们近期打算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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-7-5 02:04 , Processed in 0.057991 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表