1.1 簡介
MyBatis Generator簡介
MyBatis生成器(MBG)是MyBatis MyBatis的程式碼生成器。它將為MyBatis的所有版本生成程式碼。它將對一個資料庫表(或多個表)進行內部檢查,並將生成可用於訪問表的工件。這減輕了設定物件和配置檔案以與資料庫表進行互動的麻煩。MBG試圖對簡單CRUD(建立,檢索,更新,刪除)的大部分資料庫操作產生重大影響。您仍將需要手工編寫SQL和物件程式碼以進行聯接查詢或儲存過程。
MBG會根據其配置方式以不同的樣式和不同的語言生成程式碼。例如,MBG可以生成Java或Kotlin程式碼。MBG可以生成MyBatis3相容的XML-儘管現在認為MBG是舊版使用。生成的程式碼的較新樣式不需要XML。
根據其配置方式,MyBatis Generator可能會生成:
與表結構匹配的Java或Kotlin類。這可能包括:
- 匹配表主鍵的類(如果有主鍵)
- 一個與表的非主鍵欄位匹配的類(BLOB欄位除外)
- 一個包含表的BLOB欄位的類(如果表具有BLOB欄位)
- 一個啟用動態選擇,更新和刪除的類
2.1 使用
環境:IDEA
1.建立資料表
/*
Navicat MySQL Data Transfer
Source Server : mysql
Source Server Version : 80020
Source Host : localhost:3306
Source Database : myproject
Target Server Type : MYSQL
Target Server Version : 80020
File Encoding : 65001
Date: 2020-06-29 13:23:18
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
`id` int NOT NULL,
`classname` varchar(255) DEFAULT NULL,
`classimage` bigint DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES ('1', '計算機', null);
INSERT INTO `class` VALUES ('2', '軟工', null);
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`uid` int DEFAULT NULL,
`admin` int DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`phonenumber` int DEFAULT NULL,
`classid` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `classid` (`classid`),
CONSTRAINT `classid` FOREIGN KEY (`classid`) REFERENCES `class` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '徐浩傑', '970829', '928675426', '1', '928675426@qq.com', '1838145982', '1');
INSERT INTO `user` VALUES ('2', '小明', '123456', '568985656', '2', '568985656@qq.com', '1254635895', '2');
我以這兩張表作為演示,看如何用Mybatis MBG逆向生成java檔案。
2.1.1 配置檔案
MybatisGenerator支援以下幾種方式來做MBG:
我選用java(maven)這兩種比較常用。
1.第一步建立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>
<properties resource="jdbc.properties" />
<!-- <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自動生成的註釋 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/myproject?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true"
userId="root"
password="xhj970829">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="com.hifix.springbootmyfirstproject.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.hifix.springbootmyfirstproject.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.hifix.springbootmyfirstproject.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<table schema="DB2ADMIN" tableName="user" domainObjectName="User" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
<table tableName="class" domainObjectName="Class"></table>
</context>
</generatorConfiguration>
官方模板:http://mybatis.org/generator/configreference/xmlconfig.html
<context id="DB2Tables" targetRuntime="MyBatis3">
這個targetRuntime屬性的指定很關鍵,官方支援四種屬性:
也就是告訴生成器採用哪種模式生成我們的java程式碼。
<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
connectionURL="jdbc:db2:TEST"
userId="db2admin"
password="db2admin">
</jdbcConnection>
- 這個標籤一眼明瞭,配置JDBC驅動包,地址等等。
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
- 這個標籤作用是強制型別轉換,因為mysql中有些資料型別比如date,bitint等等需要轉成java 中的資料格式。
<javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
- 指定pojo包位置。targetProject是指定專案位置。
- enableSubPackages是否自動新增包名字尾。
- trimStrings是否去除空格
<sqlMapGenerator targetPackage="test.xml" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
- 指定mapper.xml的位置
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
- 指定dao包的位置
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
這裡給出了一個表單逆向的模板,tableName資料庫中的表名,domainObjectName指定生成的pojoclassname.(一般就這麼指定就行了其他子屬性可以不寫)
當然你還可以指定是否開啟具體的查詢,插入規則:
官方api:http://mybatis.org/generator/configreference/table.html
2.1.2 test測試生成
根據官方提供的介面程式碼:
@Test
public void mybatisGenerator() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("C:\\Users\\Administrator\\Downloads\\spring-boot-examples-master\\springboot-myfirstproject\\src\\main\\resources\\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);
}
這裡配置檔案的位置最好用絕對路徑,不然死活找不到,我也不知道為什麼。。我之前直接寫的generatorConfig.xml或者classpath:generatorConfig.xml。都報錯找不到指定檔案。
之後看生成的目錄檔案:
這樣就自動根據資料庫中的資訊逆向生成我們的dao,pojo,mapper層。
PS:之前用Hiberante的時候也用到過逆向,不過Hiberante的逆向是從java程式碼來逆向到資料庫。封裝的太狠,靈活性太低。