Mybatis 提供了一個逆向工程工具,該工具可以根據(jù)數(shù)據(jù)表自動生成針對單表的 po 類、mapper 映射文件和 mapper 接口。大大縮減了開發(fā)時間,可以讓開發(fā)人員將更多的精力放在繁雜的業(yè)務(wù)邏輯上。
之所以強調(diào)單表兩個字,是因為 MyBatis 逆向工程生成的 Mapper 中的操作都是針對單表的。在大型項目中,很少有復雜的多表關(guān)聯(lián)查詢,所以該工具作用還是很大的。
jar包下載鏈接:https://github.com/mybatis/generator/releases。本節(jié)下載版本為 mybatis-generator-core-1.4.0。
maven 項目在 pom.xml 文件中添加以下代碼。
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
創(chuàng)建 user、student、studentCard 和 website 數(shù)據(jù)表,SQL 語句如下。
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`sex` tinyint(4) DEFAULT NULL,
`cardId` int(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `cardId` (`cardId`),
CONSTRAINT `student_ibfk_1` FOREIGN KEY (`cardId`) REFERENCES `studentcard` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `studentcard`;
CREATE TABLE `studentcard` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`studentId` int(20) DEFAULT NULL,
`startDate` date DEFAULT NULL,
`endDate` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `studentId` (`studentId`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`pwd` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `website`;
CREATE TABLE `website` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`url` varchar(30) COLLATE utf8_unicode_ci DEFAULT '',
`age` tinyint(3) unsigned NOT NULL,
`country` char(3) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`createtime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
創(chuàng)建 NXProject 項目,導入所需 jar 包。
新建資源文件夾 config,在 config 文件夾下創(chuàng)建 genertorConfig.xml 文件,用于配置及指定數(shù)據(jù)庫及表等。
注意:可以在已有的項目中進行逆向生成,也可以創(chuàng)建一個新項目。建議創(chuàng)建新項目,避免出現(xiàn)意外影響已有的項目。
genertorConfig.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>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自動生成的注釋 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- Mysql數(shù)據(jù)庫連接的信息:驅(qū)動類、連接地址、用戶名、密碼 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test" userId="root"
password="root" />
<!-- 默認為false,把JDBC DECIMAL 和NUMERIC類型解析為Integer,為true時 把JDBC DECIMAL 和NUMERIC類型解析為java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成POJO類的位置 -->
<javaModelGenerator
targetPackage="net.biancheng.pojo" targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的后綴 -->
<property name="enableSubPackages" value="false" />
<!-- 從數(shù)據(jù)庫返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="net.biancheng.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的后綴 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetProject:mapper接口生成的的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="net.biancheng.mapper" targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的后綴 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定數(shù)據(jù)表 -->
<table tableName="website"></table>
<table tableName="student"></table>
<table tableName="studentcard"></table>
<table tableName="user"></table>
</context>
</generatorConfiguration>
創(chuàng)建 GeneratorSqlmap 類執(zhí)行生成代碼。
package net.biancheng;
import java.io.File;
import java.util.*;
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;
public class GeneratorSqlmap {
public void generator() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 指定配置文件
File configFile = new File("./config/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
// 執(zhí)行main方法以生成代碼
public static void main(String[] args) {
try {
GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
項目結(jié)構(gòu)如下圖所示。
執(zhí)行 GeneratorSqlmap 后刷新項目,項目結(jié)構(gòu)如下。
可以看到在 pojo 包中,有一部分是名字為 XxxExample 的類。類中包含以下 3 個成員變量,如下。
protected String orderByClause;
protected boolean distinct;
protected List<Criteria> oredCriteria;
以上變量說明如下:
distinct 字段用于指定 DISTINCT 查詢。
orderByClause 字段用于指定 ORDER BY 條件,這個條件沒有構(gòu)造方法,直接通過傳遞字符串值指定。
oredCriteria 字段用于自定義查詢條件。