mysql代码生成_mybatis(mysql)代码生成器扩展

前些天在做我的KSF框架的时候需要用到mybatis代码生成器,

但是发现有一些东西需要调整,主要集中在以下几点:

1. 加入batchInsert

2. 加入batchUpdate

3. mysql字段名和关键字冲突问题

4. 生成的实体类继承基类

5. mapper继承基础接口,实现自己的代码

6. insert之后获取生成的ID

7. 使实体可序列化

加入batchInsert

1.在generatorConfig.xml中加入以下插件

2.在pom的mybatis-generator-maven-plugin中加入以下依赖

com.itfsw

mybatis-generator-plugin

1.0.5

加入batchUpdate

1.在generatorConfig.xml中加入以下插件

2.编写插件代码

1 packagecom.kuta.base.mybatis.plugins;2

3 importjava.util.List;4

5 importorg.mybatis.generator.api.IntrospectedColumn;6 importorg.mybatis.generator.api.IntrospectedTable;7 importorg.mybatis.generator.api.dom.java.FullyQualifiedJavaType;8 importorg.mybatis.generator.api.dom.java.Interface;9 importorg.mybatis.generator.api.dom.java.TopLevelClass;10 importorg.mybatis.generator.api.dom.xml.Document;11 importorg.mybatis.generator.api.dom.xml.TextElement;12 importorg.mybatis.generator.api.dom.xml.XmlElement;13 importorg.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;14 importorg.mybatis.generator.config.MergeConstants;15

16 importcom.kuta.base.database.util.SqlMapperGeneratorTool;17

18 public class KutaBatchUpdatePlugin extendsorg.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 @Override26 public boolean validate(Listlist) {27 return true;28 }29

30 @Override31 public booleanclientGenerated(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 @Override40 public booleansqlMapDocumentGenerated(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 voidaddSqlMapper(Document document, IntrospectedTable introspectedTable) {48 String tableName =introspectedTable.getFullyQualifiedTableNameAtRuntime();49 List 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(""));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(newTextElement(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 packagecom.kuta.base.mybatis.plugins;2

3 importjava.util.Set;4 importjava.util.TreeSet;5

6 importorg.mybatis.generator.api.CommentGenerator;7 importorg.mybatis.generator.api.IntrospectedTable;8 importorg.mybatis.generator.api.dom.java.FullyQualifiedJavaType;9 importorg.mybatis.generator.api.dom.java.Interface;10 importorg.mybatis.generator.api.dom.java.JavaVisibility;11 importorg.mybatis.generator.api.dom.java.Method;12 importorg.mybatis.generator.api.dom.java.Parameter;13 importorg.mybatis.generator.config.Context;14

15 public classMethodGeneratorTool {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 *@parammethodName the method name33 *@paramvisibility the visibility34 *@paramreturnJavaType the return java type35 *@paramparameters the parameters36 *@authorHuWeihui37 *@sincehui_project v138 */

39 public staticMethod methodGenerator(String methodName,40 JavaVisibility visibility,41 FullyQualifiedJavaType returnJavaType,42 Parameter... parameters) {43 Method method = newMethod();44 method.setName(methodName);45 method.setVisibility(visibility);46 method.setReturnType(returnJavaType);47 for(Parameter parameter : parameters) {48 method.addParameter(parameter);49 }50 returnmethod;51 }52

53 /**

54 * 导入基础的java类型55 *56 *@paramintrospectedTable the introspected table57 *@returnthe set58 *@authorHuWeihui59 *@sincehui_project v160 */

61 public static SetimportedBaseTypesGenerator(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

69 FullyQualifiedJavaType listParameterType =FullyQualifiedJavaType.getNewListInstance();70

71 Set importedTypes = new TreeSet();72 importedTypes.add(parameterType);73 importedTypes.add(intInstance);74 importedTypes.add(paramType);75 importedTypes.add(listParameterType);76 returnimportedTypes;77 }78

79 /**

80 * 默认的批量新增/更新方法构造器.81 *82 *@paraminterfaze the interfaze83 *@paramintrospectedTable the introspected table84 *@paramcontext the context85 *@authorHuWeihui86 *@sincehui_project v187 */

88 public static voiddefaultBatchInsertOrUpdateMethodGen(Integer type ,Interface interfaze,IntrospectedTable introspectedTable, Context context){89 //JAVA导入基础包

90 Set importedTypes =MethodGeneratorTool.importedBaseTypesGenerator(introspectedTable);91

92 //List

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 *@paraminterfaze the interfaze117 *@paramintrospectedTable the introspected table118 *@paramcontext the context119 *@authorHuWeihui120 *@sincehui_project v1121 */

122 public static voiddefaultBatchDeleteMethodGen(Interface interfaze,IntrospectedTable introspectedTable, Context context){123 //JAVA导入基础包

124 Set 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中加入以下属性配置

2. 在table节点加入delimitAllColumns="true"属性

生成的实体类继承基类

在generatorConfig.xml文件中的javaModelGenerator节点中加入以下属性配置

mapper继承基础接口,实现自己的代码

在generatorConfig.xml文件中的table节点加入以下属性配置

insert之后获取生成的ID

在generatorConfig.xml文件中的table节点加入以下属性配置

使实体可序列化

在generatorConfig.xml文件中加入以下属性配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值