mybatis多級關聯查詢資料封裝

2021-08-27 19:38:58 字數 2574 閱讀 6317

最近乙個專案用到mybatis,花了一點時間看了官方文件,後面就搭建起了框架,著手進行開發,mybatis上手很容易,但是有一些小的細節的注意(下文說明),否則錯誤很難查詢,對於用慣了hibernate的開發人員來說,使用mybatis可能可能需要加強sql。大概說一下mybatis優缺點,歡迎補充。

mybatis優點:

1. 易於上手和掌握。

2. sql寫在xml裡,便於統一管理和優化。

3. 解除sql與程式**的耦合。

4. 提供對映標籤,支援物件與資料庫的orm欄位關係對映

5. 提供物件關係對映標籤,支援物件關係組建維護

6. 提供xml標籤,支援編寫動態sql。

mybatis缺點:

1. sql工作量很大,尤其是字段多、關聯表多時,更是如此。

2. sql依賴於資料庫,導致資料庫移植性差。

3. 由於xml裡標籤id必須唯一,導致dao中方法不支援方法過載。

4. 字段對映標籤和物件關係對映標籤僅僅是對對映關係的描述,具體實現仍然依賴於sql。(比如配置了一對多collection標籤,如果sql裡沒有join子表或查詢子表的話,查詢後返回的物件是不具備物件關係的,即collection的物件為null)

5. dao層過於簡單,物件組裝的工作量較大。

6.  不支援級聯更新、級聯刪除。

7. 編寫動態sql時,不方便除錯,尤其邏輯複雜時。

8. 提供的寫動態sql的xml標籤功能簡單(連struts都比不上),編寫動態sql仍然受限,且可讀性低。

9. 使用不當,容易導致n+1的sql效能問題。

10. 使用不當,關聯查詢時容易產生分頁bug。

11. 若不查詢主鍵字段,容易造成查詢出的物件有「覆蓋」現象。

12. 引數的資料型別支援不完善。(如引數為date型別時,容易報沒有get、set方法,需在引數上加@param)

13. 多引數時,使用不方便,功能不夠強大。(目前支援的方法有map、物件、註解@param以及預設採用012索引位的方式)

查詢結果說明:

<?xml version="1.0" encoding="utf-8"?>

select u.*,d.*,r.*

from ly_user u

left join ly_department d on u.dep_id = d.dep_id

left join ly_user_role ur on ur.user_id = u.user_id

left join ly_role r on r.role_id = ur.role_id

where user_id=#

如果實體類屬性和資料庫中欄位名一樣,則可以直接指定resulttype,值為定義的實體類,mybatis會預設建立resultmap指定對應關係,resulttype=「user」,user需在配置中定義,如下段**,查詢成功後返回user物件。

<?xml version="1.0" encoding="utf-8" ?>

如果實體類屬性和資料庫中欄位名稱不相同,必須在配置中宣告resultmap對映,指定欄位和屬性對應關係,查詢時指定resultmap,查詢成功後會返回user物件,或者是user集合。

三張表關聯查詢,這裡定義三張表,a、b、c,b關聯a,c關聯b,在查詢a的時候同時查詢b和c,在a實體類中定義b物件集合,在b實體類中定義c物件集合。

a表,b表,c表

public class a 

public void setaid(int aid)

public listgetbs()

public void setbs(listbs)

}public class b

public void setbid(int bid)

public int getbaid()

public void setbaid(int baid)

public listgetcs()

public void setcs(listcs)

}public class c

public void setcid(int cid)

public int getcbid()

public void setcbid(int cbid)

}

<?xml version="1.0" encoding="utf-8"?>

select * from ly_a a

left join ly_b b on a.a_id = b.b_a_id

left join ly_c c on b.b_id = c.c_b_id

where a.a_id=#

<?xml version="1.0" encoding="utf-8"?>

<?xml version="1.0" encoding="utf-8"?>

在呼叫getabyid或者getalla,返回a物件或者a集合,a物件中已經封裝了關聯的b物件,b物件中已經封裝了關聯的c物件。

mybatis的關聯查詢還有其他集中配置方式,這裡只介紹多級關聯查詢,

mybatis關聯查詢

備註 1 type是實體類 2 id是唯一標識,是resulmap指定的標識 4 collection是集合對映,用於多個物件 association是用於單個物件 5 如果裡面有collection,又有association,應該把association放前面,不然會報錯 6 無論是associ...

mybatis級聯 關聯 查詢

級聯 關聯 查詢,mybatis已經有了很好的支援,配置也相當簡單,示例 一種是一對一的,一種是一結多的,association用於前者,collection用於後者。下面都有相應配置。當然一對一的,可以直接配置在一起,就不用兩次查詢了。select from school where id sel...

MyBatis學習之路(關聯查詢)

1.一對一關聯 mybatis中使用association標籤來解決一對一的關聯查詢,association標籤可用的屬性如下 方法1 使用巢狀結果對映來處理,封裝聯表查詢的結果 select from class c,teacher t where c.teacher id t.t id and ...