天天看点

mybatis代码生成器generator,生成文件名自定义配置

文章目录

      • 默认的生成规则
      • table标签的tableName属性
      • 实体类表的前缀指定添加后缀
      • 修改mapper文件名及xml文件名
      • 修改example文件名
      • 修改实体属性名

generator介绍

官方文档

使用generator有三种方式,使用的是maven的插件方式。

能根据表生成对应的实体类、mapper文件、xml文件、example文件。

生成的文件名均可改在插件1.3.4之后。默认情况下mapper文件、xml文件、example文件名称是在前面加上实体类名。对应的修改方式

  • 实体类:提供了domainObjectRenamingRule标签
  • mapper,xml:提供了mapperName属性
  • example :提供了RenameExampleClassPlugin插件
  • 修改实体属性名称:提供了columnRenamingRule标签

默认的生成规则

实体类名为数据库表名驼峰化后的名称。mapper、xml、example(可指定是否生成)文件分别再前面加上实体类的名称。

<!-- targetRuntime有两个值MyBatis3Simple代表不生成Example文件,MyBatis3代表生成Example文件。生成的位置与PO相同 -->
    <context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
           

table标签的tableName属性

支持正则,只支持sql中的正则。%,_。含义跟sql中的含义相同。

//含义是库下面以sys开头的所有表
  <table tableName="sys_%"  >
   //含义是库下面的所有表
  <table tableName="%"  >
           

实体类表的前缀指定添加后缀

在table标签下面使用此标签。最多只能有一个标签。它有两个属性searchString要匹配的正则表达式,replaceString要替换的字符。比如t_business_role。比如去除前缀t_business。配置如下:

比如要求去除t_business的同时给实体类的名称加后缀PO。又当如何写?百度了下没找到想要的结果。于是使用了正则分组去解决。先把后面的所有字符都匹配,正则^t_business(\w+)。怎么给后面的字符加PO,用到了反向引用。感兴趣的参考:正则进阶

本以为万事大吉,结果生成的PO变成了小写,maven generator插件用的是1.3.7。于是下载generator的1.3.7的源码。进行调试,最终生成的是大写。于是把maven generator插件改成了1.3.6,生成的就是大写了。

注意:

  • domainObjectRenamingRule 必须放在property标签的后面。否则报错。
  • searchString。在table名称驼峰话之后修改,所以searchString的值写成了 ^TBusiness(\w+)
  • 若库中有不同的前缀,或者有不带前缀的,则必须分开写。归为不同的类别,每一个需要写一个table标签。

修改mapper文件名及xml文件名

table标签中的mapperName属性。不支持table标签tableName正则的写法。若要支持需要继承IntrospectedTableMyBatis3Impl。修改的话不能使用maven插件的方式。

public class TkMyBatis3Impl extends IntrospectedTableMyBatis3Impl {
    @Override
    protected String calculateMyBatis3XmlMapperFileName() {
        StringBuilder sb = new StringBuilder();
        if (StringUtility.stringHasValue(tableConfiguration.getMapperName())) {
            String mapperName = tableConfiguration.getMapperName();
            int ind = mapperName.lastIndexOf('.');
            if (ind != -1) {
                mapperName = mapperName.substring(ind + 1);
            }
            //支持mapperName = "{0}Dao" 等用法
            sb.append(MessageFormat.format(mapperName, fullyQualifiedTable.getDomainObjectName()));
            sb.append(".xml"); //$NON-NLS-1$
        } else {
            sb.append(fullyQualifiedTable.getDomainObjectName());
            sb.append("Mapper.xml"); //$NON-NLS-1$
        }
        return sb.toString();
    }

    @Override
    protected void calculateJavaClientAttributes() {
        if (context.getJavaClientGeneratorConfiguration() == null) {
            return;
        }

        StringBuilder sb = new StringBuilder();
        sb.append(calculateJavaClientImplementationPackage());
        sb.append('.');
        sb.append(fullyQualifiedTable.getDomainObjectName());
        sb.append("DAOImpl"); //$NON-NLS-1$
        setDAOImplementationType(sb.toString());

        sb.setLength(0);
        sb.append(calculateJavaClientInterfacePackage());
        sb.append('.');
        sb.append(fullyQualifiedTable.getDomainObjectName());
        sb.append("DAO"); //$NON-NLS-1$
        setDAOInterfaceType(sb.toString());

        sb.setLength(0);
        sb.append(calculateJavaClientInterfacePackage());
        sb.append('.');
        if (StringUtility.stringHasValue(tableConfiguration.getMapperName())) {
            //支持mapperName = "{0}Dao" 等用法
            sb.append(MessageFormat.format(tableConfiguration.getMapperName(), fullyQualifiedTable.getDomainObjectName()));
        } else {
            sb.append(fullyQualifiedTable.getDomainObjectName());
            sb.append("Mapper"); //$NON-NLS-1$
        }
        setMyBatis3JavaMapperType(sb.toString());

        sb.setLength(0);
        sb.append(calculateJavaClientInterfacePackage());
        sb.append('.');
        if (StringUtility.stringHasValue(tableConfiguration.getSqlProviderName())) {
            //支持mapperName = "{0}SqlProvider" 等用法
            sb.append(MessageFormat.format(tableConfiguration.getSqlProviderName(), fullyQualifiedTable.getDomainObjectName()));
        } else {
            sb.append(fullyQualifiedTable.getDomainObjectName());
            sb.append("SqlProvider"); //$NON-NLS-1$
        }
        setMyBatis3SqlProviderType(sb.toString());
    }
           

如何使用在context指定类的全类名,如:

比如以Dao结尾:

参考链接

修改example文件名

RenameExampleClassPlugin也有两个属性。searchString,replaceString。

把Example改成Criteria。

<plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
            <property name="searchString" value="Example$" />
            <property name="replaceString" value="Criteria" />
        </plugin>
           

修改实体属性名

columnRenamingRule有两个属性。searchString,replaceString。用法跟domainObjectRenamingRule类似。不再累赘。需要注意的是它是在没有驼峰话之前。

总结:

比如一个库中有t_business开头的库,有t_role开头的库还有不带任何开头的库。不带任何开头的库因tableName只支持sql中的%,_所以只能再单写。去除前缀并添加PO。配置如下:

<table tableName="t_business%" mapperName="{0}Dao" >
            <domainObjectRenamingRule searchString="^TBusiness(\w+)" replaceString="$1PO" />
            
  <table tableName="t_role" mapperName="{0}Dao" >
            <domainObjectRenamingRule searchString="^Sys(\w+)" replaceString="$1PO" />
            
  <table tableName="role" domainObjectName="RolePO"  mapperName="RolePO">
           

一般库中的表都会有前缀,这样便能统一命名。不再写多个table标签。

每篇一语:

珍重主人心,酒深情亦深。 ——《菩萨蛮》韦庄