最近乙個專案用到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"?>如果實體類屬性和資料庫中欄位名稱不相同,必須在配置中宣告resultmap對映,指定欄位和屬性對應關係,查詢時指定resultmap,查詢成功後會返回user物件,或者是user集合。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" ?>
三張表關聯查詢,這裡定義三張表,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 ...