mybatis的架構
mybatis的2個核心對象:SqlSessionFactory、SqlSession
SqlSession封裝了jdbc,提供了大量的操作數據庫的方法。
SqlSession是線程不安全的,每一個線程都應該有自己的SqlSession實例,並且該實例不能被共享。
SqlSessionFactory用於創建SqlSession,SqlSessionFactory是線程安全的。
mybatis的執行過程
1、從配置文件中讀取mybatis配置
2、加載xml映射文件
3、創建會話工廠SqlSessionFactory
4、通過會話工廠創建SqlSession對象
5、創建Executor實例
mybatis底層定義了一個Executor接口來操作數據庫,可以根據SqlSession傳遞的參數動態生成需要執行的sql語句。mybatis給Executor接口提供了多種實現。
6、創建MappedStatement對象
Executor接口中操作數據庫的方法都有一個MappedStatement類型的參數,此參數封裝了映射信息,一個增刪改查元素對應一個MappedStatement對象,元素的id就是MappedStatement對象的id。
7、將輸入參數組裝到sql語句中
8、通過Executor實例執行sql語句
9、將結果集映射爲指定類型
mybatis、hibernate的比較
都是orm框架,orm Object Relational Mapping 對象關係映射,Object指的是java對象(po),Relational指的是關係數據庫中的數據。
-
hibernate是標準的orm框架,自動生成操作數據庫的方法、sql語句,編碼量少,開發效率高於mybatis;mybatis是半自動的orm框架,需要自己寫sql語句、操作數據庫的方法。
-
hibernate使用門檻高,需要掌握數據關係模型、複雜的hql;mybatis簡單易上手
-
hibernate自動生成了大量的sql語句、方法,很多都用不到、冗雜,死板、不好維護;mybatis可根據需求編寫sql語句、方法,支持動態sql,可自定義映射規則,支持存儲過程,靈活、好維護。
-
hibernate具有良好的數據庫無關性,移植性好,更換數據庫類型時,只需更改方言;mybatis不支持數據庫無關性。
-
hibernate對多表關聯查詢支持較差,更新操作需要發送整個po對象(所有字段),不支持儲存過程,不能進行sql優化來提高性能,適合場景簡單、對性能要求不高的項目;mybatis對關聯映射、多表查詢支持較好,可通過sql優化來提高性能(因爲是自己寫sql語句),複雜、對性能有要求的項目使用mybatis更合適。