在用Mybatis generator 生成可以用来访问(多个)表的基础对象,遇到一个问题,就是columnRenamingRule可以替换所有表元素里字段前缀
但是如果想去掉所有表的前缀,比如有多个表:
sys_user
sys_city
sys_order
期望得到的POJO结果是:
User
City
Order
domainObjectRenamingRule
参照:
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.* - * This method is used for determining the sub package for Java client and + *
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:+ * + * + * - SYS_USER
+ * - SYS_ROLE
+ * - SYS_FUNCTIONS
+ *
+ * + * 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+ * + * + * - searchString="^Sys"
+ * - replaceString=""
+ *
+ * + * Note that internally, the generator uses the+ * java.util.regex.Matcher.replaceAll
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 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 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 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
你看过框架的源码吗?我们做个投票了解一下