mybatis 官方提供了一个逆向工程,可以针对单表自动生成mybatis
执行所需要的代码(包括 mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。本文将就 mybatis 逆向工程的文件配置、自定义注释讲解。
1. 新建一个项目
在我们对数据库的表做逆向工程时,需要注意,先新建一个项目。因为我们在逆向工程中,是需要导入一些配置的,这可能跟我们的生产项目产生冲突。因此,推荐的做法是,在新项目中生成指定目录结构的实体类和 mapper 接口。
我们新建一个 maven 项目mybatis-reverse
1.1 导入相关依赖
添加依赖和插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.thomas</groupId>
<artifactId>mybatis-reverse</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mybatis逆向工程jar包 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.15</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<!-- 插件依赖 -->
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.15</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
2. 编写逆向工程配置文件
-
数据库配置文件
在 resources 目录下,我们创建generatorConfig.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>
<!--
targetRuntime: 执行生成的逆向工程的版本
MyBatis3Simple: 生成基本的CRUD(清新简洁版)
MyBatis3: 生成带条件的CRUD(奢华尊享版)
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<!-- 数据库的连接信息 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/reggie?useSSL=true&useUnicode=true&characterEncoding=utf8"
userId="root"
password=数据库密码>
</jdbcConnection>
<!-- javaBean的生成策略-->
<javaModelGenerator targetPackage="com.thomas.reggie.entity" targetProject=".srcmainjava">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- SQL映射文件的生成策略 -->
<sqlMapGenerator targetPackage="com.thomas.reggie.mapper"
targetProject=".srcmainresources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- Mapper接口的生成策略 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.thomas.reggie.mapper" targetProject=".srcmainjava">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 逆向分析的表 -->
<!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
<!-- domainObjectName属性指定生成出来的实体类的类名 -->
<table tableName="address_book" domainObjectName="AddressBook"/>
<table tableName="category" domainObjectName="Category"/>
<table tableName="dish" domainObjectName="Dish"/>
<table tableName="dish_flavor" domainObjectName="DishFlavor"/>
<table tableName="employee" domainObjectName="Employee"/>
<table tableName="order_detail" domainObjectName="orderDetail"/>
<table tableName="orders" domainObjectName="Orders"/>
<table tableName="setmeal" domainObjectName="Setmeal"/>
<table tableName="setmeal_dish" domainObjectName="SetmealDish"/>
<table tableName="shopping_cart" domainObjectName="ShoppingCart"/>
<table tableName="user" domainObjectName="User"/>
</context>
</generatorConfiguration>
从上面的配置文件中可以看出,配置文件主要要做的几件事是:
连接数据库 指定要生成代码的位置,要生成的代码包括实体类,mapper 接口和对应的 xml 文件 指定需要生成实体类的数据库中的表格
3. 逆向生成文件
点击mybatis-generator
插件,生成相关文件。
我们可以看到,生成了我们需要的文件
打开一个实体类,我们可以发现,生成的注释信息太多了。
4. 优化注释信息
4.1 关闭自动生成注释
这个注释实际上是自动生成的注释,我们可以直接在generatorConfig.xml
中进行设置,关闭自动生成注释。
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
</context>
这样我们生成的实体类就没有多余的注释了。
4.2 自定义注释
实现 CommentGenerator 接口
当然,我们还可以实现自定义注释(自定义逆向工程注释参考文章[1])我们创建 utils 包,实现两个类,其中CommentGeneratorUtils
类实现CommentGenerator
接口
CommentGeneratorUtils.java
package com.thomas.utils;
import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.XmlElement;
import java.util.Properties;
import java.util.Set;
/**
* CommentGenerator 接口,里面的方法非常多,
* 不仅包含了生成 Java 实体注释对应的方法,
* 还包括了生成 XML 中注释的方法。
* 写一个默认的实现类,实现CommentGenerator 接口,但不做任何操作。
*/
public class CommentGeneratorUtil implements CommentGenerator {
@Override
public void addConfigurationProperties(Properties properties) {
}
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
}
@Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
}
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
}
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean b) {
}
@Override
public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
}
@Override
public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
@Override
public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
@Override
public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
}
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
}
@Override
public void addComment(XmlElement xmlElement) {
}
@Override
public void addRootComment(XmlElement xmlElement) {
}
@Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
}
@Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {
}
@Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
}
@Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {
}
@Override
public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
}
}
将数据库中表、字段的注释作为类和属性的注释
以及CommentGeneratorUtilImpl
类来继承CommentGeneratorUtil
类,获取数据库表的注释作为类和属性的注释。
CommentGeneratorUtilImpl.java
package com.thomas.utils;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
/**
* 继承自定义的MyCommentGenerator方法,获取数据库的表注释以及字段注释。
*/
public class CommentGeneratorUtilImpl extends CommentGeneratorUtil {
private final Properties properties;
public CommentGeneratorUtilImpl() {
properties = new Properties();
}
@Override
public void addConfigurationProperties(Properties properties) {
// 获取自定义的 properties
this.properties.putAll(properties);
}
/**
* 自定义实体类的主注释
* @param topLevelClass
* @param introspectedTable
*/
@Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
String author = properties.getProperty("author");
String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);
// 获取表注释
String remarks = introspectedTable.getRemarks();
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * @Author:" + author);
topLevelClass.addJavaDocLine(" * @Date:" + dateFormatter.format(new Date()));
topLevelClass.addJavaDocLine(" * @Description:" + remarks);
topLevelClass.addJavaDocLine(" */");
}
/**
* 自定义实体类的列注释
* @param field
* @param introspectedTable
* @param introspectedColumn
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
// 获取列注释
String remarks = introspectedColumn.getRemarks();
field.addJavaDocLine("//" + remarks);
}
}
启动类
在启动前,需要修改逆向工程的配置文件,指定我们编写的类,并且在其中定义我们需要的属性,比如author
和dateFormat
<!-- 自定义注释生成器 -->
<commentGenerator type="com.thomas.utils.CommentGeneratorUtilImpl">
<property name="author" value="thomas"/>
<property name="dateFormat" value="yyyy/MM/dd"/>
</commentGenerator>
创建启动类GeneratorRun.java
,使用代码运行,获得自动生成文件。
package com.thomas;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 使用java代码运行mybatis-generator
*/
public class GeneratorRun {
public static void main( String[] args ) throws Exception {
List<String> warnings = new ArrayList<>();
//generatorConfig.xml所在的位置,相对路径和绝对路径都可以。
File configFile = new File("src/main/resources/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
这里生成的注释其实与数据库中的 coment 保持一致,因此,如果要生成自定义的注释,需要我们在定义数据库表时做好注释。
小结
通过 mybatis 逆向工程,可以减轻很多重复工作。
参考资料
自定义逆向工程注释参考文章: http://www.lzhpo.com/article/46
原文始发于微信公众号(多肉罗罗):开发小tips —— mybatis 逆向工程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/186205.html