mybatis連表查詢

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】前端

八個方面深度解析前端知識/技能,本篇分享的是:java

【mybatis連表查詢   】程序員

 

你們好,我是IT修真院武漢分院的15期學員,一枚正直純潔善良的JAVA程序員。 本次爲你們帶來關於深度思考的一個問題,咱們爲何要使用mybatis連表查詢?sql

(1)背景介紹數據庫

什麼是mybatis mybatis是一個優秀的持久層框架,他對jdbc操做數據庫的過程進行了封裝,使開發着只用關注sql自己,不用去關注例如註冊驅動,加載連接,獲得statement,處理結果集等複雜的過程。  mybatis經過xml或者註解的方式,將要執行的各類sql語句配置起來,並經過Java對象和statement中的sql語句映射生成最終的sql語句,最後由mybatis框架執行sql語句,並將結果映射成Java對象返回。   什麼是高級映射        對於數據庫中對錶的增刪改查操做,咱們知道增刪改都涉及的是單表,而只有查詢操做既能夠設計到單表操做又能夠涉及到多表操做,     因此對於輸入映射parameterType而言是沒有所謂的高級映射的,也就是說高級映射只針對於輸出映射(由於高級映射設計到多張表)。   session

(2).知識剖析  mybatis

mybatis工做原理         mybatis經過配置文件建立sqlsessionFactory,sqlsessionFactory根據配置文件,配置文件來源於兩個方面:一個是xml,一個是Java中的註解,獲取sqlSession。           SQLSession包含了執行sql語句的全部方法,能夠經過SQLSession直接運行映射的sql語句,完成對數據的增刪改查和事物的提交工做,用完以後關閉SQLSession。 mybatis解決的問題       1.使用數據庫鏈接池管理連接,避免了頻繁建立了、關閉連接,浪費資源,影響性能的問題。       2.用xml管理sql語句,讓Java代碼和sql語句分離,使得代碼更易維護。      3.解決了sql語句參數不定的問題。xml中能夠經過where條件決定sql語句的條件參數。mybatis將Java對象映射到sql語句,經過statement的parameterType定義輸入參數的類型。       4.mybatis自動將結果集封裝成Java對象, 經過statement的resultType定義輸出的類型。避免了因sql變化,對結果集處理麻煩的問題。  框架

(3).常見問題 什麼是外鍵? mybatis多表聯查用什麼類型接收?性能

(4).解決辦法      編碼

A表中的一個字段,是B表的主鍵,那他就能夠是A表的外鍵。表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值      2.resultType和resultMapl類型             resultType:要自定義pojo 保證sql查詢列和pojo的屬性對應,這種方法相對較簡單,因此應用普遍。            resultMap:使用association完成一對一映射須要配置一個resultMap標籤,過程有點複雜,若是要實現延遲加載就只能             用resultMap實現 ,若是爲了方便對關聯信息進行解析,也能夠用association將關聯信息映射到pojo中方便解析。 

(5).編碼實戰

(6).擴展思考 一對一查詢:用assocation 一對多查詢:collection  

(7).參考文獻 外鍵關聯 https://blog.csdn.net/ccsuxwz... 師兄PPT

Mybatis高級映射 http://codingxiaxw.cn/2016/11...  

(8)更多問題: 

(1)mybatis解決的問題

 1)使用數據庫鏈接池管理連接,避免了頻繁建立了、關閉連接,浪費資源,影響性能的問題。 

2)用xml管理sql語句,讓Java代碼和sql語句分離,使得代碼更易維護。 

3)解決了sql語句參數不定的問題。xml中能夠經過where條件決定sql語句的條件參數。mybatis將Java對象映射到sql語句,經過statement的parameterType定義輸入參數的類型。 

4)mybatis自動將結果集封裝成Java對象, 經過statement的resultType定義輸出的類型。避免了因sql變化,對結果集處理麻煩的問題。

(2)mybatis多表聯查用什麼類型接收? 

有兩種方式:1.經過自定義resultMap接收; 2.經過resultType=java.util.Map接收;

(3)嵌套查詢的N+1問題?  

儘管嵌套查詢大量的簡化了存在關聯關係的查詢,但它的弊端也比較明顯:即所謂的N+1問題。關聯的嵌套查詢顯示獲得一個結果集,而後根據這個結果集的每一條記錄進行關聯查詢。 假設嵌套查詢就一個(即resultMap 內部就一個association標籤),現查詢的結果集返回條數爲N,那麼關聯查詢語句將會被執行N次,加上自身返回結果集查詢1次,共須要訪問數據庫N+1次。若是N比較大的話,這樣的數據庫訪問消耗是很是大的。因此使用這種嵌套語句查詢應確保N值不會很大。

(4)嵌套結果查詢與嵌套查詢的區別? 嵌套語句的查詢會致使數據庫訪問次數不定,進而有可能影響到性能。嵌套結果的查詢:即對於一對多,多對多,多對一的狀況的查詢,Mybatis經過聯合查詢,將結果從數據庫內一次性查出來,而後根據其一對多,多對一,多對多的關係和ResultMap中的配置,進行結果的轉換,構建須要的對象。 對於關聯結果的查詢,只須要查詢數據庫一次,而後對結果的整合和組裝所有放在了內存中                                                                                                                                                                  

鳴謝感謝觀看,若有出錯,懇請指正

相關文章
相關標籤/搜索