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

mybatis generator自动生成sqlmap代码的不完善之处以及解决方法的更多相关文章

  1. SpringBoot 添加mybatis generator 自动生成代码插件

    自动生成数据层代码,提高开发效率 1.pom添加插件,并指定配置文件路径 <!-- mybatis generator 自动生成代码插件 --> <plugin> <gr ...

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

    本文将简要介绍怎样利用Mybatis Generator自动生成Mybatis的相关代码: 一.构建一个环境: 1. 首先创建一个表: CREATE TABLE pet (name VARCHAR(2 ...

  3. idea中mybatis generator自动生成代码配置 数据库是sqlserver

    好长时间没有写博客了,最近公司要用java语言,开始学习java,属于初学者,今天主要记录一下mybatis generator自动生成代码,首先在如下图的目录中新建两个文件,如下图 generato ...

  4. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...

  5. IDEA Maven Mybatis generator 自动生成代码

    IDEA Maven Mybatis generator 自动生成代码 一.安装配置maven以及在Idea中配置maven 安装过程步骤可以看上面的博文,里面介绍得很详细. 二.建数据表 DROP ...

  6. IDEA Maven Mybatis generator 自动生成代码(实例讲解)(转)

    IDEA Maven Mybatis generator 自动生成代码(实例讲解) MyBatis Generator • 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的 ...

  7. 使用MyBatis Generator自动生成MyBatis的代码

    这两天需要用到MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生 ...

  8. Mybatis generator自动生成mybatis配置和类信息

    自动生成代码方式两种: 1.命令形式生成代码,详细讲解每一个配置参数. 2.Eclipse利用插件形式生成代码. 安装插件方式: eclipse插件安装地址:http://mybatis.google ...

  9. mybatis generator自动生成 实体类, sqlmap配置文件 详细介绍

    我使用的是Eclipse Luna 装了自己常用的插件, generator也是其中一个推荐下载 MyBatis_Generator_1.3.1.zip离线安装包 <?xml version=& ...

随机推荐

  1. [LeetCode] 693. Binary Number with Alternating Bits_Easy

    Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will a ...

  2. JAVA中使用LOG4J记录日志

    在项目开发中,记录错误日志是一个很有必要功能.一是方便调试:二是便于发现系统运行过程中的错误:三是存储业务数据,便于后期分析: 在java中,记录日志,有很多种方式. 比如,自己实现. 自己写类,将日 ...

  3. Ubuntu下安装eclipse遇到的问题

    今天在Ubuntu中安装eclipse时遇到如下问题: 解决方法: 打开eclipse安装目录下eclipse.ini文件 在文件最开头(注:一定是最开头)加上如下语句(-startup前面两行),第 ...

  4. ROC曲线,AUC面积

    AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间.Auc作为数值可以直观的评价分类器的好坏,值越大越好. 首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本, ...

  5. Cocos Creator 键盘监听事件

    键盘事件键盘.设备重力传感器此类全局事件是通过函数 cc.systemEvent.on(type, callback, target) 注册的.cc.SystemEvent.EventType.KEY ...

  6. cocos2d JS 艺术字特殊符号的显示

    this.setSocreAtion(score, this.tfMoneyList[index],mun); //传入分数与对象,调用下面的函数 setSocreAtion : function ( ...

  7. cocos2dx 3.x(打开网页webView)

    #include "ui/CocosGUI.h" using namespace cocos2d::experimental::ui; WebView *webView = Web ...

  8. cocos2dx - JS - 碰撞检测

    碰撞检测是游戏的一个重要组成部分,我们这里使用一种最简单的方法,就是获取精灵的矩形碰撞框.当然圆形的碰撞检测也比较简单,其他形状就复杂多了.首先是如何获取矩形碰撞框:var hBox=this.her ...

  9. ASP.NET MVC4中加入Log4Net日志记录功能

    前言 在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogging等,虽然多多少少使用起来有点费劲,但这里还是简单分享一下Log4Ne ...

  10. kettle杂记

    版本8.0,以下是我在使用kettle时候的一些小tips 1.“插入/更新”必须指定字段,“表输出”无需指定字段,但是源表的字段必须包含在目标表中,否则unknown colum! 2.连接数据库时 ...