zoukankan      html  css  js  c++  java
  • mybatis整合redis

    mybatis默认缓存是PerpetualCache,可以查看一下它的源码,发现其是Cache接口的实现;那么我们的缓存只要实现该接口即可。

    编写Redis需要用的2个工具类   RedisUtil.java和SerializeUtil.java。这个在前一篇已经有过,这里不再重复贴代码了。

    该接口有以下方法需要实现:

      String getId();
      int getSize();
      void putObject(Object key, Object value);
      Object getObject(Object key);
      Object removeObject(Object key);
      void clear();
      ReadWriteLock getReadWriteLock();

    1 实现类:

     
    package app.platform.mybatis
    
    import java.util.concurrent.locks.ReadWriteLock;  
    import java.util.concurrent.locks.ReentrantReadWriteLock;  
      
    import org.apache.ibatis.cache.Cache;  
    import org.slf4j.Logger;  
    import org.slf4j.LoggerFactory;  
      
    import redis.clients.jedis.Jedis;  
    import redis.clients.jedis.JedisPool;  
    import redis.clients.jedis.JedisPoolConfig;  
      
      
    public class MybatisRedisCache implements Cache {  
          
        private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);  
        private Jedis redisClient=createReids();  
         /** The ReadWriteLock. */    
        private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();   
          
        private String id;  
          
        public MybatisRedisCache(final String id) {    
            if (id == null) {  
                throw new IllegalArgumentException("Cache instances require an ID");  
            }  
            logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id="+id);  
            this.id = id;  
        }    
        @Override  
        public String getId() {  
            return this.id;  
        }  
      
        @Override  
        public int getSize() {  
         
            return Integer.valueOf(redisClient.dbSize().toString());  
        }  
      
        @Override  
        public void putObject(Object key, Object value) {  
            logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:"+key+"="+value);  
            redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));  
        }  
      
        @Override  
        public Object getObject(Object key) {  
            Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString())));  
            logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:"+key+"="+value);  
            return value;  
        }  
      
        @Override  
        public Object removeObject(Object key) {  
            return redisClient.expire(SerializeUtil.serialize(key.toString()),0);  
        }  
      
        @Override  
        public void clear() {  
              redisClient.flushDB();  
        }  
        @Override  
        public ReadWriteLock getReadWriteLock() {  
            return readWriteLock;  
        }  
        protected  static Jedis createReids(){  
            JedisPool pool = new JedisPool(new JedisPoolConfig(), "10.12.162.85");  
            return pool.getResource();  
        }  

    2序列化类

    public class SerializeUtil {  
        public static byte[] serialize(Object object) {  
            ObjectOutputStream oos = null;  
            ByteArrayOutputStream baos = null;  
            try {  
            //序列化  
            baos = new ByteArrayOutputStream();  
            oos = new ObjectOutputStream(baos);  
            oos.writeObject(object);  
            byte[] bytes = baos.toByteArray();  
            return bytes;  
            } catch (Exception e) {  
             e.printStackTrace();  
            }  
            return null;  
            }  
               
            public static Object unserialize(byte[] bytes) {  
            ByteArrayInputStream bais = null;  
            try {  
            //反序列化  
            bais = new ByteArrayInputStream(bytes);  
            ObjectInputStream ois = new ObjectInputStream(bais);  
            return ois.readObject();  
            } catch (Exception e) {  
               
            }  
            return null;  
            }  

    spring中的mybatis配置

    <!-- mybatis配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath*:app/mapper/**/*.xml"/>
            <property name="configLocation" value="classpath:/mybatis/mybatis-config.xml" />
    </bean>

    3 mybatis-config.xml 中的settings配制

    <settings>
    <!-- 开启缓存支持 -->  
    <setting name="cacheEnabled" value="true" />
    ....... 
    </settings>

    4 在需要加缓存的sqlMap中加入<cache eviction="LRU" type="app.platform.mybatis.MybatisRedisCache" />

    例:

    <mapper namespace="SYS_ROLE">

      <!-- 缓存 -->
      <cache eviction="LRU" type="app.platform.mybatis.MybatisRedisCache" />

       <!-- 查询所有 -->
    <select id="findAll" parameterType="HashMap" resultType="HashMap">
    select 
    <include refid="base_column" />
    from SYS_ROLE
    where 1=1
    <if test="BUS_TYPE!=null and BUS_TYPE!=''">
    and BUS_TYPE  =#{BUS_TYPE}
    </if>
    <if test="ENABLE!=null and ENABLE!=''">
    and ENABLE  =#{ENABLE}
    </if>
    <if test="ROLE_NAME!=null and ROLE_NAME!=''">
    and ROLE_NAME like '%'||#{ROLE_NAME}||'%'
    </if>
    <if test="ROLE_OTHER_NAME!=null and ROLE_OTHER_NAME!=''">
    and ROLE_OTHER_NAME like '%'||#{ROLE_OTHER_NAME}||'%'
    </if>
    </select>

    </mapper>

    本文转自http://blog.csdn.net/fhx007/article/details/12680875 感谢作者

  • 相关阅读:
    CSS对 网页进行布局
    myeclipse配置tomcat服务器
    JDBC链接数据库
    java集合框架
    java日期操作
    二叉树的最近公共祖先
    二叉树的深度
    飞地的数量
    岛屿数量
    岛屿的最大面积
  • 原文地址:https://www.cnblogs.com/panxuejun/p/6027152.html
Copyright © 2011-2022 走看看