mybatisGenerator,代码生成
官方文档 仔细看下官方的文档,这些功能都很好实现
公司的代码有自己的一套规范,每次新增个表挺麻烦,然后根据公司的规范改的代码生成项目。需要对源码进行调整。
- 类和类属性的注释
- 类上的@setter和@getter,去掉get和set
- 修改xml生成的sql和id,新增自定义的sql
前戏
- 创建maven项目,引入pom
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
- 新增个入口类
Generator
,新增main方法
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 这行改下
InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
- 在
resources
下新增generatorConfig.xml
,下面试官方xml内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
<context id="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
connectionURL="jdbc:db2:TEST"
userId="db2admin"
password="db2admin">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="test.xml" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
</context>
</generatorConfiguration>
正戏
- 禁止生成
get、set
方法
public class MyFluentBuilderMethodsPlugin extends PluginAdapter {
public MyFluentBuilderMethodsPlugin() {
}
@Override
public boolean validate(List<String> warnings) {
return true;
}
@Override
public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
return false;
}
@Override
public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
return false;
}
}
放在generatorConfig.xml
中
<context ...>
<plugin type="com.generator.MyFluentBuilderMethodsPlugin"/>
</context>
效果图…就是没有get和set方法了
- 给字段和类加注释,取自数据库
先看效果吧
实现
- 添加类和类属性的注释
新增类CommentGenerator
继承 DefaultCommentGenerator
,重写两个方法
/**
* 给字段添加注释
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
field.addJavaDocLine("/**");
String remarks = introspectedColumn.getRemarks();
if (this.addRemarkComments && StringUtility.stringHasValue(remarks)) {
String[] remarkLines = remarks.split(System.getProperty("line.separator"));
String[] var6 = remarkLines;
int var7 = remarkLines.length;
for (int var8 = 0; var8 < var7; ++var8) {
String remarkLine = var6[var8];
field.addJavaDocLine(" * " + remarkLine);
}
}
field.addJavaDocLine(" */");
@Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
topLevelClass.addJavaDocLine("/**");
String remarks = introspectedTable.getRemarks();
if (this.addRemarkComments && StringUtility.stringHasValue(remarks)) {
String[] remarkLines = remarks.split(System.getProperty("line.separator"));
String[] var5 = remarkLines;
int var6 = remarkLines.length;
for (int var7 = 0; var7 < var6; ++var7) {
String remarkLine = var5[var7];
topLevelClass.addJavaDocLine(" * " + remarkLine);
}
}
topLevelClass.addJavaDocLine(" */");
if (this.hasLombok) {
addLombok(topLevelClass, introspectedTable);
}
}
generatorConfig.xml
配置
<commentGenerator type="com.xxxxxxxx.CommentGenerator">
<!-- 是否去除自动生成的注释 -->
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
- xml中新增自己公司规范的方法
效果
实现,覆盖类
org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator
,路径一样即可覆盖
public class UpdateDelFlagElementGenerator extends
AbstractXmlElementGenerator {
public UpdateDelFlagElementGenerator() {
super();
}
@Override
public void addElements(XmlElement parentElement) {
XmlElement answer = new XmlElement("update"); //$NON-NLS-1$
answer.addAttribute(new Attribute(
"id", "deleteByLogic")); //$NON-NLS-1$
String parameterType = "java.lang.String";
answer.addAttribute(new Attribute("parameterType", //$NON-NLS-1$
parameterType));
context.getCommentGenerator().addComment(answer);
StringBuilder sb = new StringBuilder();
sb.append("update "); //$NON-NLS-1$
sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());
sb.append(" set DEL_FLAG ='${@com.xxx.xxx.xxx.xxx@YES.getValue()}' ");
answer.addElement(new TextElement(sb.toString()));
boolean and = false;
for (IntrospectedColumn introspectedColumn : introspectedTable
.getPrimaryKeyColumns()) {
sb.setLength(0);
if (and) {
sb.append(" and "); //$NON-NLS-1$
} else {
sb.append("where "); //$NON-NLS-1$
and = true;
}
sb.append(MyBatis3FormattingUtilities
.getEscapedColumnName(introspectedColumn));
sb.append(" = "); //$NON-NLS-1$
sb.append(MyBatis3FormattingUtilities
.getParameterClause(introspectedColumn));
answer.addElement(new TextElement(sb.toString()));
}
if (context.getPlugins()
.sqlMapUpdateByPrimaryKeySelectiveElementGenerated(answer,
introspectedTable)) {
parentElement.addElement(answer);
}
}
}
拼这个其实挺简单的,里面很多例子,参考下就写出来了,如果定了别名别忘了使用别名
- 修改sql id,比如原名叫
deleteByPrimary
改为delete
,覆盖org.mybatis.generator.api.IntrospectedTable
找到方法calculateXmlAttributes
就是这个样子