spring boot整合Mybatis簡介
什麼是 MyBatis ? MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
總體流程:
(1)載入配置並初始化
觸發條件:載入配置檔案
配置來源於兩個地方,一處是配置檔案,一處是Java程式碼的註解,將SQL的配置資訊載入成為一個個MappedStatement物件(包括了傳入引數對映配置、執行的SQL語句、結果對映配置),儲存在記憶體中。
(2)接收呼叫請求
觸發條件:呼叫Mybatis提供的API
傳入引數:為SQL的ID和傳入引數物件
處理過程:將請求傳遞給下層的請求處理層進行處理。
(3)處理操作請求
觸發條件:API介面層傳遞請求過來
傳入引數:為SQL的ID和傳入引數物件
處理過程:
(A)根據SQL的ID查詢對應的MappedStatement物件。
(B)根據傳入引數物件解析MappedStatement物件,得到最終要執行的SQL和執行傳入引數。
(C)獲取資料庫連線,根據得到的最終SQL語句和執行傳入引數到資料庫執行,並得到執行結果。
(D)根據MappedStatement物件中的結果對映配置對得到的執行結果進行轉換處理,並得到最終的處理結果。
(E)釋放連線資源。
(4)返回處理結果
步驟1:安裝
在pom檔案中新增依賴
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
步驟2:設定配置
配置檔案的作用是設定Mybatis操作資料庫的屬性,由於使用的是spring boot中mybatis的外掛,所以直接在application.properties當中便可以對mybatis進行配置,它的配置和其它的外掛一樣,使用mybatis字首
1:config-location:
mybatis的xml形式的配置檔案的路徑,這個屬性不能和configuration共同使用.
2:check-config-location:
檢查本地xml形式的配置檔案是否存在
3:mapper-locations
對映檔案Mapper.xml的路徑
4:type-aliases-package
用於搜尋Mapper.xml對映的實體類所在的包,包的分割符是 ",; "
5.configuration
mybatis的配置屬性,用這個構建Configuration物件,這個屬性不能和config-location共同使用
configuration屬性下常用的配置有:
map-underscore-to-camel-case: true 設定屬性對映方式,代表使用駝峰命名
mybatis預設是屬性名和資料庫欄位名一一對應的,即
資料庫表列:user_name
實體類屬性:user_name
但是java中一般使用駝峰命名
資料庫表列:user_name
實體類屬性:userName
default-statement-timeout: 30 設定超時的時間,它決定驅動等待資料庫響應的秒數
cache-enabled:true 啟用對映快取功能
步驟3:配置Mapper介面掃描的包
在啟動類上添加註解 @MapperScan({"com.example.demo.*.dao"}),啟動之後,會自動掃描識別Mapper.xml檔案對應的介面
也可以通過在每個介面上新增@Mapper介面
步驟3:編寫資料庫對應的實體類
public class TPermissionEntiry {
private Integer id;//許可權ID
private Integer type;//許可權型別 1:選單許可權 2:資料許可權 3:操作許可權
private String name;//許可權名稱
private Integer no;//編號
private Integer pno;//父編號
private String url;//連結地址
private String className;//保留欄位
private Integer deleteFlag;//刪除標記 0:正常 1:禁用
private String index;
省略get,set方法...
}
步驟4:填寫操作的Mapper介面
介面中的每個方法對應著一個sql語句
public interface TPermissionMapper {
//根據ID刪除一條
int deleteByPrimaryKey(@Param("id")Integer id);
//根據對應的類新增一條資料
int insert(TPermissionEntiry record);
//根據ID查詢一條
TPermissionEntiry selectByPrimaryKey(Integer id);
}
步驟5:填寫實現Mapper介面對應的Mapper.xml檔案
Mapper介面的編寫需要遵守相關規範:
- mapper.xml中的名稱空間namespace等於Mapper介面類的全路徑;
- mapper.java中的方法名和mapper.xml中的增刪改查的id保持一致;
- mapper介面中方法的輸入引數型別和mapper.xml中的ParameterType一致,如果是多個引數也可以不用寫;
- mapper介面中的方法的返回值型別和mapper.xml中的ResultType一致。
遵循以上規範,mybatis就可以自動生成(反射機制)相關的mapper代理的實現類的物件。
例子:我們遵循在步驟2當中mapper-locations的配置,在對應的路徑下新建一個TPermissionMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hokai.sysManage.dao.TPermissionMapper" >
<sql id="Base_Column_List" >
id, type, name, no, pno, url, class_name, delete_flag,index
</sql>
<!-- 根據id查詢許可權 -->
<select id="selectByPrimaryKey" resultMap="com.hokai.sysManage.bo.TPermissionEntiry" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from t_permission
where id = #{id,jdbcType=INTEGER}
</select>
<!-- 根據id刪除許可權 -->
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete from t_permission
where id = #{id,jdbcType=INTEGER}
</delete>
<!-- 新增一條許可權資料 -->
<insert id="insert" parameterType="com.hokai.sysManage.bo.TPermissionEntiry" >
insert into t_permission (id, type, name,
no, pno, url, class_name,
delete_flag)
values (#{id,jdbcType=INTEGER}, #{type,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
#{no,jdbcType=INTEGER}, #{pno,jdbcType=INTEGER}, #{url,jdbcType=VARCHAR}, #{className,jdbcType=VARCHAR},
#{deleteFlag,jdbcType=INTEGER})
</insert>
</mapper>
mybatis還提供了一種方式是在Mapper介面的每個方法上添加註解,而不用寫Mapper.xml檔案方式,
兩者比較:
註解在簡單sql執行時比xml方式簡單,註解方式拼接動態 sql 功能有限
xml方式比註解寫起來麻煩,但靈活性較高(拼接動態sql),效率較快(註解其實底層也是將他轉換成xml再執行)
public interface TPermissionMapper {
//查詢資料
@Select("select * from t_permission where p.delete_flag = 0 ")
List<TPermissionEntiry> queryByPage();
//根據對應的類新增一條資料
@Insert("insert into t_permission (id, type, name, no, pno, url, class_name, delete_flag) values (#{id,jdbcType=INTEGER}, #{type,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, "#{no,jdbcType=INTEGER}, #{pno,jdbcType=INTEGER}, #{url,jdbcType=VARCHAR}, #{className,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=INTEGER})")
int insert(TPermissionEntiry record);
}