1. 程式人生 > >Mybatis 學習筆記(九)——Mybatis 逆向工程的三種方法

Mybatis 學習筆記(九)——Mybatis 逆向工程的三種方法

Mybatis 逆向工程

  逆向工程通常包括由資料庫的表生成 Java 程式碼 和 通過 Java 程式碼生成資料庫表。而Mybatis 逆向工程是指由資料庫表生成 Java 程式碼。
  Mybaits 需要程式設計師自己編寫 SQL 語句,但是 Mybatis 官方提供逆向工程可以針對單表自動生成 Mybaits 執行所需要的程式碼,包括 POJO、Mapper.java、Mapper.xml …。

一、通過 Eclipse 外掛完成 Mybatis 逆向工程

1. 線上安裝 Eclipse 外掛

  操作步驟:開啟Eclipse => Help => Eclipse Marketplace => 搜尋 Mybatis Generator => 選擇 Mybatis Generator 的版本 => Install => 重啟。
下載安裝 Mybatis Generator

2. 新建一個 Java Project 專案

  新建一個叫 mybatisGenerator 的 Java 專案,匯入 MySQL 的驅動包,如果是 Oracle 資料庫就匯入 Oracle 的驅動包,我這裡是 MySQL 資料庫,所以匯入的是 MySQL 的。
Java 專案結構

3. 編寫配置檔案

  逆向工程需要用到 xml 配置檔案,編寫配置檔案(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="false" />
		</commentGenerator>
		<!--資料庫連線的資訊:驅動類、連線地址、使用者名稱、密碼 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root"
			password="123456">
		</jdbcConnection>
		<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
			connectionURL="jdbc:oracle:thin:@localhost:1521:mybatis" 
			userId=""
			password="">
		</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.ssm.po"
			targetProject="mybatisGenerator">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
			<!-- 從資料庫返回的值被清理前後的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
        <!-- targetProject:mapper對映檔案生成的位置 -->
		<sqlMapGenerator targetPackage="com.ssm.mapper" 
			targetProject="mybatisGenerator">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>
		<!-- targetPackage:mapper介面生成的位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="com.ssm.mapper" 
			targetProject="mybatisGenerator">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>
		<!-- 指定資料庫表 -->
		<!-- 
			tableName:要生成的表名
       		domainObjectName:生成後的例項名
	        enableCountByExample:Count語句中加入where條件查詢,預設true開啟
	        enableUpdateByExample:Update語句中加入where條件查詢,預設true開啟
	        enableDeleteByExample:Delete語句中加入where條件查詢,預設true開啟
	        enableSelectByExample:Select多條語句中加入where條件查詢,預設true開啟
	        selectByExampleQueryId:Select單個物件語句中加入where條件查詢,預設true開啟
		 -->
		<table tableName="items">
			<!-- 
				常用:
				property:將所有欄位逆向生成為類屬性,預設全部
				ignoreColumn:生成時忽略列欄位 
			 -->
		</table>
		<table tableName="orders"></table>
		<table tableName="orderdetail"></table>
		<table tableName="user"></table>

		
	</context>
</generatorConfiguration>

注意:targetProject="mybatisGenerator"

4. 使用外掛執行

  操作步驟:右擊 generatorConfig.xml 檔案 => Run as => Run Mybatis Generator => 重新整理工程。
生成的程式碼
  有報錯是因為沒有匯入 Mybatis 相關的包。最後將生成的檔案拷入相關的工程當中。

二、通過 Java 程式碼完成 Mybatis 逆向工程

1. 新建一個 Java Project 專案

  新建一個 Java 專案,匯入Mybatis逆向工程包mybatis-generator-core-1.3.2.jar和資料庫驅動包mysql-connector-java-5.1.39-bin.jar


Java Project 專案結構

2. 編寫配置檔案

  編寫配置檔案,和前一種方法的配置檔案差不多,區別在於這裡的 targetProject 不一樣,這種方式的是targetProject="./src",生成的檔案也會在這個下面。

<?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="false" />
		</commentGenerator>
		<!--資料庫連線的資訊:驅動類、連線地址、使用者名稱、密碼 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root"
			password="123456">
		</jdbcConnection>
		<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
			connectionURL="jdbc:oracle:thin:@localhost:1521:mybatis" 
			userId=""
			password="">
		</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.ssm.po"
			targetProject="./src">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
			<!-- 從資料庫返回的值被清理前後的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
        <!-- targetProject:mapper對映檔案生成的位置 -->
		<sqlMapGenerator targetPackage="com.ssm.mapper" 
			targetProject="./src">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>
		<!-- targetPackage:mapper介面生成的位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="com.ssm.mapper" 
			targetProject="./src">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>
		<!-- 指定資料庫表 -->
		<!-- 
			tableName:要生成的表名
       		domainObjectName:生成後的例項名
	        enableCountByExample:Count語句中加入where條件查詢,預設true開啟
	        enableUpdateByExample:Update語句中加入where條件查詢,預設true開啟
	        enableDeleteByExample:Delete語句中加入where條件查詢,預設true開啟
	        enableSelectByExample:Select多條語句中加入where條件查詢,預設true開啟
	        selectByExampleQueryId:Select單個物件語句中加入where條件查詢,預設true開啟
		 -->
		<table tableName="items">
			<!-- 
				常用:
				property:將所有欄位逆向生成為類屬性,預設全部
				ignoreColumn:生成時忽略列欄位 
			 -->
		</table>
		<table tableName="orders"></table>
		<table tableName="orderdetail"></table>
		<table tableName="user"></table>

		
	</context>
</generatorConfiguration>

3. 編寫生成程式碼程式

  最後編寫一個簡單的 Java 執行程式,執行後重新整理工程就可以了。

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 GeneratorFromXML {

	public static void main(String[] args) throws Exception {
		List<String> warnings = new ArrayList<String>();
		boolean overwrite = true;
		File configFile = new File("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);
	}

}

生成的程式碼結構
  建議在這個專案中加入日誌,這樣能直觀得看出其執行過程。
加入日誌配置檔案log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

執行 GeneratorFromXML.java 時產生的日誌記錄:

DEBUG [main] - Retrieving column information for table "items"
DEBUG [main] - Found column "id", data type 4, in table "mybatis..items"
DEBUG [main] - Found column "name", data type 12, in table "mybatis..items"
DEBUG [main] - Found column "price", data type 7, in table "mybatis..items"
DEBUG [main] - Found column "detail", data type -1, in table "mybatis..items"
DEBUG [main] - Found column "pic", data type 12, in table "mybatis..items"
DEBUG [main] - Found column "createtime", data type 93, in table "mybatis..items"
DEBUG [main] - Retrieving column information for table "orders"
DEBUG [main] - Found column "id", data type 4, in table "mybatis..orders"
DEBUG [main] - Found column "user_id", data type 4, in table "mybatis..orders"
DEBUG [main] - Found column "number", data type 12, in table "mybatis..orders"
DEBUG [main] - Found column "createtime", data type 93, in table "mybatis..orders"
DEBUG [main] - Found column "note", data type 12, in table "mybatis..orders"
DEBUG [main] - Retrieving column information for table "orderdetail"
DEBUG [main] - Found column "id", data type 4, in table "mybatis..orderdetail"
DEBUG [main] - Found column "orders_id", data type 4, in table "mybatis..orderdetail"
DEBUG [main] - Found column "items_id", data type 4, in table "mybatis..orderdetail"
DEBUG [main] - Found column "items_num", data type 4, in table "mybatis..orderdetail"
DEBUG [main] - Retrieving column information for table "user"
DEBUG [main] - Found column "ID", data type 4, in table "mybatis..user"
DEBUG [main] - Found column "USERNAME", data type 12, in table "mybatis..user"
DEBUG [main] - Found column "SEX", data type 12, in table "mybatis..user"
DEBUG [main] - Found column "birthday", data type 91, in table "mybatis..user"
DEBUG [main] - Found column "address", data type 12, in table "mybatis..user"

三、通過 Maven 完成 Mybatis 逆向工程

1. 新建一個 Maven Project 專案

  新建一個 Maven 專案,然後新建資料夾 /mybatis-maven/src/main/resources,在資料夾下新建檔案 generatorConfig.xml。
Maven 專案結構

2. 配置 pom.xml 檔案

  配置 pom.xml 檔案,在 pom.xml 檔案的 project 標籤里加入程式碼:

<build>
	<plugins>
		<plugin>
			<groupId>org.mybatis.generator</groupId>
			<artifactId>mybatis-generator-maven-plugin</artifactId>
			<version>1.3.2</version>
			<dependencies>
				<dependency>
		            <groupId>mysql</groupId>
		            <artifactId>mysql-connector-java</artifactId>
		            <version>5.1.38</version>
		        </dependency>	
			</dependencies>
			<configuration>
				<overwrite>true</overwrite>
			</configuration>
		</plugin>
	</plugins>
</build>

  配置外掛 generator 版本是 1.3.2 並配置 Mysql 驅動是 5.1.38。

3. 配置檔案 generatorConfig.xml

  generatorConfig.xml 是在目錄 src 下的 main 下的 resources 下。注意這裡的targetProject="./src" 生成的檔案也會在這個下面。

<?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="false" />
		</commentGenerator>
		<!--資料庫連線的資訊:驅動類、連線地址、使用者名稱、密碼 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root"
			password="123456">
		</jdbcConnection>
		<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
			connectionURL="jdbc:oracle:thin:@localhost:1521:mybatis" 
			userId=""
			password="">
		</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.ssm.po"
			targetProject="./src">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
			<!-- 從資料庫返回的值被清理前後的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
        <!-- targetProject:mapper對映檔案生成的位置 -->
		<sqlMapGenerator targetPackage="com.ssm.mapper" 
			targetProject="./src">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>
		<!-- targetPackage:mapper介面生成的位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="com.ssm.mapper" 
			targetProject="./src">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>
		<!-- 指定資料庫表 -->
		<!-- 
			tableName:要生成的表名
       		domainObjectName:生成後的例項名
	        enableCountByExample:Count語句中加入where條件查詢,預設true開啟
	        enableUpdateByExample:Update語句中加入where條件查詢,預設true開啟
	        enableDeleteByExample:Delete語句中加入where條件查詢,預設true開啟
	        enableSelectByExample:Select多條語句中加入where條件查詢,預設true開啟
	        selectByExampleQueryId:Select單個物件語句中加入where條件查詢,預設true開啟
		 -->
		<table tableName="items">
			<!-- 
				常用:
				property:將所有欄位逆向生成為類屬性,預設全部
				ignoreColumn:生成時忽略列欄位 
			 -->
		</table>
		<table tableName="orders"></table>
		<table tableName="orderdetail"></table>
		<table tableName="user"></table>

		
	</context>
</generatorConfiguration>

4. 執行 Maven

  執行命令mybatis-generator:generate
  操作步驟:選中專案右擊 => Run As => Maven build… =>在 Goals 中輸入mybatis-generator:generate => Run =>重新整理工程。
生成的程式碼結構