diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/BatchInsertPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/BatchInsertPlugin.java index eb20b51..c0a1ce0 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/BatchInsertPlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/BatchInsertPlugin.java @@ -231,7 +231,7 @@ public class BatchInsertPlugin extends BasePlugin { foreachInsertColumns.addAttribute(new Attribute("collection", "selective")); foreachInsertColumns.addAttribute(new Attribute("item", "column")); foreachInsertColumns.addAttribute(new Attribute("separator", ",")); - foreachInsertColumns.addElement(new TextElement("${column.value}")); + foreachInsertColumns.addElement(new TextElement("${column.escapedColumnName}")); eles.add(foreachInsertColumns); diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/IncrementsPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/IncrementsPlugin.java index fcd4411..75811cc 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/IncrementsPlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/IncrementsPlugin.java @@ -329,7 +329,7 @@ public class IncrementsPlugin extends BasePlugin implements IModelBuilderPluginH sb.append("column.value"); when.addAttribute(new Attribute("test", sb.toString())); - when.addElement(new TextElement("${column.value} = ${column.value} ${record." + FIELD_INC_MAP + "." + when.addElement(new TextElement("${column.escapedColumnName} = ${column.escapedColumnName} ${record." + FIELD_INC_MAP + "." + introspectedColumn.getActualColumnName() + ".value} #{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); choose.addElement(when); @@ -338,13 +338,13 @@ public class IncrementsPlugin extends BasePlugin implements IModelBuilderPluginH if (versionColumn == null) { XmlElement otherwise = new XmlElement("otherwise"); - otherwise.addElement(new TextElement("${column.value} = #{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); + otherwise.addElement(new TextElement("${column.escapedColumnName} = #{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); choose.addElement(otherwise); } else { XmlElement when = new XmlElement("when"); when.addAttribute(new Attribute("test", "column.value != '" + versionColumn.getActualColumnName() + "'.toString()")); - when.addElement(new TextElement("${column.value} = #{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); + when.addElement(new TextElement("${column.escapedColumnName} = #{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); choose.addElement(when); } diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/ModelColumnPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/ModelColumnPlugin.java index eb8c67d..0b9994f 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/ModelColumnPlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/ModelColumnPlugin.java @@ -23,6 +23,7 @@ import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.dom.java.*; import org.mybatis.generator.internal.util.JavaBeansUtil; +import org.mybatis.generator.internal.util.StringUtility; /** * --------------------------------------------------------------------------- @@ -35,6 +36,12 @@ import org.mybatis.generator.internal.util.JavaBeansUtil; public class ModelColumnPlugin extends BasePlugin { public static final String ENUM_NAME = "Column"; // 内部Enum名 public static final String METHOD_EXCLUDES = "excludes"; // 方法名 + public static final String METHOD_GET_ESCAPED_COLUMN_NAME = "getEscapedColumnName"; // 方法名 + public static final String METHOD_GET_ALIASED_ESCAPED_COLUMN_NAME = "getAliasedEscapedColumnName"; // 方法名 + + public static final String CONST_BEGINNING_DELIMITER = "BEGINNING_DELIMITER"; // const + public static final String CONST_ENDING_DELIMITER = "ENDING_DELIMITER"; // const + public static final String CONST_TABLE_ALIAS = "TABLE_ALIAS"; // const /** * Model Methods 生成 @@ -88,6 +95,29 @@ public class ModelColumnPlugin extends BasePlugin { commentGenerator.addEnumComment(innerEnum, introspectedTable); logger.debug("itfsw(数据Model属性对应Column获取插件):" + topLevelClass.getType().getShortName() + "增加内部Builder类。"); + // 生成常量 + Field beginningDelimiterField = JavaElementGeneratorTools.generateField( + CONST_BEGINNING_DELIMITER, + JavaVisibility.PRIVATE, + FullyQualifiedJavaType.getStringInstance(), + "\"" + StringUtility.escapeStringForJava(context.getBeginningDelimiter()) + "\"" + ); + beginningDelimiterField.setStatic(true); + beginningDelimiterField.setFinal(true); + commentGenerator.addFieldComment(beginningDelimiterField, introspectedTable); + innerEnum.addField(beginningDelimiterField); + + Field endingDelimiterField = JavaElementGeneratorTools.generateField( + CONST_ENDING_DELIMITER, + JavaVisibility.PRIVATE, + FullyQualifiedJavaType.getStringInstance(), + "\"" + StringUtility.escapeStringForJava(context.getEndingDelimiter()) + "\"" + ); + endingDelimiterField.setStatic(true); + endingDelimiterField.setFinal(true); + commentGenerator.addFieldComment(endingDelimiterField, introspectedTable); + innerEnum.addField(endingDelimiterField); + // 生成属性和构造函数 Field columnField = new Field("column", FullyQualifiedJavaType.getStringInstance()); columnField.setVisibility(JavaVisibility.PRIVATE); @@ -95,6 +125,12 @@ public class ModelColumnPlugin extends BasePlugin { commentGenerator.addFieldComment(columnField, introspectedTable); innerEnum.addField(columnField); + Field isColumnNameDelimitedField = new Field("isColumnNameDelimited", FullyQualifiedJavaType.getBooleanPrimitiveInstance()); + isColumnNameDelimitedField.setVisibility(JavaVisibility.PRIVATE); + isColumnNameDelimitedField.setFinal(true); + commentGenerator.addFieldComment(isColumnNameDelimitedField, introspectedTable); + innerEnum.addField(isColumnNameDelimitedField); + Field javaPropertyField = new Field("javaProperty", FullyQualifiedJavaType.getStringInstance()); javaPropertyField.setVisibility(JavaVisibility.PRIVATE); javaPropertyField.setFinal(true); @@ -134,9 +170,11 @@ public class ModelColumnPlugin extends BasePlugin { constructor.addBodyLine("this.column = column;"); constructor.addBodyLine("this.javaProperty = javaProperty;"); constructor.addBodyLine("this.jdbcType = jdbcType;"); + constructor.addBodyLine("this.isColumnNameDelimited = isColumnNameDelimited;"); constructor.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "column")); constructor.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "javaProperty")); constructor.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), "jdbcType")); + constructor.addParameter(new Parameter(FullyQualifiedJavaType.getBooleanPrimitiveInstance(), "isColumnNameDelimited")); commentGenerator.addGeneralMethodComment(constructor, introspectedTable); FormatTools.addMethodWithBestPosition(innerEnum, constructor); logger.debug("itfsw(数据Model属性对应Column获取插件):" + topLevelClass.getType().getShortName() + ".Column增加构造方法和column属性。"); @@ -153,7 +191,9 @@ public class ModelColumnPlugin extends BasePlugin { sb.append(introspectedColumn.getJavaProperty()); sb.append("\", \""); sb.append(introspectedColumn.getJdbcTypeName()); - sb.append("\")"); + sb.append("\", "); + sb.append(introspectedColumn.isColumnNameDelimited()); + sb.append(")"); innerEnum.addEnumConstant(sb.toString()); logger.debug("itfsw(数据Model属性对应Column获取插件):" + topLevelClass.getType().getShortName() + ".Column增加" + field.getName() + "枚举。"); @@ -197,6 +237,73 @@ public class ModelColumnPlugin extends BasePlugin { FormatTools.addMethodWithBestPosition(innerEnum, mExcludes); logger.debug("itfsw(数据Model属性对应Column获取插件):" + topLevelClass.getType().getShortName() + ".Column增加excludes方法。"); + // getEscapedColumnName + Method mGetEscapedColumnName = JavaElementGeneratorTools.generateMethod( + METHOD_GET_ESCAPED_COLUMN_NAME, + JavaVisibility.PUBLIC, + FullyQualifiedJavaType.getStringInstance() + ); + commentGenerator.addGeneralMethodComment(mGetEscapedColumnName, introspectedTable); + JavaElementGeneratorTools.generateMethodBody( + mGetEscapedColumnName, + "if (this.isColumnNameDelimited) {", + "StringBuilder sb = new StringBuilder();", + "sb.append(" + CONST_BEGINNING_DELIMITER + ");", + "sb.append(this.column);", + "sb.append(" + CONST_ENDING_DELIMITER + ");", + "return sb.toString();", + "} else {", + "return this.column;", + "}" + ); + FormatTools.addMethodWithBestPosition(innerEnum, mGetEscapedColumnName); + logger.debug("itfsw(数据Model属性对应Column获取插件):" + topLevelClass.getType().getShortName() + ".Column增加getEscapedColumnName方法。"); + + // getAliasedEscapedColumnName + if (StringUtility.stringHasValue(introspectedTable.getTableConfiguration().getAlias())) { + // 生成常量 + Field tableAliasField = JavaElementGeneratorTools.generateField( + CONST_TABLE_ALIAS, + JavaVisibility.PRIVATE, + FullyQualifiedJavaType.getStringInstance(), + "\"" + StringUtility.escapeStringForJava(introspectedTable.getTableConfiguration().getAlias()) + "\"" + ); + tableAliasField.setStatic(true); + tableAliasField.setFinal(true); + commentGenerator.addFieldComment(tableAliasField, introspectedTable); + innerEnum.addField(tableAliasField); + + Method mGetAliasedEscapedColumnName = JavaElementGeneratorTools.generateMethod( + METHOD_GET_ALIASED_ESCAPED_COLUMN_NAME, + JavaVisibility.PUBLIC, + FullyQualifiedJavaType.getStringInstance() + ); + commentGenerator.addGeneralMethodComment(mGetAliasedEscapedColumnName, introspectedTable); + JavaElementGeneratorTools.generateMethodBody( + mGetAliasedEscapedColumnName, + "StringBuilder sb = new StringBuilder();", + "sb.append(" + CONST_TABLE_ALIAS + ");", + "sb.append('.');", + "sb.append(this.getEscapedColumnName());", + "return sb.toString();" + ); + FormatTools.addMethodWithBestPosition(innerEnum, mGetAliasedEscapedColumnName); + logger.debug("itfsw(数据Model属性对应Column获取插件):" + topLevelClass.getType().getShortName() + ".Column增加getAliasedEscapedColumnName方法。"); + } else { + Method mGetAliasedEscapedColumnName = JavaElementGeneratorTools.generateMethod( + METHOD_GET_ALIASED_ESCAPED_COLUMN_NAME, + JavaVisibility.PUBLIC, + FullyQualifiedJavaType.getStringInstance() + ); + commentGenerator.addGeneralMethodComment(mGetAliasedEscapedColumnName, introspectedTable); + JavaElementGeneratorTools.generateMethodBody( + mGetAliasedEscapedColumnName, + "return this." + METHOD_GET_ESCAPED_COLUMN_NAME + "();" + ); + FormatTools.addMethodWithBestPosition(innerEnum, mGetAliasedEscapedColumnName); + logger.debug("itfsw(数据Model属性对应Column获取插件):" + topLevelClass.getType().getShortName() + ".Column增加getAliasedEscapedColumnName方法。"); + } + return innerEnum; } } diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectSelectivePlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectSelectivePlugin.java index 16ee100..d73456e 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectSelectivePlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectSelectivePlugin.java @@ -336,7 +336,7 @@ public class SelectSelectivePlugin extends BasePlugin implements ISelectOneByExa keysEle.addAttribute(new Attribute("collection", "selective")); keysEle.addAttribute(new Attribute("item", "column")); keysEle.addAttribute(new Attribute("separator", ",")); - keysEle.addElement(new TextElement("${column.value}")); + keysEle.addElement(new TextElement("${column.escapedColumnName}")); XmlElement otherwiseEle = new XmlElement("otherwise"); chooseEle.addElement(otherwiseEle); diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectiveEnhancedPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectiveEnhancedPlugin.java index 720646e..dc76d5a 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/SelectiveEnhancedPlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/SelectiveEnhancedPlugin.java @@ -397,7 +397,7 @@ public class SelectiveEnhancedPlugin extends BasePlugin implements IUpsertPlugin insertForeachEle.addAttribute(new Attribute("open", "(")); insertForeachEle.addAttribute(new Attribute("separator", ",")); insertForeachEle.addAttribute(new Attribute("close", ")")); - insertForeachEle.addElement(new TextElement("${column.value}")); + insertForeachEle.addElement(new TextElement("${column.escapedColumnName}")); insertWhenEle.addElement(insertForeachEle); XmlElement insertOtherwiseEle = new XmlElement("otherwise"); @@ -483,13 +483,13 @@ public class SelectiveEnhancedPlugin extends BasePlugin implements IUpsertPlugin Element incrementEle = PluginTools.getHook(IIncrementsPluginHook.class).incrementSetsWithSelectiveEnhancedPluginElementGenerated(versionColumn); // 普通情况 if (incrementEle == null && versionColumn == null) { - setForeachEle.addElement(new TextElement("${column.value} = #{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); + setForeachEle.addElement(new TextElement("${column.escapedColumnName} = #{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); } else if (incrementEle != null) { setForeachEle.addElement(incrementEle); } else if (versionColumn != null) { XmlElement ifEle = new XmlElement("if"); ifEle.addAttribute(new Attribute("test", "column.value != '" + versionColumn.getActualColumnName() + "'.toString()")); - ifEle.addElement(new TextElement("${column.value} = #{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); + ifEle.addElement(new TextElement("${column.escapedColumnName} = #{record.${column.javaProperty},jdbcType=${column.jdbcType}}")); setForeachEle.addElement(ifEle); } diff --git a/src/main/java/com/itfsw/mybatis/generator/plugins/UpsertPlugin.java b/src/main/java/com/itfsw/mybatis/generator/plugins/UpsertPlugin.java index 7d08452..603c502 100644 --- a/src/main/java/com/itfsw/mybatis/generator/plugins/UpsertPlugin.java +++ b/src/main/java/com/itfsw/mybatis/generator/plugins/UpsertPlugin.java @@ -295,7 +295,7 @@ public class UpsertPlugin extends BasePlugin { foreachInsertColumns.addAttribute(new Attribute("collection", "selective")); foreachInsertColumns.addAttribute(new Attribute("item", "column")); foreachInsertColumns.addAttribute(new Attribute("separator", ",")); - foreachInsertColumns.addElement(new TextElement("${column.value}")); + foreachInsertColumns.addElement(new TextElement("${column.escapedColumnName}")); insertEle.addElement(foreachInsertColumns); @@ -342,7 +342,7 @@ public class UpsertPlugin extends BasePlugin { foreachSetColumns.addAttribute(new Attribute("collection", "selective")); foreachSetColumns.addAttribute(new Attribute("item", "column")); foreachSetColumns.addAttribute(new Attribute("separator", ",")); - foreachSetColumns.addElement(new TextElement("${column.value} = values(${column.value})")); + foreachSetColumns.addElement(new TextElement("${column.escapedColumnName} = values(${column.escapedColumnName})")); document.getRootElement().addElement(insertEle); logger.debug("itfsw(存在即更新插件):" + introspectedTable.getMyBatis3XmlMapperFileName() + "增加batchUpsertSelective实现方法。"); diff --git a/src/test/java/com/itfsw/mybatis/generator/plugins/BugFixedTest.java b/src/test/java/com/itfsw/mybatis/generator/plugins/BugFixedTest.java new file mode 100644 index 0000000..d981b81 --- /dev/null +++ b/src/test/java/com/itfsw/mybatis/generator/plugins/BugFixedTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.itfsw.mybatis.generator.plugins; + +import com.itfsw.mybatis.generator.plugins.tools.*; +import org.apache.ibatis.session.SqlSession; +import org.junit.Assert; +import org.junit.Test; + +import java.lang.reflect.Array; + +/** + * --------------------------------------------------------------------------- + * + * --------------------------------------------------------------------------- + * @author: hewei + * @time:2018/5/29 15:56 + * --------------------------------------------------------------------------- + */ +public class BugFixedTest { + /** + * 在使用 ModelColumnPlugin 插件时遇到关键词column或者table定义了alias属性,插件没有正确取值 + */ + @Test + public void bug0001() throws Exception { + MyBatisGeneratorTool tool = MyBatisGeneratorTool.create("scripts/BugFixedTest/bug-0001.xml"); + tool.generate(() -> DBHelper.createDB("scripts/BugFixedTest/bug-0001.sql"), new AbstractShellCallback() { + @Override + public void reloadProject(SqlSession sqlSession, ClassLoader loader, String packagz) throws Exception { + ObjectUtil tbMapper = new ObjectUtil(sqlSession.getMapper(loader.loadClass(packagz + ".TbMapper"))); + + ObjectUtil tb = new ObjectUtil(loader, packagz + ".Tb"); + tb.set("id", 121L); + tb.set("inc", "inc_001"); + tb.set("table", "tb"); + // selective + ObjectUtil TbColumnId = new ObjectUtil(loader, packagz + ".Tb$Column#id"); + ObjectUtil TbColumnInc = new ObjectUtil(loader, packagz + ".Tb$Column#inc"); + ObjectUtil TbColumnTable = new ObjectUtil(loader, packagz + ".Tb$Column#table"); + Object columns = Array.newInstance(TbColumnInc.getCls(), 3); + Array.set(columns, 0, TbColumnId.getObject()); + Array.set(columns, 1, TbColumnInc.getObject()); + Array.set(columns, 2, TbColumnTable.getObject()); + + // sql + String sql = SqlHelper.getFormatMapperSql(tbMapper.getObject(), "insertSelective", tb.getObject(), columns); + Assert.assertEquals(sql, "insert into tb ( id , field1 , `table` ) values ( 121 , 'inc_001' , 'tb' )"); + Object result = tbMapper.invoke("insertSelective", tb.getObject(), columns); + Assert.assertEquals(result, 1); + } + }); + } +} diff --git a/src/test/resources/scripts/BugFixedTest/bug-0001.sql b/src/test/resources/scripts/BugFixedTest/bug-0001.sql new file mode 100644 index 0000000..a19f8a0 --- /dev/null +++ b/src/test/resources/scripts/BugFixedTest/bug-0001.sql @@ -0,0 +1,28 @@ +/* +Navicat MySQL Data Transfer + +Source Server : localhost +Source Server Version : 50617 +Source Host : localhost:3306 +Source Database : mybatis-generator-plugin + +Target Server Type : MYSQL +Target Server Version : 50617 +File Encoding : 65001 + +Date: 2017-06-27 11:17:08 +*/ + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for tb +-- ---------------------------- +DROP TABLE IF EXISTS `tb`; +CREATE TABLE `tb` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '注释1', + `field1` varchar(255) DEFAULT NULL COMMENT '注释2', + `field2` int DEFAULT NULL, + `table` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/src/test/resources/scripts/BugFixedTest/bug-0001.xml b/src/test/resources/scripts/BugFixedTest/bug-0001.xml new file mode 100644 index 0000000..f0583e9 --- /dev/null +++ b/src/test/resources/scripts/BugFixedTest/bug-0001.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
\ No newline at end of file