MyBatis中的一些概念

2021-08-27 05:25:55 字數 3763 閱讀 6656

mybatis作為乙個輕量的sql對映框架,確實很簡單,但是知識點挺多,實際使用中還是會有時想不起來某個標籤該怎麼寫,所以整理了這篇文章,以備查詢。由於mybatis如此簡單,使得這一篇文章基本把實際使用中常碰到的事情都涵蓋了,包括:

mybatis中的一些概念

mybatis包含的內容

sql對映

動態sql

mybatis的架構

1. mybatis是個什麼東西

在使用mybatis的專案裡,日誌中往往會出現很多拼接sql語句的log,這其實說明了mybatis底層還是使用jdbc來實現的。在jdbc的基礎上,為了效能考慮,所有的語句都是基於sqlsession。顧名思義,維護這個類的例項其實就是維護了乙個對於某個資料庫的連線的會話,在這個會話裡可以有快取啊什麼之類的。

目前多數開發者還是會使用xml來進行mybatis的配置,包括mybatis的核心配置和sql對映配置。其實和註解一樣,xml本身只不過是乙個元資料的載體,最終起作用的還是mybatis的核心類。其中有這樣幾個比較重要的:

sqlsessionfactorybuilder,用來建立sqlsessionfactory的例項,之後就沒有用了,其生命週期只是在初始化的時候有作用。

sqlsessionfactory,mybatis最基礎的類,用來建立會話(即sqlsession的例項),其生命週期與整個系統的生命週期相同,在系統執行的任何時候都可以使用它查詢到當前資料庫的配置資訊等。

sqlsession,真正的和資料庫之間的會話,執行緒不安全,所以其生命週期和使用它的執行緒相同。

3. spring環境中mybatis的初始化過程

實際情況中mybatis往往是在spring的環境中使用的,mybatis本身並不依賴spring,但是使用spring可以極大的提高開發效率,由於spring進行了控制反轉,所以其中mybatis的初始化過程和正常過程稍稍有些不同:

spring發現需要建立sqlsessionfactory例項,會在classpath下找到mybatis的核心配置檔案,使用它來初始化乙個sqlsessionfactory例項。當然,這一步完全可以使用**來完成,或者使用註解,就更加清晰明了。

mybatis核心配置

快取、資料來源、日誌等關係到mybatis其本身行為的一些配置。

針對於具體業務邏輯的sql對映。

mybatis也可以使用註解來實現對映,對於簡單的語句,使用註解可能會更加清晰簡單,但是其真正強大的地方還是xml。

1. select屬性

描述id

此命名空間內的識別符號

parametertype

引數的類的全名或者alias,可選。預設為空。

parametermap

deprecated

resulttype

返回結果的型別全名或alias,如果結果是集合,此型別表示的是集合的成員型別。

resultmap

使用指定的resultmap來對映結果集。resultmap 和 resulttype只能二選一。

flushcache

如果為true,每次呼叫,一級快取和二級快取都會回寫。select語句中預設為false。

usecache

如果為true,結果將在二級快取中快取。select語句中預設為true

timeout

設定超時,若超時則丟擲異常。

fetchsize

嘗試在獲取資料時分批獲取。

statementtype

statement,prepared或者callable. 分別對應jdbc中的statement,preparedstatement和callablestatement respectively。預設prepared.

resultsettype

forward_only,scroll_sensitive或者scroll_insensitive。預設為空。

databaseid

使用特定的databaseidprovider

resultordered

巢狀查詢時使用。

resultsets

多返回集合時使用。

2. 修改語句(insert,update,delete)

這3種語句的屬性基本和上邊select的一樣,insert和update的語句有幾個特殊的屬性如下:

屬性描述

usegeneratedkeys

將使用jdbc的getgeneratedkeys方法來獲取主鍵的值。預設為false。

keyproperty

主鍵。mybatis會將生成的主鍵賦給這個列。聯合主鍵使用逗號隔開。

keycolumn

特定資料庫需要使用。

3. sql語句段(sql標籤)

標籤可以定義一段sql語句段,可以在其他語句中引入使用。sql標籤可以包含引數。示例如下:

$.id,$.username,$.password 

select,

from some_table t1

cross join some_table t2

引數(property)也可以在refid或者include進來的sql中使用。示例如下:

$table

from

select

field1, field2, field3

4. #{}和${}的區別#{}在底層實現上使用?做佔位符來生成preparedstatement,然後將引數傳入,大多數情況都應使用這個,它更快、更安全。

${}將傳入的資料直接顯示生成在sql中。如:order by $,如果傳入的值是111,那麼解析成sql時的值為order by 111, 如果傳入的值是id,則解析成的sql為order by id.

5. 型別別名

什麼地方都少不了這種小技巧,可以讓你少打很多字。

6. resultmap

官方文件上說這個特性是整個mybatis中最強大的特性(沒有之一)。其實它做的就是對映結果集。

cache和cach-ref

使用cache標籤在對映檔案內(某命名空間內)實現二級快取,其所有屬性都有預設值,所以單單乙個標籤就可以生效。cach-ref可以在兩個對映檔案之間共享快取

eviction="lru"//快取移除策略

flushinterval="60000"//預設不設定,不定時重新整理

size="1024"

readonly="false"/>

1. if條件判斷,引數為test

2. choose (巢狀when,otherwise)

多選一,引數為test

3. trim (where,set)

4. foreach

迴圈集合輸出,可以迴圈陣列,iterable物件,或者map,如果是map,則index會是key。

open="(" separator="," close=")">

#

5. bind宣告乙個使用ognl表示式生成的變數,在sql語句中使用。

攝影中的一些概念

1 什麼叫色別 色別是用以說明彩色和消色的區別。2 什麼叫明度 明度又叫明暗度,是顏色的深淺,也可以說它的明亮程度。3 色調的含義 色調是指顏色的性質即一張 中一定範圍的明亮程度 也稱明暗值 4 什麼叫色彩的飽和度 色彩的飽和度,就是顏色色調的可見程度,也稱色的純度。是指顏色純淨和鮮明的程度。某種顏...

UML中的一些概念

抽象 abstract 封裝 encapsulation 繼承 inheritance 多型 polymorphism 關聯 association 聚合 aggregation 組合 composition 內聚與耦合 cohesion coupling 域模型 domain model 域物件之...

openstack中的一些概念

1 endpoint endpoint,翻譯為 端點 我們可以理解它是乙個服務暴露出來的訪問點,如果需要訪問 乙個服務,則必須知道他的endpoint。因此,在keystone中包含乙個 endpoint 模板 endpoint emplate,在安裝keystone的時候我們可以在conf資料夾下...