Springboot 整合Mybatis 逆向工程(詳解版)
什麼逆向工程
分析數據庫中數據表,自動生成JavaBean(與數據庫表對應的實體類)、dao 接口(數據訪問層接口,定義了訪問數據的方法)、SQLMap (sql 語句映射文件,與dao層接口類一一對應)
step1:寫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>
<!-- 在maven中配置了依賴這個就可以註釋掉了-->
<!-- <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--數據庫連接信息-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://10.10.10.10:3306/meeting?useUnicode=true&characterEncoding=utf-8&serverTimezone=CTT"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--JavaBean 實體類-->
<javaModelGenerator targetPackage="top.crxk.MyBatisGenerator.entity" targetProject="./src/main/java">
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--SQL映射文件-->
<sqlMapGenerator targetPackage="mapping" targetProject="/Users/crxk/Documents/codeWorld/dhu/Learning/MyBatisGenerator/src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--Mapper接口-->
<javaClientGenerator type="XMLMAPPER" targetPackage="top.crxk.MyBatisGenerator.dao" targetProject="/Users/crxk/Documents/codeWorld/dhu/Learning/MyBatisGenerator/src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--配置所要生成代碼的表-->
<table schema="DB2ADMIN" tableName="task" domainObjectName="Task" >
</table>
</context>
</generatorConfiguration>
關於一些配置項的解釋:
targetPackage
用於配置生成的代碼要放在哪個包裏面, 這個如果沒有的話Mybatis Generator會自動創建。
targetProject
官方定義是
This is used to specify a target project for the generated objects.
用最直白的語句解釋就是:targetPackage所在的目錄,也就是targetPackage的父目錄。
這個目錄是一定要有的,如果沒有的話Mybatis generator不會自動創建。
這裏的路徑可以寫絕對路徑,也可以寫相對路徑,相對路徑是相對於這個xml配置文件的!
最坑的一點:
關於爲什麼Mybatis generator程序運行成功以後,並沒有代碼文件生成的問題,是因爲:
mac和windows有些不一樣
mac下路徑要這樣寫./src
windows下的路徑是這樣寫.src
這個是很坑的,mbg不會給出錯誤提示!
step2:運行程序生成代碼
Mybatis Generator官方提供了很多種方式來生成代碼,但最好用最靈活的是直接寫一段Java代碼,讀取配置文件,來生成目標代碼。
package top.crxk.MyBatisGenerator;
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;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class TestMbg {
public static void main(String[] args) throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 從這裏加載配置文件,此時要注意路徑
// 其他的代碼不用動,直接運行即可
File configFile = new File("mbg.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);
}
}
step3:使用目標代碼
Mybatis Generator生成的代碼提供了非常強大的對於單表的 增刪改查的操作。
每一個表mbg會生成四個文件,以task表爲例,分別是
- Task.java
- TaskExample.java
- TaskMapper.java
- TaskMapper.xml
使用TaskExample.java這個類可動態地定義出各種條件查詢子句,滿足對於單個表的各種增刪改查的操作,如果不涉及到其他的表,基本上不用和其他文件打交道了。
舉個例子:
@Controller
@ResponseBody
@RequestMapping("/test")
public class testMbgController {
@Autowired
TaskMapper taskMapper;
@Autowired
TaskExample taskExample;
@RequestMapping("/countByExample")
public long countByExample(int id) {
taskExample.or().andIdEqualTo(id);
return taskMapper.countByExample(taskExample);
}
@RequestMapping("/selectByExample")
public List<Task> selectByExample() {
taskExample.or().andIdEqualTo(12);
return taskMapper.selectByExample(taskExample);
}
}
相關細節
TaskExample.Criteria
主要就是定義各種查詢條件的,是TaskExample的核心。
taskExample.or()
調用taskExample的or()方法,會返回一個Criteria,Criteria定義了與數據表中各個字段相關的方法,調用這些方法來設置條件,可以鏈式調用以添加多個條件。
taskExample.or().andIdEqualTo(12).andDeviceIdIsNull();
所包含的條件
- IS NULL-表示相關列必須爲NULL
- IS NOT NULL-表示相關列不能爲NULL
- =(等於)-表示相關列必須等於方法調用中傳遞的值
- <>(不等於)-表示相關列不得等於方法調用中傳遞的值
- >(大於)-表示相關列必須大於方法調用中傳遞的值
- > =(大於或等於)-表示相關列必須大於或等於在方法調用中傳遞的值
- <(小於)-表示相關列必須小於方法調用中傳遞的值
- <=(小於或等於)-表示相關列必須小於或等於在方法調用中傳遞的值
- LIKE-表示相關列必須與方法調用中傳遞的值“相似”。 該代碼未添加必需的'%',您必須在方法調用中傳遞的值中自行設置該值。
- 不喜歡-意味着相關列必須“不喜歡”方法調用中傳遞的值。 該代碼未添加必需的'%',您必須在方法調用中傳遞的值中自行設置該值。
- BETWEEN-表示相關列必須在方法調用中傳遞的兩個值之間。
- NOT BETWEEN-表示相關列必須在方法調用中傳遞的兩個值之間“不在”之間。
- IN-表示相關列必須是方法調用中傳入的值列表之一。
- NOT IN-表示相關列不得爲方法調用中傳遞的值列表之一。