Mybatis框架(入門)
(一)MyBatis 概述
MyBatis 本是Apache的一個開源專案 iBatis,2010年這個專案由apache software foundation 遷移到了google code,並
且改名為MyBatis(支援普通 SQL查詢,儲存過程和高階對映的優秀持久層架),再後來託管到github下
(1)MyBatis對JDBC的操作資料庫的過程進行封裝,使開發者只需關注 SQL 本身(通過mybatis提供的對映方式,自由靈
活生成(半自動化,大部分需要程式設計師編寫sql)滿足需要sql語句),而不需要花費精力去處理例如註冊驅動、建立
connection、建立statement、手動設定引數、結果集檢索等jdbc繁雜的過程程式碼;
(2)Mybatis通過xml或註解的方式將要執行的各種statement配置起來,並通過java物件和statement中的sql進行對映生成
最終執行的sql語句,最後由mybatis框架執行sql並將結果對映成java物件並返回(輸出對映)
(二)MyBatis 框架架構
(三)MyBatis 執行流程
MyBatis應用程式根據XML配置檔案建立SqlSessionFactory,SqlSessionFactory在根據配置,配置來源於兩個地方,
一處是配置檔案,一處是Java程式碼的註解,獲取一個SqlSession。SqlSession包含了執行sql所需要的所有方法,可以通過
SqlSession例項直接執行對映的sql語句,完成對資料的增刪改查和事務提交等,用完之後關閉SqlSession
(四)MyBatis 的優缺點
1、優點:
(1)簡單易學:mybatis本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar檔案+配置幾個sql對映檔案易於學習,易於使用,通過文件和原始碼,可以比較完全的掌握它的設計思路和實現;
(2)靈活:mybatis不會對應用程式或者資料庫的現有設計強加任何影響。 sql寫在xml裡,便於統一管理和優化。通過sql基本上可以實現我們不使用資料訪問框架可以實現的所有功能,或許更多;
(3)解除sql與程式程式碼的耦合:通過提供DAL層,將業務邏輯和資料訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和程式碼的分離,提高了可維護性;
(4)提供對映標籤,支援物件與資料庫的orm欄位關係對映;
(5)提供物件關係對映標籤,支援物件關係組建維護;
(6)提供xml標籤,支援編寫動態sql
2、缺點:
(1)編寫SQL語句時工作量很大,尤其是欄位多、關聯表多時,更是如此;
(2)SQL語句依賴於資料庫,導致資料庫移植性差,不能更換資料庫;
(3)框架還是比較簡陋,功能尚有缺失,雖然簡化了資料繫結程式碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改;
(4)二級快取機制不佳
3、總結:
mybatis的優點同樣是mybatis的缺點,正因為mybatis使用簡單,資料的可靠性、完整性的瓶頸便更多依賴於程式設計師對sql的使用水平上。sql寫在xml裡,雖然方便了修改、優化和統一瀏覽,但可讀性很低,除錯也非常困難,也非常受限(mybatis沒有hibernate那麼強大,但是mybatis最大的優點就是簡單小巧易於上手,方便瀏覽修改sql語句)
mybatis和hibernate本質區別和應用場景
(1)hibernate:是一個標準ORM框架(物件關係對映),入門門檻較高的,不需要程式寫sql,sql語句自動生成(對sql語句進行優化、修改比較困難的)
應用場景:適用與需求變化不多的中小型專案,比如:後臺管理系統,erp、orm、oa。
(2)mybatis:專注是sql本身,需要程式設計師自己編寫sql語句,sql修改、優化比較方便。mybatis是一個不完全的ORM框架,雖然程式設計師自己寫sql,mybatis也可以實現對映(輸入對映、輸出對映)
應用場景:適用與需求變化較多的專案,比如:網際網路專案
企業進行技術選型,以低成本高回報作為技術選型的原則,根據專案組的技術力量進行選擇。
(五)MyBatis 入門程式
1、 parameterType和resultType
(1)parameterType:在對映檔案中通過parameterType指定輸入引數的型別,定義輸入到sql中的對映型別,#{id}表示使用
perparestatement設定佔位符並將輸入變數id傳到sql(輸入對映)
(2)resultType:在對映檔案中通過resultType指定輸出結果的型別,定義結果對映型別(輸出對映)
2、#{} 和 ${}
(1)#{}表示一個佔位符號,#{}接收輸入引數,型別可以是簡單型別,pojo、hashmap如果接收簡單型別,#{}中可以寫成
value或其它名稱#{}接收pojo物件值,通過OGNL讀取物件中的屬性值,通過屬性.屬性.屬性...的方式獲取物件屬性值
(2)${}表示一個拼接符號,會引用sql注入,所以不建議使用${} ( ${}接收輸入引數,型別可以是簡單型別,pojo、
hashmap,如果接收簡單型別,${}中只能寫成value,${}接收pojo物件值,通過OGNL讀取物件中的屬性值,通過屬性.屬性.屬
性...的方式獲取物件屬性值)
3、 selectOne和selectList
selectOne表示查詢出一條記錄進行對映。如果使用selectOne可以實現使用selectList也可以實現(list中只有一個對
象)。selectList表示查詢出一個列表(多條記錄)進行對映,如果使用selectList查詢多條記錄,不能使用selectOne。