MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

MyBatis封裝了JDBC透過Mapper代理的方式,以前繁瑣的操作透過“屬性與欄位對映”就簡單化解,MyBatis的動態SQL完美展現了DBMS的獨特魅力。

一、多條件查詢

基於Mybatis的多條件查詢,是在Mapper代理的對映檔案中寫上原有的SQL,然後介面中寫一個帶參的方法即可,就像這樣:

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

相比於原生的JDBC那一套,透過MyBatis確實解決了不少硬編碼的問題

但是使用者的查詢永遠是動態的操作,他可能在多個條件中選擇其中少量條件進行查詢,我們的SQL是死的,而使用者需求對應的SQL卻是活的,這樣就會造成不匹配而形成語法錯誤

比如,根據這張表,若是要根據部分欄位查出整體,我們可以寫對應需求的SQL,但是我要是查詢的條件變少了或者變多了呢?若使用者只想透過一個條件來查詢,那麼在其他佔位符的位置不輸入於是成了null,過不了語法自然查不了,還得重新寫SQL,多麻煩

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

這個時候MyBatis的特色就體現出來了——動態SQL。

二、動態SQL

SQL語句會隨著使用者的輸入或者外部條件的變化而變化,則稱之為動態SQL。另外,最新 MyBatis 系列面試題整理好了,大家可以在Java面試庫小程式線上刷題。

1。 if-where

因為採用了Mapper代理開發,我們可以透過寫xml的形式來編寫我們的SQL,動態SQL的特性也就在這一舉動中所蘊育,在原有的Mapper檔案裡我們進行如下改造,讓平平無奇的SQL煥然一新:

標籤可以自動幫我們去掉and”,這樣,不管查詢的條件怎麼變,我跟著這個邏輯流程走就不會出現SQL語法毛病而導致查詢不出來的毛病啦,因為null的情況已經被if所過濾掉了,真是太哇塞了!

2。 choose-when-ortherwise

對於從多個條件中選擇一個的單條件查詢的場景,利用分支巢狀就可以實現動態選擇單條件:

在MyBatis的Mapper代理中,

相當於switch,

相當於case

與多條件查詢不同的是,SQL語句中只會有一個分支生效

當用戶一個條件都不選時,可以在

中寫上

1=1

讓語法成立,反之,若選擇了條件則會返回正常結果。

3。 foreach

對於批次刪除的場景,傳統的方法是透過in關鍵字結合佔位符來確定,就像這樣

where id in (?,?,?)

但對於動態的場景,批次的數量永遠是不確定的,這就導致還需要去改SQL裡的佔位符數量啊,又是一件麻煩事

PS:MyBatis會將陣列引數封裝成一個Map集合,預設情況(K-V)array=陣列。

下面使用了

@Param

註解改變了map集合中預設的key

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

於是MyBatis中的

解決了這一麻煩。

本質是透過遍歷的形式,批次刪除的資料是由id陣列或者集合來決定,

collection

屬性決定了要遍歷哪個陣列/集合,item屬性則來存放選出的元素,並把它放在佔位符裡,

separator

屬性表示分隔符

delete frpm mybatis where id in #{id}

有人會問為啥這裡只有一個

#{id}

,我的屬性欄位不止這一個呀?此id非彼id他是一個數組/集合。

三、多表操作

多表之間的關係有一對一,一對多,多對一,多對多,每一種都有建表的原則,以使用者-訂單模型為例

利用傳統的方法進行多表查詢無非是透過id來連線表然後封裝返回結果,MyBatis中也是如此,我們在Mapper檔案中寫好表字段之間的對映關係,定義好型別即可,只不過這一過程有點複雜,但一次配好之後即可極大減少硬編碼問題,提高效率。

1。 一對一

一個使用者有一張訂單

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

首先還是那套路,建好實體類,寫好介面方法,配置Mapper檔案,而多表操作的麻煩點就在於配置檔案,這裡透過例子細說一下

1。先把表寫好

CREATE TABLE orders (id INT PRIMARY KEY ,ordertime VARCHAR(20) NOT NULL DEFAULT ‘’,total DOUBLE,uid INT);INSERT INTO orders VALUES(1,2020,2000,1);INSERT INTO orders VALUES(2,2021,3000,2);INSERT INTO orders VALUES(3,2022,4000,3);CREATE TABLE USER (id INT PRIMARY KEY ,username VARCHAR(50) NOT NULL DEFAULT ‘’,passwords VARCHAR(50) NOT NULL DEFAULT ‘’);INSERT INTO USER VALUES(1,‘lyy’,333);INSERT INTO USER VALUES(2,‘myy’,444);INSERT INTO USER VALUES(3,‘xyy’,555);

2。寫Mapper配置檔案

在寫實體類時,要把一個實體寫到另一個實體的屬性裡面,這樣才體現關聯性,就比如“訂單是所使用者擁有的”,正因為這種關係我們才會在訂單實體類裡面寫上

private User user;

這一屬性,這樣根據id連線的兩個實體才能完美對接!

就像這樣:

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

透過

把兩張表對應的實體類連線起來,只不過是主鍵ID要用單獨的標籤

property

: 當前實體(order)中的屬性名稱(private User user)

javaType

: 當前實體(order)中的屬性的型別(User)

這兩個user有著本質上的卻別,就好像前者是在一個人的名字,後者正是被叫的那個人,MyBatis好像就利用了這一特性,透過標籤的形式連線了兩個實體

SQL環節和原來沒什麼區別,同樣也是透過

resultMap

把欄位和屬性對映封裝。

2.一對多

一個使用者有多張訂單

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

首先,在原有的User實體中得加上一個表示“使用者有哪些訂單的屬性”

private List orderList;

,目的是為了把訂單的資訊封裝到使用者的這個屬性裡,在Mapper檔案中體現:

<!——封裝order的資料——>

property

:集合名稱,User實體中的orderlist屬性

ofType

:當前集合中的資料型別,就是order實體

然後就是寫一對多的SQL:

總結來看,一對多相比於一對一就是在那個“一”中增添了封裝“多”的屬性而已,然後稍微調整一下SQL。另外,最新 MyBatis 系列面試題整理好了,大家可以在Java面試庫小程式線上刷題。

3。多對多

多使用者多角色

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

多對多的建表原則是引入一張中間表,用於維護外來鍵,就是一張表透過中間表找到另一張表

和一對多的模型類似,先在User實體類中增添一個“使用者具備哪些角色”的屬性private ListroleList;其次配置Mapper檔案:

多表的連線是靠中間表,這點在Mapper檔案中透過對映實現,具體是把兩張外表的id(userId和roleId)在id標籤中配置成同一個屬性,就像這樣:

SQL環節就得用多對多的套路了

回想進行多表操作時MyBatis為我們帶來了什麼?他確實減少了很多硬編碼,我每一次新的SQL只需要在標籤裡改幾個屬性就可以,只要理清欄位與屬性的對映關係,在MyBatis中進行多表操作就是一個“對號入座”。

四、註解開發

針對於簡單的CRUD註解開發可以極大地提升效率,顧名思義就是把SQL寫在註解裡

查詢(@Select):

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

新增(@Insert):

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

修改(@Update):

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有

刪除(@Delete) :

MyBatis 多條件查詢、動態SQL、多表操作、註解開發,應有盡有