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
mybatis generator自动生成sqlmap代码的不完善之处以及解决方法的更多相关文章
- SpringBoot 添加mybatis generator 自动生成代码插件
自动生成数据层代码,提高开发效率 1.pom添加插件,并指定配置文件路径 <!-- mybatis generator 自动生成代码插件 --> <plugin> <gr ...
- 使用Mybatis Generator自动生成Mybatis相关代码
本文将简要介绍怎样利用Mybatis Generator自动生成Mybatis的相关代码: 一.构建一个环境: 1. 首先创建一个表: CREATE TABLE pet (name VARCHAR(2 ...
- idea中mybatis generator自动生成代码配置 数据库是sqlserver
好长时间没有写博客了,最近公司要用java语言,开始学习java,属于初学者,今天主要记录一下mybatis generator自动生成代码,首先在如下图的目录中新建两个文件,如下图 generato ...
- SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...
- IDEA Maven Mybatis generator 自动生成代码
IDEA Maven Mybatis generator 自动生成代码 一.安装配置maven以及在Idea中配置maven 安装过程步骤可以看上面的博文,里面介绍得很详细. 二.建数据表 DROP ...
- IDEA Maven Mybatis generator 自动生成代码(实例讲解)(转)
IDEA Maven Mybatis generator 自动生成代码(实例讲解) MyBatis Generator • 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的 ...
- 使用MyBatis Generator自动生成MyBatis的代码
这两天需要用到MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生 ...
- Mybatis generator自动生成mybatis配置和类信息
自动生成代码方式两种: 1.命令形式生成代码,详细讲解每一个配置参数. 2.Eclipse利用插件形式生成代码. 安装插件方式: eclipse插件安装地址:http://mybatis.google ...
- mybatis generator自动生成 实体类, sqlmap配置文件 详细介绍
我使用的是Eclipse Luna 装了自己常用的插件, generator也是其中一个推荐下载 MyBatis_Generator_1.3.1.zip离线安装包 <?xml version=& ...
随机推荐
- mybatis调用oracle存储过程 out游标类型参数 如何赋给java map
<resultMap id="ticketInfosResultMap" type="Map"> <!--result要是默认用列名的话完全不 ...
- [LeetCode] 408. Valid Word Abbreviation_Easy
Given a non-empty string s and an abbreviation abbr, return whether the string matches with the give ...
- 学习erlang书籍 - 转
Here are a few resources:Programming Erlang, by Joe Armstrong. A good book, really teaching you more ...
- tomcat优化和JVM修改内存
Tomcat中的线程池(APR和ThreadPool) 2. 在Connector中指定使用共享线程池: <Connector executor="tomcatThreadPool&q ...
- ios UrlEncode与UrlDecode
url字符串中具有特殊功能的特殊字符的字符串,或者中文字符,作为参数用GET方式传递时,需要用urlencode处理一下.当然,有时作为Post参数传递,也需要urlencode处理一下. NSStr ...
- 从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
自从小白向师兄学习了李群李代数和相机成像模型的基本原理后,感觉书上的内容没那么难了,公式推导也能推得动了,感觉进步神速,不过最近小白在学习对极几何,貌似又遇到了麻烦... 小白:师兄,对极几何这块你觉 ...
- 笔记 : win8系统中的VM虚拟机的Ubuntu搭建samba服务
1. 环境准备 (此处使用root超级管理员帐户,执行命令时不用加sudo, 普通帐户需要前面加sudo): (1)安装好Ubutun虚拟系统后,Ubuntu 的软件源配置文件是 /etc/apt/ ...
- Spark Streaming 002 统计单词的例子
1.准备 事先在hdfs上创建两个目录: 保存上传数据的目录:hdfs://alamps:9000/library/SparkStreaming/data checkpoint的目录:hdfs://a ...
- Rpgmakermv(34) Mog_Event Sensor
原文: =============================================================================+++ MOG - Event Sen ...
- JavaScript中直接量和变量
标题 1.直接量 顾名思义,可以直接拿来使用的量.那哪些是直接量呢?数据类型又有很多种,因为不同类型的数据处理方式是不同的,所以数据要分类型 基本类型 1.1 String字符串 用单引号或双引号引起 ...