1. 程式人生 > 實用技巧 >讀《深入淺出 Mybatis 技術與原理實戰》有感

讀《深入淺出 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