什么是逆向工程?
逆向工程师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.