前些天在做我的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.编写插件代码

  1. package com.kuta.base.mybatis.plugins;
  2.  
  3. import java.util.List;
  4.  
  5. import org.mybatis.generator.api.IntrospectedColumn;
  6. import org.mybatis.generator.api.IntrospectedTable;
  7. import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
  8. import org.mybatis.generator.api.dom.java.Interface;
  9. import org.mybatis.generator.api.dom.java.TopLevelClass;
  10. import org.mybatis.generator.api.dom.xml.Document;
  11. import org.mybatis.generator.api.dom.xml.TextElement;
  12. import org.mybatis.generator.api.dom.xml.XmlElement;
  13. import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
  14. import org.mybatis.generator.config.MergeConstants;
  15.  
  16. import com.kuta.base.database.util.SqlMapperGeneratorTool;
  17.  
  18. public class KutaBatchUpdatePlugin extends org.mybatis.generator.api.PluginAdapter{
  19.  
  20. private final static String BATCH_UPDATE = "batchUpdate";
  21.  
  22. private final static String PARAMETER_NAME = "recordList";
  23.  
  24. @Override
  25. public boolean validate(List<String> list) {
  26. return true;
  27. }
  28.  
  29. @Override
  30. public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
  31.  
  32. if (introspectedTable.getTargetRuntime().equals(IntrospectedTable.TargetRuntime.MYBATIS3)) {
  33. MethodGeneratorTool.defaultBatchInsertOrUpdateMethodGen(MethodGeneratorTool.UPDATE, interfaze, introspectedTable, context);
  34. }
  35. return super.clientGenerated(interfaze, topLevelClass, introspectedTable);
  36. }
  37.  
  38. @Override
  39. public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
  40. if (introspectedTable.getTargetRuntime().equals(IntrospectedTable.TargetRuntime.MYBATIS3)) {
  41. addSqlMapper(document, introspectedTable);
  42. }
  43. return super.sqlMapDocumentGenerated(document, introspectedTable);
  44. }
  45.  
  46. public void addSqlMapper(Document document, IntrospectedTable introspectedTable) {
  47. String tableName = introspectedTable.getFullyQualifiedTableNameAtRuntime();
  48. List<IntrospectedColumn> columnList = introspectedTable.getAllColumns();
  49. //primaryKey的JDBC名字
  50. String primaryKeyName = introspectedTable.getPrimaryKeyColumns().get(0).getActualColumnName();
  51.  
  52. //primaryKey的JAVA变量
  53. String primaryKeyParameterClause = MyBatis3FormattingUtilities.getParameterClause(introspectedTable.getPrimaryKeyColumns().get(0), "item.");
  54.  
  55. //primaryKey的JAVA名字
  56. String primaryKeyJavaName = introspectedTable.getPrimaryKeyColumns().get(0).getJavaProperty();
  57.  
  58. XmlElement updateXmlElement = SqlMapperGeneratorTool.baseElementGenerator(SqlMapperGeneratorTool.UPDATE,
  59. BATCH_UPDATE,
  60. FullyQualifiedJavaType.getNewListInstance());
  61. updateXmlElement.addElement(new TextElement("<!-- generated by Kuta batchUpdate plugin - "
  62. + MergeConstants.NEW_ELEMENT_TAG + " -->"));
  63. updateXmlElement.addElement(new TextElement(String.format("update %s ", tableName)));
  64.  
  65. XmlElement trimElement = SqlMapperGeneratorTool.baseTrimElement("set", null, ",");
  66.  
  67. for (int i = 0; i < columnList.size(); i++) {
  68.  
  69. IntrospectedColumn introspectedColumn = columnList.get(i);
  70.  
  71. String columnName = introspectedColumn.getActualColumnName();
  72.  
  73. String columnJavaTypeName = introspectedColumn.getJavaProperty("item.");
  74.  
  75. String parameterClause = MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, "item.");
  76.  
  77. if (introspectedColumn.isIdentity()) {
  78. continue;
  79. }
  80.  
  81. String ifSql = String.format("when %s then %s", primaryKeyParameterClause, parameterClause);
  82. XmlElement ifElement = SqlMapperGeneratorTool.baseIfJudgeElementGen(columnJavaTypeName, ifSql, false);
  83.  
  84. String ifNullSql = String.format("when %s then %s", primaryKeyParameterClause, tableName + "." + columnName);
  85. XmlElement ifNullElement = SqlMapperGeneratorTool.baseIfJudgeElementGen(columnJavaTypeName, ifNullSql, true);
  86.  
  87. XmlElement foreachElement = SqlMapperGeneratorTool.baseForeachElementGenerator(PARAMETER_NAME, "item", "index", null);
  88. foreachElement.addElement(ifElement);
  89. foreachElement.addElement(ifNullElement);
  90.  
  91. XmlElement caseTrimElement = SqlMapperGeneratorTool.baseTrimElement(columnName + " =case " + primaryKeyName, "end,", null);
  92. caseTrimElement.addElement(foreachElement);
  93.  
  94. trimElement.addElement(caseTrimElement);
  95. }
  96.  
  97. updateXmlElement.addElement(trimElement);
  98.  
  99. XmlElement foreachElement = SqlMapperGeneratorTool.baseForeachElementGenerator(PARAMETER_NAME,
  100. "item",
  101. "index",
  102. ",");
  103. foreachElement.addElement(new TextElement(primaryKeyParameterClause));
  104.  
  105. updateXmlElement.addElement(new TextElement(String.format("where %s in(", primaryKeyName)));
  106.  
  107. updateXmlElement.addElement(foreachElement);
  108.  
  109. updateXmlElement.addElement(new TextElement(")"));
  110.  
  111. document.getRootElement().addElement(updateXmlElement);
  112. }
  113.  
  114. }
  1. package com.kuta.base.mybatis.plugins;
  2.  
  3. import java.util.Set;
  4. import java.util.TreeSet;
  5.  
  6. import org.mybatis.generator.api.CommentGenerator;
  7. import org.mybatis.generator.api.IntrospectedTable;
  8. import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
  9. import org.mybatis.generator.api.dom.java.Interface;
  10. import org.mybatis.generator.api.dom.java.JavaVisibility;
  11. import org.mybatis.generator.api.dom.java.Method;
  12. import org.mybatis.generator.api.dom.java.Parameter;
  13. import org.mybatis.generator.config.Context;
  14.  
  15. public class MethodGeneratorTool {
  16. private final static String BATCH_INSERT = "batchInsert";
  17.  
  18. private final static String PARAMETER_NAME = "recordList";
  19.  
  20. private final static String DELETE_PARAMETER_NAME = "ids";
  21.  
  22. private final static String BATCH_UPDATE = "batchUpdate";
  23.  
  24. private final static String BATCH_DELETE = "batchDelete";
  25.  
  26. public final static Integer INSERT = 0;
  27.  
  28. public final static Integer UPDATE = 1;
  29. /**
  30. * java方法生成构造器.
  31. *
  32. * @param methodName the method name
  33. * @param visibility the visibility
  34. * @param returnJavaType the return java type
  35. * @param parameters the parameters
  36. * @author HuWeihui
  37. * @since hui_project v1
  38. */
  39. public static Method methodGenerator(String methodName,
  40. JavaVisibility visibility,
  41. FullyQualifiedJavaType returnJavaType,
  42. Parameter... parameters) {
  43. Method method = new Method();
  44. method.setName(methodName);
  45. method.setVisibility(visibility);
  46. method.setReturnType(returnJavaType);
  47. for (Parameter parameter : parameters) {
  48. method.addParameter(parameter);
  49. }
  50. return method;
  51. }
  52.  
  53. /**
  54. * 导入基础的java类型
  55. *
  56. * @param introspectedTable the introspected table
  57. * @return the set
  58. * @author HuWeihui
  59. * @since hui_project v1
  60. */
  61. public static Set<FullyQualifiedJavaType> importedBaseTypesGenerator(IntrospectedTable introspectedTable){
  62. //获取实体类类型
  63. FullyQualifiedJavaType parameterType = introspectedTable.getRules().calculateAllFieldsClass();
  64. //@Param需要导入的类型
  65. FullyQualifiedJavaType paramType = new FullyQualifiedJavaType("org.apache.ibatis.annotations.Param");
  66. //Integer类型
  67. FullyQualifiedJavaType intInstance = FullyQualifiedJavaType.getIntInstance();
  68. //List<Entity>
  69. FullyQualifiedJavaType listParameterType = FullyQualifiedJavaType.getNewListInstance();
  70.  
  71. Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();
  72. importedTypes.add(parameterType);
  73. importedTypes.add(intInstance);
  74. importedTypes.add(paramType);
  75. importedTypes.add(listParameterType);
  76. return importedTypes;
  77. }
  78.  
  79. /**
  80. * 默认的批量新增/更新方法构造器.
  81. *
  82. * @param interfaze the interfaze
  83. * @param introspectedTable the introspected table
  84. * @param context the context
  85. * @author HuWeihui
  86. * @since hui_project v1
  87. */
  88. public static void defaultBatchInsertOrUpdateMethodGen(Integer type ,Interface interfaze,IntrospectedTable introspectedTable, Context context){
  89. //JAVA导入基础包
  90. Set<FullyQualifiedJavaType> importedTypes = MethodGeneratorTool.importedBaseTypesGenerator(introspectedTable);
  91.  
  92. //List<Entity>
  93. FullyQualifiedJavaType listParameterType = FullyQualifiedJavaType.getNewListInstance();
  94. listParameterType.addTypeArgument(introspectedTable.getRules().calculateAllFieldsClass());
  95.  
  96. String methodName = BATCH_INSERT;
  97. //1.batchInsert
  98. if (type.equals(UPDATE)){
  99. methodName = BATCH_UPDATE;
  100. }
  101. Method insertMethod = MethodGeneratorTool.methodGenerator(methodName,
  102. JavaVisibility.DEFAULT,
  103. FullyQualifiedJavaType.getIntInstance(),
  104. new Parameter(listParameterType, PARAMETER_NAME, "@Param(\"" + PARAMETER_NAME + "\")"));
  105.  
  106. CommentGenerator commentGenerator = context.getCommentGenerator();
  107. commentGenerator.addGeneralMethodComment(insertMethod, introspectedTable);
  108.  
  109. interfaze.addImportedTypes(importedTypes);
  110. interfaze.addMethod(insertMethod);
  111. }
  112.  
  113. /**
  114. * 默认的批量删除方法构造器.
  115. *
  116. * @param interfaze the interfaze
  117. * @param introspectedTable the introspected table
  118. * @param context the context
  119. * @author HuWeihui
  120. * @since hui_project v1
  121. */
  122. public static void defaultBatchDeleteMethodGen(Interface interfaze,IntrospectedTable introspectedTable, Context context){
  123. //JAVA导入基础包
  124. Set<FullyQualifiedJavaType> importedTypes = MethodGeneratorTool.importedBaseTypesGenerator(introspectedTable);
  125. FullyQualifiedJavaType paramType = introspectedTable.getPrimaryKeyColumns().get(0).getFullyQualifiedJavaType();
  126. Method batchDeleteMethod = MethodGeneratorTool.methodGenerator(BATCH_DELETE,
  127. JavaVisibility.DEFAULT,
  128. FullyQualifiedJavaType.getIntInstance(),
  129. new Parameter(new FullyQualifiedJavaType(paramType.getFullyQualifiedName()+"[]"), DELETE_PARAMETER_NAME, "@Param(\""+DELETE_PARAMETER_NAME+"\")"));
  130.  
  131. context.getCommentGenerator().addGeneralMethodComment(batchDeleteMethod,introspectedTable);
  132. interfaze.addImportedTypes(importedTypes);
  133. interfaze.addMethod(batchDeleteMethod);
  134. }
  135. }

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)代码生成器扩展的更多相关文章

  1. Spring boot + mybatis + mysql代码生成器

    引入依赖: 在pom文件最下边: <build> <plugins> <!--逆向工程--> <plugin> <groupId>org.m ...

  2. SpringMVC+Spring+Mybatis+Mysql项目搭建

    眼下俺在搭建一个自己的个人站点玩玩.一边练习.一边把用到的技术总结一下,日后好复习. 站点框架大致例如以下图所看到的: 眼下仅仅用到了SpringMVC+Spring+Mybatis+Mysql.把它 ...

  3. 0120 springboot集成Mybatis和代码生成器

    在日常开发中,数据持久技术使用的架子使用频率最高的有3个,即spring-jdbc , spring-jpa, spring-mybatis.详情可以看我之前的一篇文章spring操作数据库的3个架子 ...

  4. PHP安装mysql.so扩展

    在PHP中mysql_connect模块已经逐渐被弃用,我在搭建环境时也没有再安装mysql扩展,但是今天在维护一个老项目时,出现报错 Fatal error: Uncaught Error: Cal ...

  5. 解决springmvc+mybatis+mysql中文乱码问题【转】

    这篇文章主要介绍了解决java中springmvc+mybatis+mysql中文乱码问题的相关资料,需要的朋友可以参考下 近日使用ajax请求springmvc后台查询mysql数据库,页面显示中文 ...

  6. Mybatis + Mysql 插入数据时中文乱码问题

    近日跟朋友一起建立一个项目,用的是spring+mybatis+mysql. 今天碰到一个mybatis向mysql中插入数据时,中文显示为'???'的问题,拿出来说下. 对于数据库操作中出现的中文乱 ...

  7. 使用spring boot+mybatis+mysql 构建RESTful Service

    开发目标 开发两个RESTful Service Method Url Description GET /article/findAll POST /article/insert 主要使用到的技术 j ...

  8. Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建(转)

    这篇文章主要讲解使用eclipse对Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建过程,包括里面步骤和里面的配置文件如何配置等等都会详细说明. 如果还没有搭建好环境( ...

  9. freemarker + spring mvc + spring + mybatis + mysql + maven项目搭建

    今天说说搭建项目,使用freemarker + spring mvc + spring + mybatis + mysql + maven搭建web项目. 先假设您已经配置好eclipse的maven ...

随机推荐

  1. vue 集成html5 plus

    首先要安装一个包 vue-html5plus npm i vue-html5plus -S 然后配置这个文件 在main.js添加一串代码 var onPlusReady = function (ca ...

  2. Python Hacking Tools - Web Scraper

    Preparation: Python Libray in the following programming: 1. Requests Document: https://2.python-requ ...

  3. .NET Core ResponseCache【缓存篇(一)】

    一.前言 源码   1.最近一直在看项目性能优化方式,俗话说的好项目优化第一步那当然是添加缓存,我们的项目之所以卡的和鬼一样,要么就是你的代码循环查询数据库(这个之前在我们的项目中经常出现,现在慢慢在 ...

  4. Java常用开源库

    Java的经久不衰,很大程度上得益于Java的生态好.在日常开发中,我们也会经常使用到各种开源库和工具类,为了避免重复造轮子,本文将贴出工作及学习中会用到的部分开源库和工具类.Java的生态实在太大, ...

  5. docker环境部署mysql

    参考文档 docker官方:https://hub.docker.com/_/mysql/?tab=description 部署步骤 1. 拉取镜像 这里我拉取了tag为5.7的镜像 docker p ...

  6. 设计模式:command模式

    目的:将命令设计成类的形式,并可以组织成队列 优点: 在需要的情况下,可以比较容易地将命令记入日志 可以容易的实现对请求的撤销和重做 由于新的具体命令类不影响其他的命令类,因此增加新的具体命令类很容易 ...

  7. python爬虫入门(5)----- 阿里巴巴供应商爬虫

    阿里巴巴供应商爬虫# 起因## 学了爬虫入门之后,打算找一个有难度的网站来实践,一开始打算找淘宝或者天猫(业界老大)来实践,但后续发现网上已经有很多这方面的项目,于是瞄上了阿里的国际网站阿里巴巴.开始 ...

  8. web自动化 -- Keys(键盘操作)

    Keys没啥好讲的 语法:Keys.CONTRAL    等等类似. 下方就是可以  Keys.   跟的键 那些 \ue000  就是对应的  Windows系统中的键盘码,pywin32 也一样的 ...

  9. js获取json对象的属性值

    //   var responseData = response.data.result;             for (var r in responseData) {              ...

  10. 21天学通PythonPDF高清完整版免费下载|百度云盘

    百度云盘:21天学通PythonPDF高清完整版免费下载 提取码:nqa9 豆瓣评分: 书籍封面: 内容简介  · · · · · · <21天学通Python>全面.系统.深入地讲解了P ...