(Mybatis)逆向工程
Mybatis逆向工程:
作用:mybatis 官方提供逆向工程,可以使用它通過資料庫中表來自動生成 Mapper 介面和對映檔案(單表的增刪改查)和pojo類。
匯入的jar包有:
user.sql:
/* Navicat Premium Data Transfer Source Server : localhost_3306 Source Server Type : MySQL Source Server Version : 50722 Source Host : localhost:3306 Source Schema : mybatis01 Target Server Type : MySQL Target Server Version : 50722 File Encoding : 65001 Date: 04/07/2018 11:08:15 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '使用者名稱稱', `birthday` date NULL DEFAULT NULL COMMENT '生日', `sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性別', `address` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, '王五', NULL, '2', NULL); INSERT INTO `user` VALUES (10, '張三', '2014-07-10', '1', '北京市'); INSERT INTO `user` VALUES (16, '張小明', NULL, '1', '河南鄭州'); INSERT INTO `user` VALUES (22, '陳小明', NULL, '1', '河南鄭州'); INSERT INTO `user` VALUES (24, '張三丰', NULL, '1', '河南鄭州'); INSERT INTO `user` VALUES (25, '陳小明', NULL, '1', '河南鄭州'); INSERT INTO `user` VALUES (26, '王五', NULL, NULL, NULL); INSERT INTO `user` VALUES (28, '趙四', '2018-07-02', '1', '福建'); INSERT INTO `user` VALUES (29, '老王', '2018-07-02', '1', '福建'); INSERT INTO `user` VALUES (31, '小王', '2018-07-02', '1', '福建'); INSERT INTO `user` VALUES (32, '小王', '2018-07-02', '1', '福建'); SET FOREIGN_KEY_CHECKS = 1;
orders.sql:
/* Navicat Premium Data Transfer Source Server : localhost_3306 Source Server Type : MySQL Source Server Version : 50722 Source Host : localhost:3306 Source Schema : mybatis01 Target Server Type : MySQL Target Server Version : 50722 File Encoding : 65001 Date: 04/07/2018 11:19:10 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for orders -- ---------------------------- DROP TABLE IF EXISTS `orders`; CREATE TABLE `orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '下單使用者id', `number` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '訂單號', `createtime` datetime(0) NOT NULL COMMENT '建立訂單時間', `note` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '備註', PRIMARY KEY (`id`) USING BTREE, INDEX `FK_orders_1`(`user_id`) USING BTREE, CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of orders -- ---------------------------- INSERT INTO `orders` VALUES (3, 1, '1000010', '2015-02-04 13:22:35', NULL); INSERT INTO `orders` VALUES (4, 1, '1000011', '2015-02-03 13:22:41', NULL); INSERT INTO `orders` VALUES (5, 10, '1000012', '2015-02-12 16:13:23', NULL); SET FOREIGN_KEY_CHECKS = 1;
步驟一:generatorConfig.xml 配置檔案的編寫
注意以下要點:
1、新增要生成的資料庫表
2、生成 pojo 檔案所要存放包的路徑
3、生成mapper 檔案所要存放包的路徑
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>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自動生成的註釋 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--資料庫連線的資訊:驅動類、連線地址、使用者名稱、密碼 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis01" userId="root"
password="1234">
</jdbcConnection>
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
userId="yycg"
password="yycg">
</jdbcConnection> -->
<!-- 預設false,把JDBC DECIMAL 和 NUMERIC 型別解析為 Integer,為 true時把JDBC DECIMAL 和
NUMERIC 型別解析為java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO類的位置 -->
<javaModelGenerator targetPackage="com.jadan.pojo"
targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的字尾 -->
<property name="enableSubPackages" value="false" />
<!-- 從資料庫返回的值被清理前後的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper對映檔案生成的位置 -->
<sqlMapGenerator targetPackage="com.jadan.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的字尾 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper介面生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.jadan.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的字尾 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定資料庫表 -->
<table tableName="user"></table>
<table tableName="orders"></table>
<!-- <table schema="" tableName="sys_user"></table>
<table schema="" tableName="sys_role"></table>
<table schema="" tableName="sys_permission"></table>
<table schema="" tableName="sys_user_role"></table>
<table schema="" tableName="sys_role_permission"></table> -->
<!-- 有些表的欄位需要指定java型別
<table schema="" tableName="">
<columnOverride column="" javaType="" />
</table> -->
</context>
</generatorConfiguration>
步驟二:使用 java 類生成 mapper檔案
StartServer.java:
package generator;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
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 StartServer {
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("generator.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);
}
public static void main(String[] args) throws Exception {
try {
StartServer startServer = new StartServer();
startServer.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
步驟三:執行 StartServer.java 檔案,重新整理專案會自動生成以下內容
逆向工程注意事項:
1、Mapper 檔案內容不是覆蓋而是追加
XXXMapper.xml檔案已經存在時,如果進行重新生成則mapper.xml檔案內容不被覆蓋而是進行內容追加,結果導致mybatis解析失敗。
解決方法:刪除原來已經生成的mapper xml檔案再進行生成。
Mybatis自動生成的po及mapper.java檔案不是內容而是直接覆蓋沒有此問題。
2、Table schema問題
下邊是關於針對oracle資料庫表生成程式碼的schema問題:
Schma即資料庫模式,oracle中一個使用者對應一個schema,可以理解為使用者就是schema。
當Oralce資料庫存在多個schema可以訪問相同的表名時,使用mybatis生成該表的mapper.xml將會出現mapper.xml 內容重複的問題,結果導致mybatis解析錯誤。
解決方法:在table中填寫schema,如下:
<table schema="XXXX" tableName=" " >
XXXX即為一個schema的名稱,生成後將mapper.xml的schema字首批量去掉,如果不去掉當oracle使用者變更了sql語 句將查詢失敗。
快捷操作方式:mapper.xml檔案中批量替換:“from XXXX.”為空
Oracle查詢物件的schema可從dba_objects中查詢,如下:
select * from dba_objects