开发小tips —— mybatis 逆向工程

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&amp;useUnicode=true&amp;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>

从上面的配置文件中可以看出,配置文件主要要做的几件事是:

  1. 连接数据库
  2. 指定要生成代码的位置,要生成的代码包括实体类,mapper 接口和对应的 xml 文件
  3. 指定需要生成实体类的数据库中的表格

3. 逆向生成文件

点击mybatis-generator插件,生成相关文件。

开发小tips —— mybatis 逆向工程

我们可以看到,生成了我们需要的文件

开发小tips —— mybatis 逆向工程

打开一个实体类,我们可以发现,生成的注释信息太多了。

开发小tips —— mybatis 逆向工程

4. 优化注释信息

4.1 关闭自动生成注释

这个注释实际上是自动生成的注释,我们可以直接在generatorConfig.xml中进行设置,关闭自动生成注释。

<context id="DB2Tables" targetRuntime="MyBatis3Simple">
    <commentGenerator>
        <!-- 是否去除自动生成的注释 true:是 : false:否 -->
        <property name="suppressAllComments" value="true" />
    </commentGenerator>
</context>

这样我们生成的实体类就没有多余的注释了。

开发小tips —— mybatis 逆向工程

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);
    }
}

启动类

在启动前,需要修改逆向工程的配置文件,指定我们编写的类,并且在其中定义我们需要的属性,比如authordateFormat

<!-- 自定义注释生成器 -->
<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);
    }

}

开发小tips —— mybatis 逆向工程

这里生成的注释其实与数据库中的 coment 保持一致,因此,如果要生成自定义的注释,需要我们在定义数据库表时做好注释。

开发小tips —— mybatis 逆向工程

小结

通过 mybatis 逆向工程,可以减轻很多重复工作。

参考资料

[1]

自定义逆向工程注释参考文章: http://www.lzhpo.com/article/46


原文始发于微信公众号(多肉罗罗):开发小tips —— mybatis 逆向工程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/186205.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!