使用版本
ibatis 2.3.4
ehcache 1.2.4
Ibatis提供了集成第三方缓存的接口CacheController
1、编写控制类EhCacheController类:
package com.vprisk.rmplatform.cache.ehcache; /** * @author name: LXL<br> * Written Date: 2013-7-11<br> * Written Time: 下午4:56:39<br> * Modified By: <br> * Modified Date: */ import java.net.URL; import java.util.Properties; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import com.ibatis.sqlmap.engine.cache.CacheController; import com.ibatis.sqlmap.engine.cache.CacheModel; /** * EhCache Implementation of the {@link com.ibatis.sqlmap.engine.cache.CacheController} interface to be able to use * EhCache as a cache implementation in iBatis. You can configure your cache model as follows, by example, in your * sqlMapping files: * <cacheModel id="myCache" type="nl.rabobank.springproject.ibatis.EhCacheController" readOnly="true" serialize="false"> * <property name="configFile" value="/path-to-ehcache.xml"/> * </cacheModel> * Alternatively, you can use a type alias in your type attribute and defining the class with a * <TypeAlias> declaration, see iBatis documentation on how to do this. */ public class EhCacheController implements CacheController { /** The EhCache CacheManager. */ private CacheManager cacheManager; /** * Flush a cache model. * @param cacheModel - the model to flush. */ public void flush(CacheModel cacheModel) { getCache(cacheModel).removeAll(); } /** * Get an object from a cache model. * @param cacheModel - the model. * @param key - the key to the object. * @return the object if in the cache, or null(?). */ public Object getObject(CacheModel cacheModel, Object key) { Object result = null; Element element = getCache(cacheModel).get(key); if (element != null) { result = element.getObjectValue(); } return result; } /** * Put an object into a cache model. * @param cacheModel - the model to add the object to. * @param key - the key to the object. * @param object - the object to add. */ public void putObject(CacheModel cacheModel, Object key, Object object) { getCache(cacheModel).put(new Element(key, object)); } /** * Remove an object from a cache model. * @param cacheModel - the model to remove the object from. * @param key - the key to the object. * @return the removed object(?). */ public Object removeObject(CacheModel cacheModel, Object key) { Object result = this.getObject(cacheModel, key); getCache(cacheModel).remove(key); return result; } /** * Configure a cache controller. Initialize the EH Cache Manager as a singleton. * @param props - the properties object continaing configuration information. */ public void setProperties(Properties props) { URL url = getClass().getResource(props.getProperty("configFile")); cacheManager = CacheManager.create(url); } /** * Gets an EH Cache based on an iBatis cache Model. * @param cacheModel - the cache model. * @return the EH Cache. */ private Cache getCache(CacheModel cacheModel) { String cacheName = cacheModel.getId(); Cache cache = cacheManager.getCache(cacheName); return cache; } /** * Shut down the EH Cache CacheManager. */ public void finalize() { if (cacheManager != null) { cacheManager.shutdown(); } } }2、配置使用Ehcache
Ibatis cfg文件中添加:
<sqlMapConfig> <!-- 设置使用缓存 --> <settings cacheModelsEnabled="true"/> <transactionManager type="JDBC" commitRequired="false"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver" /> <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:ORCL" /> <property name="JDBC.Username" value="VPF_DEMO_DB" /> <property name="JDBC.Password" value="VPF_DEMO_DB" /> </dataSource> </transactionManager> <sqlMap resource="ibatis-sql.xml" /> </sqlMapConfig>3、SQLMap文件中添加
<sqlMap namespace="SQLMap"> <!-- 引用缓存控制器 --> <typeAlias alias="MapCacheController" type="com.vprisk.rmplatform.cache.ehcache.EhCacheController" /> <cacheModel id="SQLMapCache" type="MapCacheController"> <!-- 指定ehcache的缓存配置文件 --> <property name="configFile" value="/ehcache.xml" /> </cacheModel> <typeAlias alias="User" type="com.vprisk.rmplatform.security.entity.User" /> <typeAlias alias="Organ" type="com.vprisk.rmplatform.security.entity.Organ" /> <resultMap id="UserLessFieldsResult" class="User"> <result property="userId" column="USER_ID" /> <result property="userName" column="USER_NAME" /> <result property="password" column="PASSWORD" /> </resultMap> <resultMap id="OrganResult" class="Organ"> <result property="orgId" column="ORG_ID" /> <result property="orgCode" column="ORG_CODE" /> <result property="orgName" column="ORG_NAME" /> </resultMap> <select id="selectOrgan" resultMap="OrganResult" parameterClass="java.util.Map" cacheModel="SQLMapCache"> select * from SYS_SEC_ORGAN <dynamic prepend="where"> <isPropertyAvailable property="orgName"> <isNotEmpty property="orgName" prepend="and"> ORG_NAME like #orgName# </isNotEmpty> </isPropertyAvailable> </dynamic> </select> </sqlMap>
<cache name="SQLMap.SQLMapCache" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="60" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"/>
@Test public void testdyna(){ try { Organ org = new Organ(); org.setOrgName("%aaa%"); Map map = pojoToMap(org); List list = sqlMapper.queryForList("selectOrgan",map); System.out.println(list); } catch (Exception e) { e.printStackTrace(); } try { Organ org = new Organ(); org.setOrgName("%aaa%"); Map map = pojoToMap(org); List list = sqlMapper.queryForList("selectOrgan",map); System.out.println(list); } catch (SQLException e) { e.printStackTrace(); } }