連mybits工做原理都不懂,你敢說你本身會java?

1、相較於Hibernate,mybatis的優點在哪裏?

Hibernate缺點:java

一、運行效率低,內存佔用比較嚴重sql

二、針對單一對象的增刪改查,適合Hibernate,而Hibernate在批量操做時處於弱勢數據庫

三、雖然Hibernate引入一二級緩存、lazyload、查詢緩存等更多優化空間(對於那些改動 不大且常用的數據,可將他們放入緩存中),但Hibernate對於持久層封裝過於完 整,致使開發人員沒法對sql進行優化,不適用於大型項目設計模式

mybatis優勢:緩存

一、代碼量大大減小,開發效率高安全

二、 MyBatis至關靈活,SQL寫在XML裏,從程序代碼中完全分離,下降耦合度,便於統 一管理和優化,並可重用bash

三、運行效率高session

2、mybatis原理

下面是mybatis的一個原理圖,看懂這個圖對理解mybatis工做原理很重要:mybatis

連mybits工做原理都不懂,你敢說你本身會java?

上面的原理圖看的不是很清晰,下面再詳細介紹一下mybatis的主要成員:app

一、Configuration

MyBatis全部的配置信息都保存在Configuration對象之中,配置文件的大部分配置都會存儲到該類中

二、SqlSession

做爲MyBatis工做的主要頂層API,表示和數據庫交互時的會話,完成必要數據庫增刪改查功能

三、Executor

MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護

StatementHandler 封裝了JDBC Statement操做,負責對JDBC statement 的操做,如設置參數等

四、ParameterHandler

負責對用戶傳遞的參數轉換成JDBC Statement 所對應的數據類型

五、ResultSetHandler

負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合

六、TypeHandler

負責java數據類型和jdbc數據類型(也能夠說是數據表列類型)之間的映射和轉換

七、MappedStatement

MappedStatement維護一條<select|update|delete|insert>節點的封裝

八、SqlSource

負責根據用戶傳遞的parameterObject,動態地生成SQL語句,將信息封裝到BoundSql對象中,並返回

九、BoundSql

表示動態生成的SQL語句以及相應的參數信息

下面介紹一下mybatis的工做流程:

首先,mybatis的增刪改查這些數據庫操做都是基於sqlsession類的,SqlSession又是由SqlSessionFactory類建立出來的(這裏採用了java設計模式中的工廠模式),而SqlSessionFactory是由SqlSessionFactoryBuilder建立的,SqlSessionFactoryBuilder要想建立SqlSessionFactory,必需要有原料(即mybatis配置文件),下面是建立SqlSession的代碼:

//加載classpath路徑下的mybatis配置文件InputStream in=Resources.getResourceAsStream("mybatis-config.xml");//根據加載配置文件產生的輸入流,來建立一個SqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);//根據SqlSessionFactory建立SqlSessionSqlSession session = sessionFactory.openSession();複製代碼

下面介紹這幾個重要對象的做用域和生命週期

一、SqlSessionFactoryBuilder

這個類能夠被實例化、使用和丟棄,一旦建立了 SqlSessionFactory,就再也不須要它了。所以 SqlSessionFactoryBuilder 實例的最佳做用域是方法做用域(也就是局部方法變量)。你能夠重用 SqlSessionFactoryBuilder 來建立多個 SqlSessionFactory 實例,可是最好仍是不要讓其一直存在以保證全部的 XML 解析資源開放給更重要的事情。

二、SqlSessionFactory

SqlSessionFactory 一旦被建立就應該在應用的運行期間一直存在,沒有任何理由對它進行清除或重建。使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複建立屢次。所以 SqlSessionFactory 的最佳做用域是應用做用域。有不少方法能夠作到,最簡單的就是使用單例模式或者靜態單例模式

三、SqlSession

每一個線程都應該有它本身的 SqlSession 實例。SqlSession 的實例不是線程安全的,所以是不能被共享的,因此它的最佳的做用域是請求或方法做用域。絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。sqlSession在每次用完以後必須關閉它

3、mybatis緩存機制

一、一級緩存

MyBatis一級緩存是基於sqlSession的,sqlSession對象有一個HashMap用於存儲緩存數據,此HashMap是當前會話對象私有的,別的SqlSession會話對象沒法訪問。一級緩存默認是開啓的,且沒法關閉。增刪改操做會清空當前sqlSession裏的緩存

二、二級緩存

MyBatis二級緩存是mapper級別的緩存,同一個namespace共用這一個緩存,因此對SqlSession是共享的,二級緩存是默認關閉的。

如何配置二級緩存?只須要在sql映射文件中添加<cache/>便可

測試代碼:

/* * 注意:被緩存的數據要實現序列化接口(在這裏將Book.java實現序列化接口),不然會出現異常 * 另外,當某一個sqlSession修改了共享的緩存數據以後,二級緩存也會清空 */SqlSession session_1 = MyBatisUtil.getSession();BookDao mapper_1 = session_1.getMapper(BookDao.class);mapper_1.listBook();//注意,必須提交才能將數據放進二級緩存session_1.commit();		SqlSession session_2 = MyBatisUtil.getSession();BookDao mapper_2 = session_2.getMapper(BookDao.class);mapper_2.listBook();複製代碼

這裏只是爲了測試二級緩存的原理,因此MyBatisUtil類如何獲取SqlSession的代碼就沒有粘貼進來了。

連mybits工做原理都不懂,你敢說你本身會java?

運行上面的代碼,經過log4j打印出來的日誌能夠看到,,明明運行了兩次listBook方法,但最終查詢語句(select * from book)只出現一次,此次由於第二次查詢命中了緩存,就不須要再查數據庫了。

相關文章
相關標籤/搜索