【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】前端
八個方面深度解析前端知識/技能,本篇分享的是: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中的配置,進行結果的轉換,構建須要的對象。 對於關聯結果的查詢,只須要查詢數據庫一次,而後對結果的整合和組裝所有放在了內存中
鳴謝感謝觀看,若有出錯,懇請指正