⑴ mybatis怎麼實現局部緩存
1.1、Mybatis一級緩存測試
1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.sqlSession;
6 import org.junit.Test;
7
8 /**
9 * @author gacl
10 * 測試一級緩存
11 */
12 public class TestOneLevelCache {
13
14 /*
15 * 一級緩存: 也就Session級的緩存(默認開啟)
16 */
17 @Test
18 public void testCache1() {
19 SqlSession session = MyBatisUtil.getSqlSession();
20 String statement = "me.gacl.mapping.userMapper.getUser";
21 User user = session.selectOne(statement, 1);
22 System.out.println(user);
23
24 /*
25 * 一級緩存默認就會被使用
26 */
27 user = session.selectOne(statement, 1);
28 System.out.println(user);
29 session.close();
30 /*
31 1. 必須是同一個Session,如果session對象已經close()過了就不可能用了
32 */
33 session = MyBatisUtil.getSqlSession();
34 user = session.selectOne(statement, 1);
35 System.out.println(user);
36
37 /*
38 2. 查詢條件是一樣的
39 */
40 user = session.selectOne(statement, 2);
41 System.out.println(user);
42
43 /*
44 3. 沒有執行過session.clearCache()清理緩存
45 */
46 //session.clearCache();
47 user = session.selectOne(statement, 2);
48 System.out.println(user);
49
50 /*
51 4. 沒有執行過增刪改的操作(這些操作都會清理緩存)
52 */
53 session.update("me.gacl.mapping.userMapper.updateUser",
54 new User(2, "user", 23));
55 user = session.selectOne(statement, 2);
56 System.out.println(user);
57
58 }
59 }
1.2、Mybatis二級緩存測試
1、開啟二級緩存,在userMapper.xml文件中添加如下配置
<mapper namespace="me.gacl.mapping.userMapper">
<!-- 開啟二級緩存 -->
<cache/>
2、測試二級緩存
1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.SqlSession;
6 import org.apache.ibatis.session.SqlSessionFactory;
7 import org.junit.Test;
8
9 /**
10 * @author gacl
11 * 測試二級緩存
12 */
13 public class TestTwoLevelCache {
14
15 /*
16 * 測試二級緩存
17 * 使用兩個不同的SqlSession對象去執行相同查詢條件的查詢,第二次查詢時不會再發送SQL語句,而是直接從緩存中取出數據
18 */
19 @Test
20 public void testCache2() {
21 String statement = "me.gacl.mapping.userMapper.getUser";
22 SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
23 //開啟兩個不同的SqlSession
24 SqlSession session1 = factory.openSession();
25 SqlSession session2 = factory.openSession();
26 //使用二級緩存時,User類必須實現一個Serializable介面===> User implements Serializable
27 User user = session1.selectOne(statement, 1);
28 session1.commit();//不懂為啥,這個地方一定要提交事務之後二級緩存才會起作用
29 System.out.println("user="+user);
30
31 //由於使用的是兩個不同的SqlSession對象,所以即使查詢條件相同,一級緩存也不會開啟使用
32 user = session2.selectOne(statement, 1);
33 //session2.commit();
34 System.out.println("user2="+user);
35 }
36 }
1.3、二級緩存補充說明
1. 映射語句文件中的所有select語句將會被緩存。
2. 映射語句文件中的所有insert,update和delete語句會刷新緩存。
3. 緩存會使用Least Recently Used(LRU,最近最少使用的)演算法來收回。
4. 緩存會根據指定的時間間隔來刷新。
5. 緩存會存儲1024個對象
cache標簽常用屬性:
<cache
eviction="FIFO" <!--回收策略為先進先出-->
flushInterval="60000" <!--自動刷新時間60s-->
size="512" <!--最多緩存512個引用對象-->
readOnly="true"/> <!--只讀-->
⑵ ibatis中處理緩存有幾種方式
ibatis在單獨使用的時候,它自己是有一級緩存的,但是這個緩存不支持並發,所以還是不用為好。。
當ibatis和spring整合的時候,由於sqlSession是被SqlSessionDaoSupport管理的,而且是動扒蔽喚態代理出來的,此時ibatis自己的一級緩存就失效了,所以還是借春凱助並和第三方緩存框架,比如ehcache,oscache。
⑶ Hibernate與IBatis的優缺點及可行性分析
優點
簡單
易於學習 易於使用 通過文檔和源代碼 可以比較完全的掌握它的設計思路和實現
實用
提供了數據映射功能 提供了對底層數據訪問的封裝(例如) 提供了框架 可以使我們更容易的開發和配置我們的dal層
靈活
通過sql基本上可以實現我們不使用數據訪問框架可以實現的所有功能 或許更多
功能完整
嘩檔提供了連接管理 緩存支持 線程支持 (分布式)事物管理 通過配置作關系對象映射等數據訪問層需要解決的問題 提供了支持 並在框架中封裝了 Hibernate和datamapper 增強系統的可維護性 通過提供dal層 將業務邏輯和數據訪問邏輯分離 使系統的設計更清晰 更易維護 更易單元測試 sql和代碼的分離 提高了可維護性
缺點
滯後性
還沒有明確對 net 的支持 最新版本在 下編譯可以 但有些單元測試不能通過
不成熟 工程實踐較少 ibatisnet在實際項目中的使用較少 只是理論上可行
半orm 工具支持較少 需要我們自己寫sql 並且 net下還未發現可以自動生成業務層類和配置文件的工具 這點和Hibernate不一樣 Hibernate會為我們的資料庫直接產生sql 並有一些輔助工具 因此使用ibatis比Hibernate要多做一些工作
可行性
沒有最好的框架 只有最適合的框架 存在的便是合理的 它存在就說明有它存在的道理 但它未必為我們存在 所以選擇一個框架最主要的是看它對你有沒有意義 意義有多大 是不是比其他框架帶給 你的好處要多 沒有絕對的優點也沒有絕對的缺點 重要的是看在什麼情況下討論
上面說了部分的ibatis的優點和部分缺點 這些優點從理論上證明ibatis對任何數據持久層都合適 但未必是最好的選擇 下面對上面的優缺亂亮亂點分別從兩方面討論
簡單
我們都喜歡簡單 簡單意味著學習成本低 使用中出錯的可能性低 同時 簡單的東西一般來說功能不夠強大 反過來 復雜的東西學習成本高 用起來不方便 並且團隊沒有很強的技術實力 一般不要使用
實用
解決了項目中需要解決的問題 這是任何實際工程中採用的框架和工具都應具有的性質 否則就不要拿到實際項目中來
靈活
靈活有兩層意思 一種是簡單易擴展 另一種是功能強大提供了很多選項 ibatis屬於鍵基前者 Hibernate屬於後者 兩者各有優缺點
功能完整
ibatis的功能完整也是相對的 比我們自己開發的框架應該完整 但對比其他框架肯定也有一些解決不了的問題
增強系統的可維護性 利用ibatis可以做到sql和代碼分離 可以設計出一個清晰的數據訪問層(dal) 但項目架構是否科學合理 是否以維護 關鍵不在ibatis 因 為它只是一個數據層框架 但是我們也不得不清楚 要想發揮ibatis的優勢 我們需要做一些額外工作 比如最好設計介面 需要將業務層實體和對實 體的訪問放在不同的工程中 同時需要維護xml配置文件
滯後性
ibatis組現在還沒有提到要支持 net 很多人在 net 下使用ibatis都出現了問題 所以如果要使用 net 開發 ibatis不是一個好選擇 還需要等待
不成熟
開源的東西很難說成熟 但一般比我們自己寫的框架要成熟 由於我們可以拿到他的源代碼 所以關鍵在於我們能否駕馭它
半orm 工具支持少
這註定了ibatis不能從本質上提升開發效率 我們需要自己寫sql 寫實體類 寫配置文件 但這也是它優越的地方 它沒有為我們做的他多 所以我們就 有更多的施展空間 而且它非常適合那些並不能完全控制資料庫的系統和需要利用資料庫本身提供的高級特性的統計查詢系統的開發
使用ibatis需要自己寫sql 由於我們的sql不可能完全符合sql標准 比起Hibernate產生的sql來 可移植性差 不過由於我們更改 資料庫的可能性較小 對我們來說sql符合標准以便可以在遷移到不同伺服器時代價最小並不是十分必要的 另一方面 Hibernate雖然可以屏蔽很多 資料庫間的不同 但是卻很難利用某些資料庫的高級特性 比如oracle的分析統計函數
Hibernate不適合資料庫模式不規范 約束不完整 需要大量復雜查詢的系統 同時Hibernate的學習成本較高 完全掌握Hibernate也較困難 風險較大
自己寫框架未必比ibatis的好 穩定 強大和可擴展 而且自己開發框架也需要較大的工作量
如果使用dotnet並且要選一個數據層框架 而系統中有相當一部分較復雜的sql 或資料庫設計不合理 臟數據多 對性能和資源要求嚴格 ibatis 是一個比較不錯的選擇 他的那些缺點並不是致命的 而且也是有一些解決方案的 尤其是 當選用了ibatis的dataaccess作為框架時 我 們可以同時使用Hibernate 和datamapper(ibatisnet的核心組件) 那樣將會使風險降到最低 並且整個系統的 框架比較合理
另外 利用ibatis可以統一編碼風格 節約開發成本 大家不會再把精力浪費到分頁 連接池 主鍵生成等地方了 可以集中精力進行業務組件的編寫
綜上 很多時候我們要在是自己開發框架和選用第三方框架和選用什麼樣的框架問題上進行綜合考慮 考慮的標准當然是項目的當前情況和我們希望達到目的的一個平衡
ibatis只是封裝了數據訪問層 替我們做了部分的對象關系映射 但我們的代價是必須要寫xml配置文件 相對於Hibernate我們還要寫很多 sql Hibernate通過工具直接從資料庫模式生成實體類和基本的配置文件 而且大部分情況下不需要我們寫sql 會較大的提升開發效率 但這些也 有很多的局限性 尤其是對環境的要求較高(資料庫設計 對象設計 團隊的協作等)
個人感覺ibatis對項目比較有意義的地方在於它小巧靈活 可擴展 封裝了數據訪問層(事務 緩存 異常 日誌) 並提供了框架支持
利用ibatis我們可以做到代碼和sql的分離 只要sql能夠解決的問題 ibatis就能幫我們較容易的解決 同時也使我們的項目對某一框架的依賴 性變小(因為ibatis是非侵入性的) 這將極大的降低項目風險 減少解決復雜問題的時間 使項目的維護變得簡單
ibatis對於應用的修改 調試 擴充和維護將會變得容易自然 修改時 我們主要修改的是代表模型的實體對象 xml配置文件中的sql 和/或配置文 件的resultmap(很多時候是不需要的) 同時 sql和代碼分離 我們不用在代碼的stringbuffer的append方法之間尋找需要修改 的sql 配置文件中的sql便利了我們的調試和對sql的評審及以後的sql重用
利用一些框架在前期一般會拖慢開發效率 因為我們需要付出學習成本 很多時候 使用框架需要寫很多配置文件 在使用不熟時開發速度較慢 同時利用框架往往 使系統代碼量增大 比如model 和model 模型 開發效率應該還是model 快 四層的架構肯定比兩層的代碼量大 但對於中後期開發和維護將會極大的提高效率
利用一些較完全的開發框架和代碼生成工具 在前期會較大的提高開發效率 但在後期常常會拖慢進度 並有可能成為以後維護的夢魘 比如torque生成實體類和其對應的sql 雖大幅提高了效率 但修改負擔較大
比較理想的開發方式是使用簡單框架結合簡單的代碼生成工具 框架提供系統的基礎服務 並規范開發 框架一方面提供了開發中某一方面的開發基礎支持 比如數 據訪問層 事務 日誌 公用類 異常等 另一方面 也為開發定義了模式 定義了系統的基本輪廓 同時 通過簡單的代碼生成工具生成部分低級的代碼 比如通 過工具從資料庫模式生成實體類 這些類生成後我們可以自由修改
Hibernate是十分強大 比較完善的orm框架 不過這是它的優點也是它的缺點 J EE系統是否採用Hibernate 是一個需要認真評估的問題
要想Hibernate工作的好 資料庫的設計必須好 同時對於復雜的數據操作同時需要使用sql Hibernate 對於直接使用sql的支持比Hibernate 要自然 這一點是可以接受的
Hibernate比較復雜 功能強大而靈活 要用好Hibernate確實不是很簡單 當然spring框架提供了對Hibernate的封裝 使Hibernate的使用變得簡單了點
lishixin/Article/program/Java/ky/201311/28363
⑷ iBatis的SqlMap中,我寫的這條動態SQL語句,將表名當做參數動態傳遞,報「表名無效」錯誤。
因為#value#這種形式的,轉換為SQL中的?,而問號只有在賦值屬性(欄位)的時候才用,表名不能用這個方式寫,而且更不要用$value$這種形式替換,因為ibatis編譯的SQL會緩存。導致第二次傳遞進來的表名不會替換,在表可數的情況下,可以傳遞一個變數,來判斷需要查詢哪個表。