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标签。
每篇一语:
珍重主人心,酒深情亦深。 ——《菩萨蛮》韦庄