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.編寫外掛程式碼
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 25 @Override 26 public boolean validate(List<String> list) { 27 return true; 28 } 29 30 @Override 31 public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { 32 33 if (introspectedTable.getTargetRuntime().equals(IntrospectedTable.TargetRuntime.MYBATIS3)) { 34 MethodGeneratorTool.defaultBatchInsertOrUpdateMethodGen(MethodGeneratorTool.UPDATE, interfaze, introspectedTable, context); 35 } 36 return super.clientGenerated(interfaze, topLevelClass, introspectedTable); 37 } 38 39 @Override 40 public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { 41 if (introspectedTable.getTargetRuntime().equals(IntrospectedTable.TargetRuntime.MYBATIS3)) { 42 addSqlMapper(document, introspectedTable); 43 } 44 return super.sqlMapDocumentGenerated(document, introspectedTable); 45 } 46 47 public void addSqlMapper(Document document, IntrospectedTable introspectedTable) { 48 String tableName = introspectedTable.getFullyQualifiedTableNameAtRuntime(); 49 List<IntrospectedColumn> columnList = introspectedTable.getAllColumns(); 50 //primaryKey的JDBC名字 51 String primaryKeyName = introspectedTable.getPrimaryKeyColumns().get(0).getActualColumnName(); 52 53 //primaryKey的JAVA變數 54 String primaryKeyParameterClause = MyBatis3FormattingUtilities.getParameterClause(introspectedTable.getPrimaryKeyColumns().get(0), "item."); 55 56 //primaryKey的JAVA名字 57 String primaryKeyJavaName = introspectedTable.getPrimaryKeyColumns().get(0).getJavaProperty(); 58 59 60 XmlElement updateXmlElement = SqlMapperGeneratorTool.baseElementGenerator(SqlMapperGeneratorTool.UPDATE, 61 BATCH_UPDATE, 62 FullyQualifiedJavaType.getNewListInstance()); 63 updateXmlElement.addElement(new TextElement("<!-- generated by Kuta batchUpdate plugin - " 64 + MergeConstants.NEW_ELEMENT_TAG + " -->")); 65 updateXmlElement.addElement(new TextElement(String.format("update %s ", tableName))); 66 67 XmlElement trimElement = SqlMapperGeneratorTool.baseTrimElement("set", null, ","); 68 69 for (int i = 0; i < columnList.size(); i++) { 70 71 IntrospectedColumn introspectedColumn = columnList.get(i); 72 73 String columnName = introspectedColumn.getActualColumnName(); 74 75 String columnJavaTypeName = introspectedColumn.getJavaProperty("item."); 76 77 String parameterClause = MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, "item."); 78 79 80 if (introspectedColumn.isIdentity()) { 81 continue; 82 } 83 84 String ifSql = String.format("when %s then %s", primaryKeyParameterClause, parameterClause); 85 XmlElement ifElement = SqlMapperGeneratorTool.baseIfJudgeElementGen(columnJavaTypeName, ifSql, false); 86 87 String ifNullSql = String.format("when %s then %s", primaryKeyParameterClause, tableName + "." + columnName); 88 XmlElement ifNullElement = SqlMapperGeneratorTool.baseIfJudgeElementGen(columnJavaTypeName, ifNullSql, true); 89 90 91 XmlElement foreachElement = SqlMapperGeneratorTool.baseForeachElementGenerator(PARAMETER_NAME, "item", "index", null); 92 foreachElement.addElement(ifElement); 93 foreachElement.addElement(ifNullElement); 94 95 XmlElement caseTrimElement = SqlMapperGeneratorTool.baseTrimElement(columnName + " =case " + primaryKeyName, "end,", null); 96 caseTrimElement.addElement(foreachElement); 97 98 trimElement.addElement(caseTrimElement); 99 } 100 101 updateXmlElement.addElement(trimElement); 102 103 XmlElement foreachElement = SqlMapperGeneratorTool.baseForeachElementGenerator(PARAMETER_NAME, 104 "item", 105 "index", 106 ","); 107 foreachElement.addElement(new TextElement(primaryKeyParameterClause)); 108 109 updateXmlElement.addElement(new TextElement(String.format("where %s in(", primaryKeyName))); 110 111 updateXmlElement.addElement(foreachElement); 112 113 updateXmlElement.addElement(new TextElement(")")); 114 115 document.getRootElement().addElement(updateXmlElement); 116 } 117 118 119 120 121 122 }
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" />