要达到要求,必须使用1.3.4以上,只有1.3.4才增加了mapperName,我这种方式不需对源码进行修改。
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.4</version>
</dependency>
先说下思路,generatorConfig.xml中有如下配置
<context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
或者
<context id="Mysql" targetRuntime="Mybatis3Simple" defaultModelType="flat">
其中,targetRuntime="MyBatis3"对应的就是IntrospectedTableMyBatis3Impl,而targetRuntime="Mybatis3Simple"对应的是IntrospectedTableMyBatis3SimpleImpl,思路就是继承他们,重写里面的方法,然后targetRuntime换成自己写的类。
比如,我原来的配置是targetRuntime="Mybatis3Simple",这时候我只需要继承IntrospectedTableMyBatis3SimpleImpl,然后重写以下三个方法就可以了(targetRuntime="MyBatis3"也类似,只是继承IntrospectedTableMyBatis3Impl类,不过重写的那三个方法都是一模一样的)。
package com.xxx.xxx.mybatis.generator.plugin;
import java.text.MessageFormat;
import org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3Impl;
import org.mybatis.generator.internal.util.StringUtility;
public class TkMyBatis3SimpleImpl extends IntrospectedTableMyBatis3Impl{
/**
* 修改生成的mapper xml文件中resultMap的id,原来为BaseResultMap,现修改为实体类名称
*/
@Override
public void setBaseResultMapId(String s) {
// 实体类名称
String objectName = fullyQualifiedTable.getDomainObjectName();
// 将resultMap的id设置为实体类首字母小写
objectName = objectName.substring(0, 1).toLowerCase() + objectName.substring(1);
super.setBaseResultMapId(objectName);
}
@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());
}
}
然后,在generatorConfig.xml中进行如下配置更改
<context id="Mysql" targetRuntime="com.xxx.xxx.mybatis.generator.plugin.TkMyBatis3SimpleImpl" defaultModelType="flat">
<!-- tableName="%"时表示生成所有表 -->
<table tableName="%" enableSelectByExample="false" enableDeleteByExample="false"
enableCountByExample="false" enableUpdateByExample="false" mapperName="{0}Dao">
注意第二个的mapperName="{0}Dao",其实到最后mapper接口和xml文件名就会生成为实体类+Dao的方式。
最后还是按照以前的方式生成代码就可以了。
说明:本文部分代码参考了https://blog.csdn.net/isea533/article/details/52430691