缓存不管哪个框架都是显得特别的重要,今天自己测试实现了mybatis自定义缓存,从而理解mybatis缓存的工作原理。
首先缓存类要实现Cache接口:具体实现如下package com.ibatis.blog;
package com.ibatis.cache;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.ibatis.cache.Cache;
public class MyCache implements Cache
{
private ReadWriteLock lock = new ReentrantReadWriteLock();
private ConcurrentHashMap<Object, Object> cache = new ConcurrentHashMap<Object, Object>();
private String id;
public MyCache()
{
}
/ /这个构造方法必须有
public MyCache(String id)
{
this.id = id;
}
public void clear()
{
cache.clear();
}
public String getId()
{
System.out.println("getId-->" + id);
return id;
}
public Object getObject(Object key)
{
System.out.println("getObject---key:" + key);
return cache.get(key);
}
public ReadWriteLock getReadWriteLock()
{
// System.out.println("getReadWriteLock");
return lock;
}
public synchronized int getSize()
{
System.out.println("getsize");
return cache.size();
}
public void putObject(Object key, Object value)
{
// System.out.println("putObject--key:" + key);
// System.out.println("putObject--value:" + value);
cache.put(key, value);
}
public Object removeObject(Object key)
{
System.out.println("remove:" + key);
return cache.remove(key);
}
}
需要在配置文件中添加:
<cache type="com.ibatis.cache.MyCache"></cache>
进行测试:进行两次相同的查询:
@Test
public void testSelectAll()
{
List<Article> result = service.findAll(null);
for (Article a : result)
{
System.out.println(a);
}
System.out.println("-----------");
List<Article> result1 = service.findAll(null);
for (Article a : result1)
{
System.out.println(a);
}
}
产生的结果如下:
getId-->article
getObject---key:-395398842:3059602323:article.article_selectAll:0:2147483647:select * from
article
getObject---key:-1263983414:-596172894:article.selectUser:0:2147483647:select * from user
where
id=?:1
getObject---key:-1263983414:-596172894:article.selectUser:0:2147483647:select * from user
where
id=?:1
Article [id=1, name=firstArticle, time=2013-11-3 0:00:00, user=User [article=null, id=1, name=d, sex=1]]
Article [id=2, name=secondArticle, time=2013-11-3 0:00:00, user=User [article=null, id=1, name=d, sex=1]]
-----------
getObject---key:-395398842:3059602323:article.article_selectAll:0:2147483647:select * from
article
Article [id=1, name=firstArticle, time=2013-11-3 0:00:00, user=User [article=null, id=1, name=d, sex=1]]
Article [id=2, name=secondArticle, time=2013-11-3 0:00:00, user=User [article=null, id=1, name=d, sex=1]]
缓存设置成功,第二次查询的时候直接从缓存中查询了!