mybaits本身有一级缓存和二级缓存,一级缓存我这里不做赘述,因为作用不是特别明显。这次我们要用的是二级缓存,二级缓存的主要是借助第三方内存/服务。我这边选择的是redis作为第三方缓存。在使用本demo之前,需要童鞋们自己本机下载一个redis服务器,具体安装可以自行百度一下。好了,废话不多说,直接上代码,我会在上代码的过程中一步一步的介绍。
第一步:配置maven包(mybaits和redis的jar包),这个可以在maven中央库里面找到,也可以从我提供的代码中查看pom.xml
第二步:配置application.xml(添加redsi的缓存)
<!-- 配置数据源 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- <property name="locations" value="classpath:jdbc.properties"/>
<property name="locations" value="classpath:redis.properties"/> -->
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<value>classpath:redis.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 数据库基本信息配置 -->
<property name = "url" value = "${url}" />
<property name = "username" value = "${username}" />
<property name = "password" value = "${password}" />
<property name = "driverClassName" value = "${driverClassName}" />
<property name = "filters" value = "${filters}" />
<!-- 最大并发连接数 -->
<property name = "maxActive" value = "${maxActive}" />
<!-- 初始化连接数量 -->
<property name = "initialSize" value = "${initialSize}" />
<!-- 配置获取连接等待超时的时间 -->
<property name = "maxWait" value = "${maxWait}" />
<!-- 最小空闲连接数 -->
<property name = "minIdle" value = "${minIdle}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name = "timeBetweenEvictionRunsMillis" value ="${timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name = "minEvictableIdleTimeMillis" value ="${minEvictableIdleTimeMillis}" />
<property name = "validationQuery" value = "${validationQuery}" />
<property name = "testWhileIdle" value = "${testWhileIdle}" />
<property name = "testOnBorrow" value = "${testOnBorrow}" />
<property name = "testOnReturn" value = "${testOnReturn}" />
<property name = "maxOpenPreparedStatements" value ="${maxOpenPreparedStatements}" />
<!-- 打开 removeAbandoned 功能 -->
<property name = "removeAbandoned" value = "${removeAbandoned}" />
<!-- 1800 秒,也就是 30 分钟 -->
<property name = "removeAbandonedTimeout" value ="${removeAbandonedTimeout}" />
<!-- 关闭 abanded 连接时输出错误日志 -->
<!-- <property name = "logAbandoned" value = "${logAbandoned}" /> -->
</bean>
<!-- redis连接池 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"/>
<!-- redis连接工厂 -->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis_hostName}"/>
<property name="port" value="${redis_port}"/>
<property name="password" value="${redis_password}"/>
<property name="timeout" value="${redis_timeout}"/>
<property name="poolConfig" ref="poolConfig"></property>
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
</bean>
<!--redis缓存:使用中间类解决RedisCache.jedisConnectionFactory的静态注入,从而使MyBatis实现第三方缓存-->
<bean id="redisCacheTransfer" class="com.iuweb.common.util.RedisCacheTransfer">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
第三步:创建RedisCacheTransfer类
/**
*
*/
package com.iuweb.common.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
/**
*
*
* @Description:使用第三方内存数据库Redis作为二级缓存
* @author wangguan
* @date 2018年5月21日 下午2:45:53
* @versidescribeon v 1.0
*/
public class RedisCacheTransfer {
@Autowired
public void setconnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
RedisCache.setJedisConnectionFactory(jedisConnectionFactory);
}
}
第四步:RedisCahe类
/**
*
*/
package com.iuweb.common.util;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import redis.clients.jedis.exceptions.JedisConnectionException;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
*
*
* @Description:创建中间类RedisCacheTransfer,完成RedisCache.jedisConnectionFactory的静态注入,静态注入中间类
* @author wangguan
* @date 2018年5月21日 下午2:51:17
* @versidescribeon v 1.0
*/
public class RedisCache implements Cache
{
//private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);
private static JedisConnectionFactory jedisConnectionFactory;
private final String id;
/**
* The {@code ReadWriteLock}.
*/
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public RedisCache(final String id) {
if (id == null) {
throw new IllegalArgumentException("Cache instances require an ID");
}
System.out.println("MybatisRedisCache:id=" + id);
//logger.debug("MybatisRedisCache:id=" + id);
this.id = id;
}
@Override
public void clear()
{
RedisConnection connection = null;
try
{
connection = jedisConnectionFactory.getConnection();
connection.flushDb();
connection.flushAll();
}
catch (JedisConnectionException e)
{
e.printStackTrace();
}
finally
{
if (connection != null) {
connection.close();
}
}
}
@Override
public String getId()
{
return this.id;
}
@Override
public Object getObject(Object key)
{
Object result = null;
RedisConnection connection = null;
try
{
connection = jedisConnectionFactory.getConnection();
RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
result = serializer.deserialize(connection.get(serializer.serialize(key)));
}
catch (JedisConnectionException e)
{
e.printStackTrace();
}
finally
{
if (connection != null) {
connection.close();
}
}
return result;
}
@Override
public ReadWriteLock getReadWriteLock()
{
return this.readWriteLock;
}
@Override
public int getSize()
{
int result = 0;
RedisConnection connection = null;
try
{
connection = jedisConnectionFactory.getConnection();
result = Integer.valueOf(connection.dbSize().toString());
}
catch (JedisConnectionException e)
{
e.printStackTrace();
}
finally
{
if (connection != null) {
connection.close();
}
}
return result;
}
@Override
public void putObject(Object key, Object value)
{
RedisConnection connection = null;
try
{
connection = jedisConnectionFactory.getConnection();
RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
connection.set(serializer.serialize(key), serializer.serialize(value));
}
catch (JedisConnectionException e)
{
e.printStackTrace();
}
finally
{
if (connection != null) {
connection.close();
}
}
}
@Override
public Object removeObject(Object key)
{
RedisConnection connection = null;
Object result = null;
try
{
connection = jedisConnectionFactory.getConnection();
RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
result =connection.expire(serializer.serialize(key), 0);
}
catch (JedisConnectionException e)
{
e.printStackTrace();
}
finally
{
if (connection != null) {
connection.close();
}
}
return result;
}
public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
RedisCache.jedisConnectionFactory = jedisConnectionFactory;
}
}
以上对应redis基本配置完毕,后面是配置mybaits
第五步:依然在applicationContext.xml中配置mybaits
<!-- 配置mybatis的sqlSessionFactory -->
<bean id="sqlSessionFactory" class="com.iuweb.common.util.PackagesSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 自动扫描mappers.xml文件 -->
<property name="mapperLocations" value="classpath:com/iuweb/*/*.xml"></property>
<!--自动扫描实体类 -->
<property name="typeAliasesPackage" value="com.iuweb.*.model" />
<property name="plugins">
<list>
<bean class="com.iuweb.common.pagePlug.PagePlugin">
<!-- assue dialect: oracle/mysql -->
<property name="dataDialect" value="mysql" />
<property name="pageSqlId" value=".*ByPage.*" />
</bean>
</list>
</property>
</bean>
第五步:在mybatis-config.xml中配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/><!-- 开启二级缓存 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="true"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
</configuration>
基本配置项已经做好了。下面就开始进行具体的demo实验了。controller和service层我就不写了,没有什么变化。这里我贴出mapper.xml
运行一下,在后台的控制台就能看出效果了。
PS:提供运行的demo,是从自己的eclipse中copy出来的,另外项目中用到了redis,mysql。需要提前准备好。jdk环境是1.7的
https://download.csdn.net/download/qq_35515521/10435226
如果觉得有用得话,可以关注我得公众号。