0


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

目录

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

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

<columnRenamingRulesearchString="^[^_]+"replaceString=""/>

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

sys_user
sys_city
sys_order

期望得到的POJO结果是:

UserCityOrder

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

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

domainObjectRenamingRule

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

<tabletableName="sys%"><generatedKeycolumn="id"sqlStatement="Mysql"/><domainObjectRenamingRulesearchString="^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 @@
  importstaticorg.mybatis.generator.internal.util.StringUtility.stringHasValue;importorg.mybatis.generator.config.Context;+importorg.mybatis.generator.config.DomainObjectRenamingRule;++importjava.util.regex.Matcher;+importjava.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 @@ publicFullyQualifiedTable(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 @@ publicFullyQualifiedTable(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 @@ publicStringgetIbatis2SqlMapNamespace(){publicStringgetDomainObjectName(){if(stringHasValue(domainObjectName)){return domainObjectName;-}elseif(stringHasValue(runtimeTableName)){-returngetCamelCaseString(runtimeTableName,true);+}+String finalDomainObjectName;+if(stringHasValue(runtimeTableName)){+            finalDomainObjectName =getCamelCaseString(runtimeTableName,true);}else{-returngetCamelCaseString(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

packageorg.mybatis.generator.config;++importorg.mybatis.generator.api.dom.xml.Attribute;+importorg.mybatis.generator.api.dom.xml.XmlElement;++importjava.util.List;++importstaticorg.mybatis.generator.internal.util.StringUtility.stringHasValue;+importstaticorg.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
 + * 
 + */+publicclassDomainObjectRenamingRule{+privateString searchString;+privateString replaceString;++publicStringgetReplaceString(){+return replaceString;+}++publicvoidsetReplaceString(String replaceString){+this.replaceString = replaceString;+}++publicStringgetSearchString(){+return searchString;+}++publicvoidsetSearchString(String searchString){+this.searchString = searchString;+}++publicvoidvalidate(List<String> errors,String tableName){+if(!stringHasValue(searchString)){+            errors.add(getString("ValidationError.28", tableName));//$NON-NLS-1$+}+}++publicXmlElementtoXmlElement(){+XmlElement xmlElement =newXmlElement("domainRenamingRule");//$NON-NLS-1$+        xmlElement.addAttribute(newAttribute("searchString", searchString));//$NON-NLS-1$++if(replaceString !=null){+            xmlElement.addAttribute(newAttribute(+"replaceString", replaceString));//$NON-NLS-1$+}++return xmlElement;+}+}

.mybatis-generator-core/src/main/java/org/mybatis/generator/config/TableConfiguration.j

privateboolean delimitIdentifiers;+privateDomainObjectRenamingRule domainObjectRenamingRule;+privateColumnRenamingRule columnRenamingRule;privateboolean isAllColumnDelimitingEnabled;
 @@ -462,6+464,10 @@ publicXmlElementtoXmlElement(){
              xmlElement.addElement(generatedKey.toXmlElement());}+if(domainObjectRenamingRule !=null){+            xmlElement.addElement(domainObjectRenamingRule.toXmlElement());+}+if(columnRenamingRule !=null){
              xmlElement.addElement(columnRenamingRule.toXmlElement());}
 @@ -544,6+550,10 @@ publicvoidvalidate(List<String> errors,int listPosition){}}+if(domainObjectRenamingRule !=null){+            domainObjectRenamingRule.validate(errors, fqTableName);+}+if(columnRenamingRule !=null){
              columnRenamingRule.validate(errors, fqTableName);}
 @@ -561,6+571,14 @@ publicvoidvalidate(List<String> errors,int listPosition){}}+publicDomainObjectRenamingRulegetDomainObjectRenamingRule(){+return domainObjectRenamingRule;+}++publicvoidsetDomainObjectRenamingRule(DomainObjectRenamingRule domainObjectRenamingRule){+this.domainObjectRenamingRule = domainObjectRenamingRule;+}+publicColumnRenamingRulegetColumnRenamingRule(){return columnRenamingRule;}

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

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

在这里插入图片描述
在这里插入图片描述
你看过框架的源码吗?我们做个投票了解一下

标签: java mybatis spring

本文转载自: https://blog.csdn.net/superdangbo/article/details/127947435
版权归原作者 Python&Basketball 所有, 如有侵权,请联系我们删除。

“Mybatis generator实战:自动生成POJO类完整解决方案”的评论:

还没有评论