什么是逆向工程?

  逆向工程师MyBatis提供的一种自动化配置方案,针对数据表自动生成MyBatis所需的各种资源,包括实体类、Mapper接口、Mapper.xml,但是逆向工程的缺陷在于只能针对单表进行操作,如果数据表之间有级联关系,逆向工程无法自动生成级联关系。

  同时MyBatis逆向工程的灵活性差,它可以根据当前的数据表结构自动生成相关资源,但是如果需求发生变化,需要对数据表结构进行修改,则之前自动创建的各种资源就不可再用,需求开发者手动删除,然后重新执行异常逆向工程的代码。

  使用逆向工程,让MyBatis自动生成数据表对应的各种资源(实体类、Mapper接口、Mapper.xml)可以大大减少开发者的工作量。

具体操作

  MyBatis实现逆向工程的组件是MyBatis Generator,简称MBG,是专门为MyBatis框架定制的代码自动生成解决方案,MBG可以根据数据表结构快速生成对应的Mapper.xml、Mapper接口、实体类,并且支持基本的CURD操作,但是业务逻辑相对复杂的操作需求开发者手动完成。

1、添加pom.xml依赖

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.16</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    <!-- 逆向工程 -->
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.6</version>
    </dependency>
</dependencies>

2、创建目标表t_account,MBG自动根据该表结构生成相关资源(实体类、Mapper接口、Mapper.xml)

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50620
Source Host           : 127.0.0.1:3306
Source Database       : mybatis

Target Server Type    : MYSQL
Target Server Version : 50620
File Encoding         : 65001

Date: 2020-03-22 17:18:56
*/

;

-- ----------------------------
-- Table structure for t_account
-- ----------------------------
DROP TABLE IF EXISTS `t_account`;
CREATE TABLE `t_account` (
  `id` ) NOT NULL AUTO_INCREMENT,
  `username` ) DEFAULT NULL,
  `password` ) DEFAULT NULL,
  `age` ) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_account
-- ----------------------------

3、创建MBG配置文件generatorConfig.xml,核心配置有jdbcConnection、javaModelGenerator、sqlMapGenerator、javaClientGenerator、table。

  jdbcConnection 配置数据库连接信息

  JavaModelGenerator 配置javaBean的生成策略

  sqlMapGenerator 配置SQL映射文件生产策略

  javaClientGenerator 配置Mapper接口的生成策略

  table 配置要逆向解析的数据(tableName 表名,domainObjectName 对应的javaBean名称)

<?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>
    <context id="testTables" targetRuntime="MyBatis3">
        <jdbcConnection
                driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"
                userId="root"
                password="root"></jdbcConnection>

        <javaModelGenerator targetPackage="com.sunjian.entity" targetProject="./src/main/java"></javaModelGenerator>
        <sqlMapGenerator targetPackage="com.sunjian.repository" targetProject="./src/main/java"></sqlMapGenerator>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.sunjian.repository" targetProject="./src/main/java"></javaClientGenerator>
        <table tableName="t_account" domainObjectName="Account"></table>
    </context>
</generatorConfiguration>

4、创建GeneratorMain类,执行自动生成资源的代码

package com.sunjian.test;

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.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author sunjian
 * @date 2020/3/22 23:10
 */
public class GeneratorMain {
    public static void main(String[] args) {
        List<String> warings = new ArrayList<String>();
        boolean overwrite = true;
        String genCig = "/generatorConfig.xml";
        // 获取配置文件
        File configFile = new File(GeneratorMain.class.getResource(genCig).getFile());
        ConfigurationParser configurationParser = new ConfigurationParser(warings);
        Configuration configuration = null;
        try {
            configuration = configurationParser.parseConfiguration(configFile);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMLParserException e) {
            e.printStackTrace();
        }
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = null;
        try {
            myBatisGenerator = new MyBatisGenerator(configuration, callback, warings);
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
        }
        try {
            myBatisGenerator.generate(null);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

5、测试类

package com.sunjian.test;

import com.sunjian.entity.Account;
import com.sunjian.entity.AccountExample;

import java.util.List;

/**
 * @author sunjian
 * @date 2020/3/22 23:43
 */
public class TestExample {
    public static void main(String[] args) {
        AccountExample accountExample = new AccountExample();
        accountExample.setOrderByClause("username desc");
        accountExample.setDistinct(false);
        AccountExample.Criteria criteria = accountExample.createCriteria();
        criteria.andUsernameEqualTo("张三");
//        List<Account> accounts = accountExample.selectByExample(accountExample);
    }
}

OK.

05-14 08:09