Mybatis generator 替换/去掉所有table的前缀:columnRenamingRule & domainObjectRenamingRule
2017-12-08 16:22
1591 查看
在用Mybatis generator 生成可以用来访问(多个)表的基础对象,遇到一个问题,就是用columnRenamingRule可以替换所有表元素里字段前缀
但是如果想去掉所有表的前缀,比如有多个表:
期望得到的POJO结果是:
于是搜索资料发现,mybatis generator 1.3.6 已经有了这个功能,
增加了一个新的属性:
In generatreConfig.xml, use like this:
参照:
https://github.com/mybatis/generator/issues/275
https://github.com/mybatis/generator/pull/176
查看源码发现已经有了这个属性:
FullyQualifiedTable.java
…s-generator-core/src/main/java/org/mybatis/generator/config/DomainObjectRenamingRule.java
.mybatis-generator-core/src/main/java/org/mybatis/generator/config/TableConfiguration.j
参照:https://github.com/mybatis/generator/commit/9194d749943d0c6b4372f27bb87e65749d43cb4c
https://github.com/mybatis/generator
<columnRenamingRule searchString="^[^_]+" replaceString=""/>
但是如果想去掉所有表的前缀,比如有多个表:
sys_user sys_city sys_order
期望得到的POJO结果是:
User City Order
于是搜索资料发现,mybatis generator 1.3.6 已经有了这个功能,
增加了一个新的属性:
domainObjectRenamingRule
In generatreConfig.xml, use like this:
<table tableName="sys%"> <generatedKey column="id" sqlStatement="Mysql"/> <domainObjectRenamingRule searchString="^sys" replaceString="" /> </table>
参照:
https://github.com/mybatis/generator/issues/275
https://github.com/mybatis/generator/pull/176
查看源码发现已经有了这个属性:
FullyQualifiedTable.java
core/mybatis-generator-core/src/main/java/org/mybatis/generator/api/FullyQualifiedTable.java @@ -23,6 +23,10 @@ import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; import org.mybatis.generator.config.Context; +import org.mybatis.generator.config.DomainObjectRenamingRule; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * The Class FullyQualifiedTable. @@ -43,6 +47,7 @@ private boolean ignoreQualifiersAtRuntime; private String beginningDelimiter; private String endingDelimiter; + private DomainObjectRenamingRule domainObjectRenamingRule; /** * This object is used to hold information related to the table itself, not the columns in the @@ -82,6 +87,9 @@ * @param delimitIdentifiers * if true, then the table identifiers will be delimited at runtime. The delimiter characters are * obtained from the Context. + * @param domainObjectRenamingRule + * If domainObjectName is not configured, we'll build the domain object named based on the tableName or runtimeTableName. + * And then we use the domain object renameing rule to generate the final domain object name. * @param context * the context */ @@ -90,7 +98,8 @@ public FullyQualifiedTable(String introspectedCatalog, String domainObjectName, String alias, boolean ignoreQualifiersAtRuntime, String runtimeCatalog, String runtimeSchema, String runtimeTableName, - boolean delimitIdentifiers, Context context) { + boolean delimitIdentifiers, DomainObjectRenamingRule domainObjectRenamingRule, + Context context) { super(); this.introspectedCatalog = introspectedCatalog; this.introspectedSchema = introspectedSchema; @@ -99,6 +108,7 @@ public FullyQualifiedTable(String introspectedCatalog, this.runtimeCatalog = runtimeCatalog; this.runtimeSchema = runtimeSchema; this.runtimeTableName = runtimeTableName; + this.domainObjectRenamingRule = domainObjectRenamingRule; if (stringHasValue(domainObjectName)) { int index = domainObjectName.lastIndexOf('.'); @@ -238,11 +248,21 @@ public String getIbatis2SqlMapNamespace() { public String getDomainObjectName() { if (stringHasValue(domainObjectName)) { return domainObjectName; - } else if (stringHasValue(runtimeTableName)) { - return getCamelCaseString(runtimeTableName, true); + } + String finalDomainObjectName; + if (stringHasValue(runtimeTableName)) { + finalDomainObjectName = getCamelCaseString(runtimeTableName, true); } else { - return getCamelCaseString(introspectedTableName, true); + finalDomainObjectName = getCamelCaseString(introspectedTableName, true); + } + if(domainObjectRenamingRule != null){ + Pattern pattern = Pattern.compile(domainObjectRenamingRule.getSearchString()); + String replaceString = domainObjectRenamingRule.getReplaceString(); + replaceString = replaceString == null ? "" : replaceString; + Matcher matcher = pattern.matcher(finalDomainObjectName); + finalDomainObjectName = matcher.replaceAll(replaceString); } + return finalDomainObjectName; } /* (non-Javadoc) @@ -304,7 +324,7 @@ public String getAlias() { * Calculates a Java package fragment based on the table catalog and schema. * If qualifiers are ignored, then this method will return an empty string. * - * <p>This method is used for determining the sub package for Java client and + * <p>This method is used for determining the sub package for Java client and
…s-generator-core/src/main/java/org/mybatis/generator/config/DomainObjectRenamingRule.java
package org.mybatis.generator.config; + +import org.mybatis.generator.api.dom.xml.Attribute; +import org.mybatis.generator.api.dom.xml.XmlElement; + +import java.util.List; + +import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; +import static org.mybatis.generator.internal.ut`这里写代码片`il.messages.Messages.getString; + +/** + * This class is used to specify a renaming rule for table's domain object name. + * If domainObjectName is not configured, we'll build the domain object named + * based on the tableName or runtimeTableName. And then we use the domain object + * renameing rule to generate the final domain object name. + * + * For example, if some tables are named: + * + * <ul> + * <li>SYS_USER</li> + * <li>SYS_ROLE</li> + * <li>SYS_FUNCTIONS</li> + * </ul> + * + * it might be annoying to have the generated domain name all containing the SYS + * prefix. This class can be used to remove the prefix by specifying + * + * <ul> + * <li>searchString="^Sys"</li> + * <li>replaceString=""</li> + * </ul> + * + * Note that internally, the generator uses the + * <code>java.util.regex.Matcher.replaceAll</code> method for this function. See + * the documentation of that method for example of the regular expression + * language used in Java. + * + * @author liuzh + * + */ +public class DomainObjectRenamingRule { + private String searchString; + private String replaceString; + + public String getReplaceString() { + return replaceString; + } + + public void setReplaceString(String replaceString) { + this.replaceString = replaceString; + } + + public String getSearchString() { + return searchString; + } + + public void setSearchString(String searchString) { + this.searchString = searchString; + } + + public void validate(List<String> errors, String tableName) { + if (!stringHasValue(searchString)) { + errors.add(getString("ValidationError.28", tableName)); //$NON-NLS-1$ + } + } + + public XmlElement toXmlElement() { + XmlElement xmlElement = new XmlElement("domainRenamingRule"); //$NON-NLS-1$ + xmlElement.addAttribute(new Attribute("searchString", searchString)); //$NON-NLS-1$ + + if (replaceString != null) { + xmlElement.addAttribute(new Attribute( + "replaceString", replaceString)); //$NON-NLS-1$ + } + + return xmlElement; + } +}
.mybatis-generator-core/src/main/java/org/mybatis/generator/config/TableConfiguration.j
private boolean delimitIdentifiers; + private DomainObjectRenamingRule domainObjectRenamingRule; + private ColumnRenamingRule columnRenamingRule; private boolean isAllColumnDelimitingEnabled; @@ -462,6 +464,10 @@ public XmlElement toXmlElement() { xmlElement.addElement(generatedKey.toXmlElement()); } + if (domainObjectRenamingRule != null) { + xmlElement.addElement(domainObjectRenamingRule.toXmlElement()); + } + if (columnRenamingRule != null) { xmlElement.addElement(columnRenamingRule.toXmlElement()); } @@ -544,6 +550,10 @@ public void validate(List<String> errors, int listPosition) { } } + if (domainObjectRenamingRule != null) { + domainObjectRenamingRule.validate(errors, fqTableName); + } + if (columnRenamingRule != null) { columnRenamingRule.validate(errors, fqTableName); } @@ -561,6 +571,14 @@ public void validate(List<String> errors, int listPosition) { } } + public DomainObjectRenamingRule getDomainObjectRenamingRule() { + return domainObjectRenamingRule; + } + + public void setDomainObjectRenamingRule(DomainObjectRenamingRule domainObjectRenamingRule) { + this.domainObjectRenamingRule = domainObjectRenamingRule; + } + public ColumnRenamingRule getColumnRenamingRule() { return columnRenamingRule; }
参照:https://github.com/mybatis/generator/commit/9194d749943d0c6b4372f27bb87e65749d43cb4c
https://github.com/mybatis/generator
相关文章推荐
- mybatis generator columnRenamingRule使用
- SparkR去数据子集错误:object of type 'S4' is not subsettable
- visual studio用"查找替换"来删掉源代码中所有//方式的纯注释和空行
- mybatis 中insert语句报如下错误: Incorrect integer value: '' for column 'pic_len' at row 1
- dede自定义字段table去掉,自定义附件里面有<table>
- Python 正则表达式替换所有的<b>为<strong>
- android listview去掉分割线 && 去除或替换listview 默认的点击选中时的颜色
- Python3.x <generator object <genexpr> at 0x0000000002731828>
- Oracle11g 的 error "ORA-01747: user.table.column, table.column 或列说明无效
- 把 "原始串" 中所有的 "替换源串" 替换成 "替换目的串",返回替换完
- mybatis逆向工程 去除表字段前缀 匹配所有表名
- MyBatis中对List<Object> 对象List的批处理插入操作
- MyBatis中对List<Object> 对象List的批处理插入操作
- 4.ORA-01747: user.table.column, table.column 或列说明无效 mybatis的dao.xml中
- Cannot insert explicit value for identity column in table 'settings' when IDENTITY_INSERT is set to OFF.
- Cannot insert explicit value for identity column in table 'settings' when IDENTITY_INSERT is set to OFF.
- excel转化为table(去掉所有列值都为空的值一行,即返回有效值的DataTable)
- Mantis 查看问题 Unknown column 'user_id'……mantis_bug_file_table 问题
- shopex中怎样去掉<meta name="generator" content="ShopExxxxxx 4.8.5" />呢?
- TypeError: 'generator' object has no attribute '__getitem__'