一、使用背景
项目操作数据库层使用的并不是mybatis,而是Spring的JdbcTemple,因此对底层的SQL创建是使用的自定义注解来动态生成。自定义注解对字段多时,手动生成实体类过于繁琐,就想使用逆向工程来生成。网上找的基本都是mybatis的,对自定义注解的比较少。参考了许多人博客后,转载的那个是比较接近的了。
二、步骤说明
1、pom文件dependencies标签下新增以下依赖
<!-- mybatis generator-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!-- <dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>6.0</version>
</dependency>-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
plugins标签下配置插件启动配置文件
<finalName>mybatis-generator-plus</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>src/main/resources/tk_generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.3.9</version>
</dependency>
</dependencies>
</plugin>
</plugins>
maven插件来启动配置文件时没使用到自定义的类,因此我是用的类来加载的。
2、新增tk_generatorConfig文件,名字可以随便取,配置进去就好。
<?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>
<!-- MyBatis3Simple:不生成 Example相关类及方法 -->
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`" />
<property name="endingDelimiter" value="`" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<!--
<commentGenerator>
<property name="suppressAllComments" value="true" />
<property name="suppressDate" value="true"/>
<property name="javaFileEncoding" value="UTF-8"/>
</commentGenerator>
-->
<!-- 使用MyCommentGenerator来生成自定义注释 -->
<commentGenerator type="org.mybatis.generator.MyCommentGenerator">
<property name="suppressAllComments" value="false"></property>
</commentGenerator>
<!-- jdbc 数据库连接配置 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/was"
userId="root"
password="root">
<!--因为数据库连接版本过高,加这个配置 解决xml生成其他库相同表的映射字段-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- 配置数据库表实体类存放路径 -->
<javaModelGenerator targetPackage="cn.liangjinh.entity" targetProject="src/main/java" />
<!-- 配置XxxMapper.xml文件存放路径 -->
<sqlMapGenerator targetPackage="mapper/sign" targetProject="src/main/resources" />
<!-- 配置XxxMapper实体接口存放路径 -->
<javaClientGenerator
targetPackage="cn.liangjinh.dao"
targetProject="src/main/java" type="XMLMAPPER" />
<!-- 配置需要生成的表 -->
<!-- tableName:数据库表名,%代表所有,domainObjectName:生成文件名 ,schema:数据源 -->
<table tableName="table_name" domainObjectName="table_name" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
</context>
</generatorConfiguration>
3、重点就是自定义注释类的实现,由于编译的时候,有可能会提示类与接口不在同一个路径下,因此新建了包org.mybatis.generator并在下面新建了类MyCommentGenerator来实现CommentGenerator接口。具体内容可以参考他的实现类DefaultCommentGenerator,可以直接复制代码然后改下类名就行。他的基本方法都有开头都有一句!this.suppressAllComments来,因此传入的值需要为false。因为我使用到的是在属性上面新增注解。因此修改的主要是addFieldComment这个方法
/**
* 为属性注释
* @param field
* @param introspectedTable
* @param introspectedColumn
*/
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (suppressAllComments) {
return;
}
field.addJavaDocLine("/**");
String remarks = introspectedColumn.getRemarks();
if (StringUtility.stringHasValue(remarks)) {
field.addJavaDocLine(" * Database Column 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(" *");
field.addJavaDocLine(" * This field was generated by MyBatis Generator.");
StringBuilder sb = new StringBuilder();
sb.append(" * This field corresponds to the database column ");
sb.append(introspectedTable.getFullyQualifiedTable());
sb.append('.');
sb.append(introspectedColumn.getActualColumnName());
field.addJavaDocLine(sb.toString());
this.addJavadocTag(field, false);
field.addJavaDocLine(" */");
// 根据实体类的自定义注解逆向生成sql
sb.setLength(0);
sb.append("@FieldAnnotation(fieldName=\"").append(introspectedColumn.getActualColumnName());
sb.append("\",");
/*
MYSQL字段类型配置为varchar或者longtext时,注解类型为String,
由于有根据注解的length对实体做长度校验,longtext的长度默认为512
*/
if ("VARCHAR".equals(introspectedColumn.getJdbcTypeName())
|| "LONGTEXT".equals(introspectedColumn.getJdbcTypeName())) {
sb.append("fieldType = FieldType.STRING,");
}
sb.append("length = ").append(introspectedColumn.getLength()).append(")");
field.addAnnotation(sb.toString());
}
4、最后新建启动类StartUp
package cn.liangjinh.generator;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class StartUp {
public static void main(String[] args) throws URISyntaxException {
try {
System.out.println("--------------------start generator-------------------");
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("tk_generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
System.out.println("--------------------end generator-------------------");
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (InvalidConfigurationException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
}
}
}
然后直接运行就可以了。
效果展示
/**
* Database Column Remarks:
* 创建人员名称
*
* This field was generated by MyBatis Generator.
* This field corresponds to the database column test.CREATE_USERNAME
*
* @mbg.generated 2020-04-20
*/
@FieldAnnotation(fieldName="CREATE_USERNAME",fieldType = FieldType.STRING,length = 150)
private String createUsername;
/**
* Database Column Remarks:
* 创建人员ID
*
* This field was generated by MyBatis Generator.
* This field corresponds to the database column test.CREATE_USERID
*
* @mbg.generated 2020-04-20
*/
@FieldAnnotation(fieldName="CREATE_USERID",fieldType = FieldType.STRING,length = 96)
private String createUserid;
英文注释没有删除的原因是为了调试的时候可以看到哪个参数对应哪个值,方便拼接。
项目结构图
修改类注释的话就重写addModelClassComment这个方法。亲测可以了
希望这个对有使用自定义注释的有所帮助。
参考链接 https://blog.csdn.net/u011781521/article/details/78161201