Mybatis generator 替换/去掉所有table的前缀:columnRenamingRule & domainObjectRenamingRule

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。Mybatis generator 替换/去掉所有table的前缀:columnRenamingRule & domainObjectRenamingRule,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在用Mybatis generator 生成可以用来访问(多个)表的基础对象,遇到一个问题,就是用columnRenamingRule可以替换所有表元素里字段前缀

<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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/164189.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!