飞道的博客

Mybatis generator实战:自动生成POJO类完整解决方案

353人阅读  评论(0)

1、背景:Mybatis generator根据数据库表自动生成POJO类完整解决方案

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

<columnRenamingRule searchString="^[^_]+" replaceString=""/> 

但是如果想去掉所有表的前缀,比如有多个表:

sys_user
sys_city
sys_order

期望得到的POJO结果是:

User
City
Order

2、解决方案:mybatis generator 1.3.6 已经有了这个功能,

2.1、增加了一个新的属性:

domainObjectRenamingRule

2.2、具体配置,在generatreConfig.xml, 例如:

<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;
      }

 

3、一定要开始看源码,非常锻炼编程能力

参照:https://github.com/mybatis/generator/commit/9194d749943d0c6b4372f27bb87e65749d43cb4c
https://github.com/mybatis/generator



你看过框架的源码吗?我们做个投票了解一下


转载:https://blog.csdn.net/superdangbo/article/details/127947435
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场