最近在用mybatis generator 生成代码的时候,生成的xml文件 和类文件 不是自己想要的,于是修改mybatis generator 的源码,重写方法来达到效果,这里记录一下,后期如果需要还可以随便改成自己想要的!
一 修改注释
mybatis generator 生成的注释不是自己想要的中文注释,默认是不生成注释的,如果开启注释,用mybatis generator 自带的生成的注释带的东西全是英文,而且不是自己想要的中午注释!
网上有很多例子不想写了,我认为比较好的,解释的很清楚。
问题的关键是是放弃默认实现CommentGenerator接口的类DefaultCommentGenerator。自己重新实现CommentGenerator,主要重新定义,截图
如下
红线部分 的修改因为,实体类实现serializable接口的时候 ,serialVersionUID位置修改成第一行(反正我generatorConfig.xml加开启的时候,生成他的位置不是首行乱放),这样解决了注释问题
二类文件名称问题
在generatorConfig.xml 看到这么一个关键字,主要用来生成文件的实现类,我这里改成了自己的。
源码自带的有这么几种实现方式有mybatis的和ibatis的 如图
下面主要说是我定义一个类重新实现IntrospectedTableMyBatis3Impl
代码如下
package generator.mbgcomment;
import org.mybatis.generator.api.ProgressCallback;
import org.mybatis.generator.codegen.AbstractJavaClientGenerator;
import org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3Impl;
import org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator;
import java.text.MessageFormat;
import java.util.List;
import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
//MyBatis3 的实现
public class TkMyBatis3Impl extends IntrospectedTableMyBatis3Impl {
@Override
protected void calculateXmlMapperGenerator(AbstractJavaClientGenerator javaClientGenerator, List<String> warnings, ProgressCallback progressCallback) {
if (javaClientGenerator == null) {
if (this.context.getSqlMapGeneratorConfiguration() != null) {
this.xmlMapperGenerator = new MyXMLMapperGenerator();
}
} else {
this.xmlMapperGenerator = new MyXMLMapperGenerator();;
}
this.initializeAbstractGenerator(this.xmlMapperGenerator, warnings, progressCallback);
}
@Override
protected String calculateMyBatis3XmlMapperFileName() {
StringBuilder sb = new StringBuilder();
if (stringHasValue(tableConfiguration.getMapperName())) {
String mapperName = tableConfiguration.getMapperName();
int ind = mapperName.lastIndexOf('.');
if (ind != -1) {
mapperName = mapperName.substring(ind + 1);
}
//支持mapperName = "{0}Dao" 等用法
sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length())+"Mapper");
// sb.append(MessageFormat.format(mapperName, fullyQualifiedTable.getDomainObjectName()));
sb.append(".xml"); //$NON-NLS-1$
} else {
sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length()));
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().substring(2,fullyQualifiedTable.getDomainObjectName().length()));
sb.append("DAOImpl"); //$NON-NLS-1$
setDAOImplementationType(sb.toString());
sb.setLength(0);
sb.append(calculateJavaClientInterfacePackage());
sb.append('.');
sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length()));
sb.append("DAO"); //$NON-NLS-1$
setDAOInterfaceType(sb.toString());
sb.setLength(0);
sb.append(calculateJavaClientInterfacePackage());
sb.append('.');
if (stringHasValue(tableConfiguration.getMapperName())) {
//支持mapperName = "{0}Dao" 等用法
sb.append(MessageFormat.format(tableConfiguration.getMapperName(), fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length())));
} else {
sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length()));
sb.append("Mapper"); //$NON-NLS-1$
}
setMyBatis3JavaMapperType(sb.toString());
sb.setLength(0);
sb.append(calculateJavaClientInterfacePackage());
sb.append('.');
if (stringHasValue(tableConfiguration.getSqlProviderName())) {
//支持mapperName = "{0}SqlProvider" 等用法
sb.append(MessageFormat.format(tableConfiguration.getSqlProviderName(), "SystmMerchantMapper"));
} else {
sb.append(fullyQualifiedTable.getDomainObjectName().substring(2,fullyQualifiedTable.getDomainObjectName().length()));
sb.append("SqlProvider"); //$NON-NLS-1$
}
setMyBatis3SqlProviderType(sb.toString());
}
}
详解每个方法的用处
图一
这个方法我下面再说
图二generatorConfig.xml 配置
图三修改实现类
图四
图二代码的意思是我要把Mapper 接口和mapper.xml改成 TbSystemModelDao 和TbSystemModelDaoMapper.xml
但在还是达不到效果
图三加上图四红线部分就是修改mapper.xml 和dao名称。我想达到的效果是 接口改成SystemModelDao.java,映射文件改成SystemMapper.xml,而DomainObjectName是TbSystemModel,如果不做修改这里mapper.xml就变成TbSystemDao.xml ,接口dao就是TbSystemDao,但是这不是我想要的
三修改mapper.xml 生成的内容
我值举一个例子剩下的我会把项目放到git 上面 我举一个查询的例子
首先第一步就是上面刚刚看的图一
红线部分是生成xml 内容的类,我自己重新写了一个,里面有很多方法 生成增删该查 resultMap 等等的方法 如图
红线部分添加自己需要的方法,现在我们想改select方法,点击进去
红线部分是自己写的实现类
好了到了这里 怎么生成sql ,xml需要的内容有你掌控,同理改其他sql等等 也由你定,一样的方式