讀《深入淺出 Mybatis 技術與原理實戰》有感
讀《深入淺出 Mybatis 技術與原理實戰》有感
前言
隨著大資料時代的到來,Java持久層框架 Mybatis 成為越來越多企業的選擇。 這本書分為三個部分,我簡單的把我的理解在這篇部落格簡單記錄一下!如果想有更深的瞭解,可以看一下楊開振老師的這本書《深入淺出 Mybatis 技術與原理實戰》。
一、如何高效使用 Mybatis
Mybatis 什麼場景下使用;Mybatis 基礎模組和生命週期例項;Mybatis 配置的含義和內容;Mybatis 元素和使用方法;動態SQL等…
1.1、MyBatis 簡介
首先傳統的JDBC連線
- 註冊驅動(資料庫)
- 建立連線
- 執行Statement
- 返回結果集
- 關閉資料庫
ORM 模型 ,資料庫的表與簡單的Java 物件(POJO 類)的對映關係模型。
Hibernate 全自動 ORM 框架,Mybatis 半自動 ORM 框架。
1.2、MyBatis 基本構成
核心元件:
- SqlSessionFactoryBuilder 構造器 ,根據配置資訊或程式碼生成SqlSessionFactory(工廠介面)。
- SqlSessionFactory 依賴工廠生成 SqlSession 會話。
- SqlSession 既可以 傳送sql 去執行並返回結果,也可以獲取Mapper 介面。
- Sql Mapper 元件, 由Java介面 和 XML檔案 (或註解)構成,需要給出對應 sql 及 對映規則。負責傳送sql並執行,並返回結果。
1.2.1、SqlSessionFactory 通過 SqlSessionFactoryBuilder 構造器 獲得例項 。 SqlSessionFactory 是一個工廠介面,而不是一個類,任務是建立 SqlSession,類似於一個JDBC的一個連線物件。
提供兩種方式建立 SqlSessionFactory:
- XML配置的方式(建議)
- 程式碼的方式(不建議)
1、初始化資料庫連線池
2、定義資料庫事務管理方式
3、建立Configuration,資料庫執行環境註冊給他
4、加入對映器,SqlSessionFactoryBuilder 通過Configuration 物件建立 SqlSessionFactory
1.2.2、建立SqlSession
SqlSession (美女)為你服務,你問了問題後,她會找工程師(Executor)解決,解決完成後,把結果Result 返回。
SqlSesion 主要用途兩種:
- 獲取對映器,對映器通過名稱空間和方法名稱找到對應SQL,傳送給資料庫執行後返回結果。
- 通過命名資訊執行sql返回結果,ibatis留下的方式。SqlSession 通過update、insert、delete、select等方法,帶上方法id,找到對應的XML對應的SQL,也支援事務,執行commit、rollback命令。
1.2.3、對映器
對映器由Java 介面和 XML 檔案(或註解)組成。作用如下:
- 定義引數型別
- 描述快取
- 描述sql語句
- 定義查詢結果與對應POJO的對映關係
1.3、MyBatis 配置
Mybatis 配置 XML 檔案的層次結構
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <!-- 配置 -->
<properties /> <!-- 屬性 -->
<settings /> <!-- 設定 -->
<typeAliases /> <!-- 型別命名 -->
<typeHandlers /> <!-- 型別處理器 -->
<objectFactory /> <!-- 物件工廠 -->
<plugins /> <!-- 外掛 -->
<environments> <!-- 配置環境 -->
<environment> <!-- 環境變數 -->
<transactionManager /> <!-- 事務管理器 -->
<dataSource /> <!-- 資料來源 -->
</environment>
</environments>
<databaseIdProvider /> <!-- 資料庫廠商標識 -->
<mappers /> <!-- 對映器 -->
</configuration>
1.4、動態SQL
1.4.1、if 元素
相當於Java中的 if, 經常與 test 屬性聯合使用
<select id="getEmpById2" resultType="emp">
SELECT * FROM emp WHERE 1=1
<if test="empno != null">
AND empno = #{empno}
</if>
</select>
1.4.2、choose 、when、otherwise 元素
相當於Java 中的Switch… Case… default…
<select id="getEmpById3" resultType="emp" parameterType="emp">
SELECT * FROM EMP
<where>
<choose>
<when test="empno != null">
AND empno like #{empno}
</when>
<when test="ename != null">
AND ename like #{ename}
</when>
<otherwise>
AND job = "zz"
</otherwise>
</choose>
</where>
</select>
1.4.3、trim、where、set 元素
- 使用 where 就不用編寫1=1
- trim 元素
Prefix:字首。
prefixOverrides:去掉第一個指定內容。
suffix:字尾。
suffixoverride:去掉最後一個指定內容。
<!-- 代替where -->
<select id="getEmpById4" resultType="emp" parameterType="emp">
SELECT * FROM emp
<!-- <where> <if test="username!=null"> and name = #{username} </if> </where> -->
<trim prefix="where" prefixOverrides="AND |OR ">
<if test="empno != null">
and empno = #{empno}
</if>
<if test="ename!=null">
AND ename = #{ename}
</if>
</trim>
</select>
- Set 主要用於更新語句使用
<update id="updateEmprById2" parameterType="emp">
UPDATE emp
<set>
<if test="ename!=null"> ename=#{ename},</if>
<if test="job!=null"> job=#{job},</if>
</set>
<where>
<if test="empno!=null">
empno=#{empno};
</if>
</where>
</update>
1.4.4、foreach 元素
foreach用來遍歷,遍歷的物件可以是陣列,也可以是集合。
相關屬性:
Collection:collection屬性的值有三個分別是list、array、map三種。
Open:字首。
Close:字尾。
Separator:分隔符,表示迭代時每個元素之間以什麼分隔。
Item:表示在迭代過程中每一個元素的別名。
Index:用一個變數名錶示當前迴圈的索引位置。
<insert id="addEmp6">
insert into emp(ename,job)values
<foreach collection="emps" item="emp" separator=",">
(#{emp.ename},#{emp.job})
</foreach>
</insert>
Mapper 介面:
public int addEmp6(@Param("emps")List<Emp> emps);
1.4.5、bind 元素
<select id="getEmpById6" resultType="emp">
<!-- 聲明瞭一個引數empno 在後面就可以使用了 -->
<bind name="empno" value="'%' + empno + '%'" />
select * from emp where empno=${empno}
</select>
二、深入 Mybatis 原始碼
瞭解內部執行原理和外掛開發方法和技巧;SqlSession 構建方法 以及四大物件如何工作;外掛設計原理、開發方法
三、Mybatis 實戰應用
Spring 整合 MyBatis 應用;Mybatis 實用場景
3.1、對於檔案的操作,使用BLOB 欄位讀寫
File file = new File("D:\\");
FileInputStream in = new FileInputStream(file);
byte[] bytes = new byte((int) file.length());
try{
in.read(bytes);
} finally {
in.close();
}
Files files = new Files();
files.setFile(bytes);
轉載自:https://blog.csdn.net/weixin_45395031/article/details/109495114