mybatis(mysql)代码生成器扩展
前些天在做我的KSF框架的时候需要用到mybatis代码生成器,
但是发现有一些东西需要调整,主要集中在以下几点:
1. 加入batchInsert
2. 加入batchUpdate
3. mysql字段名和关键字冲突问题
4. 生成的实体类继承基类
5. mapper继承基础接口,实现自己的代码
6. insert之后获取生成的ID
7. 使实体可序列化
加入batchInsert
1.在generatorConfig.xml中加入以下插件
<plugin type="com.itfsw.mybatis.generator.plugins.BatchInsertPlugin"/>
2.在pom的mybatis-generator-maven-plugin中加入以下依赖
<dependency>
<groupId>com.itfsw</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.0.5</version>
</dependency>
加入batchUpdate
1.在generatorConfig.xml中加入以下插件
<plugin type="com.kuta.base.mybatis.plugins.KutaBatchUpdatePlugin"/>
2.编写插件代码
package com.kuta.base.mybatis.plugins; import java.util.List; import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
import org.mybatis.generator.config.MergeConstants; import com.kuta.base.database.util.SqlMapperGeneratorTool; public class KutaBatchUpdatePlugin extends org.mybatis.generator.api.PluginAdapter{ private final static String BATCH_UPDATE = "batchUpdate"; private final static String PARAMETER_NAME = "recordList"; @Override
public boolean validate(List<String> list) {
return true;
} @Override
public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { if (introspectedTable.getTargetRuntime().equals(IntrospectedTable.TargetRuntime.MYBATIS3)) {
MethodGeneratorTool.defaultBatchInsertOrUpdateMethodGen(MethodGeneratorTool.UPDATE, interfaze, introspectedTable, context);
}
return super.clientGenerated(interfaze, topLevelClass, introspectedTable);
} @Override
public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
if (introspectedTable.getTargetRuntime().equals(IntrospectedTable.TargetRuntime.MYBATIS3)) {
addSqlMapper(document, introspectedTable);
}
return super.sqlMapDocumentGenerated(document, introspectedTable);
} public void addSqlMapper(Document document, IntrospectedTable introspectedTable) {
String tableName = introspectedTable.getFullyQualifiedTableNameAtRuntime();
List<IntrospectedColumn> columnList = introspectedTable.getAllColumns();
//primaryKey的JDBC名字
String primaryKeyName = introspectedTable.getPrimaryKeyColumns().get(0).getActualColumnName(); //primaryKey的JAVA变量
String primaryKeyParameterClause = MyBatis3FormattingUtilities.getParameterClause(introspectedTable.getPrimaryKeyColumns().get(0), "item."); //primaryKey的JAVA名字
String primaryKeyJavaName = introspectedTable.getPrimaryKeyColumns().get(0).getJavaProperty(); XmlElement updateXmlElement = SqlMapperGeneratorTool.baseElementGenerator(SqlMapperGeneratorTool.UPDATE,
BATCH_UPDATE,
FullyQualifiedJavaType.getNewListInstance());
updateXmlElement.addElement(new TextElement("<!-- generated by Kuta batchUpdate plugin - "
+ MergeConstants.NEW_ELEMENT_TAG + " -->"));
updateXmlElement.addElement(new TextElement(String.format("update %s ", tableName))); XmlElement trimElement = SqlMapperGeneratorTool.baseTrimElement("set", null, ","); for (int i = 0; i < columnList.size(); i++) { IntrospectedColumn introspectedColumn = columnList.get(i); String columnName = introspectedColumn.getActualColumnName(); String columnJavaTypeName = introspectedColumn.getJavaProperty("item."); String parameterClause = MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, "item."); if (introspectedColumn.isIdentity()) {
continue;
} String ifSql = String.format("when %s then %s", primaryKeyParameterClause, parameterClause);
XmlElement ifElement = SqlMapperGeneratorTool.baseIfJudgeElementGen(columnJavaTypeName, ifSql, false); String ifNullSql = String.format("when %s then %s", primaryKeyParameterClause, tableName + "." + columnName);
XmlElement ifNullElement = SqlMapperGeneratorTool.baseIfJudgeElementGen(columnJavaTypeName, ifNullSql, true); XmlElement foreachElement = SqlMapperGeneratorTool.baseForeachElementGenerator(PARAMETER_NAME, "item", "index", null);
foreachElement.addElement(ifElement);
foreachElement.addElement(ifNullElement); XmlElement caseTrimElement = SqlMapperGeneratorTool.baseTrimElement(columnName + " =case " + primaryKeyName, "end,", null);
caseTrimElement.addElement(foreachElement); trimElement.addElement(caseTrimElement);
} updateXmlElement.addElement(trimElement); XmlElement foreachElement = SqlMapperGeneratorTool.baseForeachElementGenerator(PARAMETER_NAME,
"item",
"index",
",");
foreachElement.addElement(new TextElement(primaryKeyParameterClause)); updateXmlElement.addElement(new TextElement(String.format("where %s in(", primaryKeyName))); updateXmlElement.addElement(foreachElement); updateXmlElement.addElement(new TextElement(")")); document.getRootElement().addElement(updateXmlElement);
} }
package com.kuta.base.mybatis.plugins; import java.util.Set;
import java.util.TreeSet; import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.JavaVisibility;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.config.Context; public class MethodGeneratorTool {
private final static String BATCH_INSERT = "batchInsert"; private final static String PARAMETER_NAME = "recordList"; private final static String DELETE_PARAMETER_NAME = "ids"; private final static String BATCH_UPDATE = "batchUpdate"; private final static String BATCH_DELETE = "batchDelete"; public final static Integer INSERT = 0; public final static Integer UPDATE = 1;
/**
* java方法生成构造器.
*
* @param methodName the method name
* @param visibility the visibility
* @param returnJavaType the return java type
* @param parameters the parameters
* @author HuWeihui
* @since hui_project v1
*/
public static Method methodGenerator(String methodName,
JavaVisibility visibility,
FullyQualifiedJavaType returnJavaType,
Parameter... parameters) {
Method method = new Method();
method.setName(methodName);
method.setVisibility(visibility);
method.setReturnType(returnJavaType);
for (Parameter parameter : parameters) {
method.addParameter(parameter);
}
return method;
} /**
* 导入基础的java类型
*
* @param introspectedTable the introspected table
* @return the set
* @author HuWeihui
* @since hui_project v1
*/
public static Set<FullyQualifiedJavaType> importedBaseTypesGenerator(IntrospectedTable introspectedTable){
//获取实体类类型
FullyQualifiedJavaType parameterType = introspectedTable.getRules().calculateAllFieldsClass();
//@Param需要导入的类型
FullyQualifiedJavaType paramType = new FullyQualifiedJavaType("org.apache.ibatis.annotations.Param");
//Integer类型
FullyQualifiedJavaType intInstance = FullyQualifiedJavaType.getIntInstance();
//List<Entity>
FullyQualifiedJavaType listParameterType = FullyQualifiedJavaType.getNewListInstance(); Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();
importedTypes.add(parameterType);
importedTypes.add(intInstance);
importedTypes.add(paramType);
importedTypes.add(listParameterType);
return importedTypes;
} /**
* 默认的批量新增/更新方法构造器.
*
* @param interfaze the interfaze
* @param introspectedTable the introspected table
* @param context the context
* @author HuWeihui
* @since hui_project v1
*/
public static void defaultBatchInsertOrUpdateMethodGen(Integer type ,Interface interfaze,IntrospectedTable introspectedTable, Context context){
//JAVA导入基础包
Set<FullyQualifiedJavaType> importedTypes = MethodGeneratorTool.importedBaseTypesGenerator(introspectedTable); //List<Entity>
FullyQualifiedJavaType listParameterType = FullyQualifiedJavaType.getNewListInstance();
listParameterType.addTypeArgument(introspectedTable.getRules().calculateAllFieldsClass()); String methodName = BATCH_INSERT;
//1.batchInsert
if (type.equals(UPDATE)){
methodName = BATCH_UPDATE;
}
Method insertMethod = MethodGeneratorTool.methodGenerator(methodName,
JavaVisibility.DEFAULT,
FullyQualifiedJavaType.getIntInstance(),
new Parameter(listParameterType, PARAMETER_NAME, "@Param(\"" + PARAMETER_NAME + "\")")); CommentGenerator commentGenerator = context.getCommentGenerator();
commentGenerator.addGeneralMethodComment(insertMethod, introspectedTable); interfaze.addImportedTypes(importedTypes);
interfaze.addMethod(insertMethod);
} /**
* 默认的批量删除方法构造器.
*
* @param interfaze the interfaze
* @param introspectedTable the introspected table
* @param context the context
* @author HuWeihui
* @since hui_project v1
*/
public static void defaultBatchDeleteMethodGen(Interface interfaze,IntrospectedTable introspectedTable, Context context){
//JAVA导入基础包
Set<FullyQualifiedJavaType> importedTypes = MethodGeneratorTool.importedBaseTypesGenerator(introspectedTable);
FullyQualifiedJavaType paramType = introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType();
Method batchDeleteMethod = MethodGeneratorTool.methodGenerator(BATCH_DELETE,
JavaVisibility.DEFAULT,
FullyQualifiedJavaType.getIntInstance(),
new Parameter(new FullyQualifiedJavaType(paramType.getFullyQualifiedName()+"[]"), DELETE_PARAMETER_NAME, "@Param(\""+DELETE_PARAMETER_NAME+"\")")); context.getCommentGenerator().addGeneralMethodComment(batchDeleteMethod,introspectedTable);
interfaze.addImportedTypes(importedTypes);
interfaze.addMethod(batchDeleteMethod);
}
}
3. 在pom的mybatis-generator-maven-plugin中加入以上代码所在库的依赖
mysql字段名和关键字冲突问题
1.在generatorConfig.xml中加入以下属性配置
<property name="beginningDelimiter" value="`"></property >
<property name="endingDelimiter" value="`"></property >
2. 在table节点加入delimitAllColumns="true"属性
生成的实体类继承基类
在generatorConfig.xml文件中的javaModelGenerator节点中加入以下属性配置
<property name="rootClass" value="com.kuta.base.database.entity.KutaDBEntity"/>
mapper继承基础接口,实现自己的代码
在generatorConfig.xml文件中的table节点加入以下属性配置
<property name="rootInterface" value="com.simcity.database.dao.extend.BuildMapperBase"/>
insert之后获取生成的ID
在generatorConfig.xml文件中的table节点加入以下属性配置
<generatedKey column="bid" sqlStatement="MySql" identity="true"/>
使实体可序列化
在generatorConfig.xml文件中加入以下属性配置
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
mybatis(mysql)代码生成器扩展的更多相关文章
- Spring boot + mybatis + mysql代码生成器
引入依赖: 在pom文件最下边: <build> <plugins> <!--逆向工程--> <plugin> <groupId>org.m ...
- SpringMVC+Spring+Mybatis+Mysql项目搭建
眼下俺在搭建一个自己的个人站点玩玩.一边练习.一边把用到的技术总结一下,日后好复习. 站点框架大致例如以下图所看到的: 眼下仅仅用到了SpringMVC+Spring+Mybatis+Mysql.把它 ...
- 0120 springboot集成Mybatis和代码生成器
在日常开发中,数据持久技术使用的架子使用频率最高的有3个,即spring-jdbc , spring-jpa, spring-mybatis.详情可以看我之前的一篇文章spring操作数据库的3个架子 ...
- PHP安装mysql.so扩展
在PHP中mysql_connect模块已经逐渐被弃用,我在搭建环境时也没有再安装mysql扩展,但是今天在维护一个老项目时,出现报错 Fatal error: Uncaught Error: Cal ...
- 解决springmvc+mybatis+mysql中文乱码问题【转】
这篇文章主要介绍了解决java中springmvc+mybatis+mysql中文乱码问题的相关资料,需要的朋友可以参考下 近日使用ajax请求springmvc后台查询mysql数据库,页面显示中文 ...
- Mybatis + Mysql 插入数据时中文乱码问题
近日跟朋友一起建立一个项目,用的是spring+mybatis+mysql. 今天碰到一个mybatis向mysql中插入数据时,中文显示为'???'的问题,拿出来说下. 对于数据库操作中出现的中文乱 ...
- 使用spring boot+mybatis+mysql 构建RESTful Service
开发目标 开发两个RESTful Service Method Url Description GET /article/findAll POST /article/insert 主要使用到的技术 j ...
- Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建(转)
这篇文章主要讲解使用eclipse对Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建过程,包括里面步骤和里面的配置文件如何配置等等都会详细说明. 如果还没有搭建好环境( ...
- freemarker + spring mvc + spring + mybatis + mysql + maven项目搭建
今天说说搭建项目,使用freemarker + spring mvc + spring + mybatis + mysql + maven搭建web项目. 先假设您已经配置好eclipse的maven ...
随机推荐
- hihoCoder 1052 基因工程 最详细的解题报告
题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K= ...
- PowerShell创建参考窗口
背景 平常我们经常遇到这样一个问题,在使用一个窗口工作时常常需要参考其他窗口的文字或图片,此时就需要频繁切换窗口:或者是看视频时需要参考前面进度的画面:或者是阅读或写文档时需要参考其他位置的文字,这时 ...
- TortoiseGit 解决冲突的两种方法
一.冲突发生原因: 用户A 有新提交 用户B 没有pull, 写新代码 ,pull , 提示有冲突 Solution: 1: stash save(把自己的代码隐藏存起来) -> 重新pul ...
- 曹工改bug--本来以为很简单的数据库字段长度不足的问题,最后竟然靠抓包才解决
问题描述 这两天本来忙着新功能开发,结果之前的一个项目最近要上了,然后又在测试,然后就喜提bug一枚(not mine),看bug描述,很简单,而且本地环境也重现了,只要刷入2000个英文字符就可以复 ...
- 软件测试工程师应该怎样规划自己?成为年薪30W+测试工程师(乾坤未定,皆是黑马)
今天在知乎上被邀了一个问题,软件测试工程师应该怎样规划自己?16年毕业,技术方面已经渣到不行,因为之前的公司没有Python自动化测试这个要求,有些迷茫.我把我的问题回答贴出来希望可以帮助到更多有类型 ...
- T133308 57级返校测试重测-T3-成绩单
大致题意: 给定n个学生的学号和分数, 求各个分数段的人数, 求把学号排序后的序列, 求满分的人数以及学号. 基本思路: 虽然看起来很繁琐(?),但就非常非常的简单,直接按题意做就好了. 然后有个坑, ...
- 跳过Google开机设置/验证/向导
Google 的开机设置向导,亦或称作开机验证,对于刷机党来说最熟悉不过了.一般情况下,刷类原生或是原生系统,再刷 Gapps,开机就需要进行一些 Google 验证.这些验证,与国内的手机厂商所设置 ...
- 设计模式:singleton模式
目的:限制类的实例个数只能是一个 例子: #define AGT_DECLARE_SINGLETON(ClassName) \ public: \ static ClassName *Instance ...
- mysql 格式化保存
win -e 'SELECT * from t_share_template;' | sed 's/\t/,/g' > aa.csv
- Logback配置文件这么写,还愁不会整理日志?
摘要: 1.日志输出到文件并根据LEVEL级别将日志分类保存到不同文件 2.通过异步输出日志减少磁盘IO提高性能 3.异步输出日志的原理 1.配置文件logback-spring.xml Spring ...