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


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。配置如下:

<domainObjectRenamingRule searchString="^t_business" replaceString="" />

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

<domainObjectRenamingRule searchString="^TBusiness(\w+)" replaceString="$1PO" />

本以为万事大吉,结果生成的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指定类的全类名,如:

  <context id="Mysql" targetRuntime="com.lipp3.beans.TkMyBatis3Impl" defaultModelType="flat">

比如以Dao结尾:

<table tableName="%" mapperName="{0}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标签。

每篇一语:

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值