摘要: 现在市面流行的java框架,一个是ssh(spring、struts2、hibernate),另一个是ssm(spring、springmvc、mybatis),由于之前已经有整合过ssm框架,所以在此基础上进行略微的改动,做一个Redis与Mybatis的整合

具体步骤如下:

1,准备好ssm工程,如果有不会的,可以参考

springmvc+mybatis整合

2,准备好Redis服务器

3,构建 pom.xml 文件,这个pom文件和之前ssm的基本一样,只是添加了redis的支持

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>demo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>demo Maven Webapp</name>
<properties>
<!-- spring版本号 -->
<spring.version>4.2.2.RELEASE</spring.version>
<!-- mybatis版本号 -->
<mybatis.version>3.3.0</mybatis.version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties> <dependencies>
<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>1.7</version>
    <scope>system</scope>
    <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!-- 表示开发的时候引入,发布的时候不会加载此包 -->
<scope>test</scope>
</dependency><!-- spring核心包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><!-- mybatis核心包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!-- mybatis/spring包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency><!-- 导入java ee jar 包 --><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>7.0</version></dependency><!-- 导入Mysql数据库链接jar包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version></dependency><!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.2.2</version></dependency><!-- JSTL标签类 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- 日志文件管理包 --><!-- log start --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><!-- 格式化对象,方便输出日志 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.41</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- log end --><!-- 映入JSON --><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.1.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.1.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.1.0</version></dependency><!-- 上传组件包 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.9</version></dependency><dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.8.0</version></dependency><dependency>
  <groupId>commons-pool</groupId>
  <artifactId>commons-pool</artifactId>
  <version>1.6</version></dependency></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>${java-version}</source><target>${java-version}</target><encoding>utf8</encoding></configuration></plugin></plugins></build></project>

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

5,新增一个Cache类,需要实现 org.apache.ibatis.cache.Cache 接口

package demo.cache;

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 demo.utils.RedisUtil;
import demo.utils.SerializeUtil; public class MybatisRedisCache implements Cache {
private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class); 
/** 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;
    }   public String getId() {
return this.id;
} public void putObject(Object key, Object value) {
logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:"+key+"="+value);
RedisUtil.getJedis().set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));
} public Object getObject(Object key) {
Object value = SerializeUtil.unserialize(RedisUtil.getJedis().get(SerializeUtil.serialize(key.toString())));
logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:"+key+"="+value);
return value;
} public Object removeObject(Object key) {
return RedisUtil.getJedis().expire(SerializeUtil.serialize(key.toString()),0);
} public void clear() {
RedisUtil.getJedis().flushDB();
} public int getSize() {
return Integer.valueOf(RedisUtil.getJedis().dbSize().toString());
} public ReadWriteLock getReadWriteLock() {
return readWriteLock;
} }

6,开启mybatis对缓存的支持,在本项目中,是修改 spring-mybatis.xml 文件

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:demo/mapping/*.xml"></property>
<property name="configurationProperties">
<props>
<prop key="cacheEnabled">true</prop> 
<prop key="lazyLoadingEnabled">false</prop> 
<prop key="aggressiveLazyLoading">true</prop>
</props>
</property>
</bean>

其中:

<prop key="cacheEnabled">true</prop>

是开启的关键。

7,在相关的 mapper.xml 添加所需要用的缓存类,我们这里是在 TUserMapper.xml 中添加

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="demo.dao.TUserMapper"> <cache type="demo.cache.MybatisRedisCache" /> <resultMap id="BaseResultMap" type="demo.domain.TUser">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="createtime" property="createtime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List">
id, username, password, createtime
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap"
parameterType="java.lang.Integer">
select <include refid="Base_Column_List" /> from t_user where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from t_user
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="demo.domain.TUser">
insert into t_user (id, username, password,
createtime)
values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR},
#{password,jdbcType=VARCHAR},
#{createtime,jdbcType=TIMESTAMP})
</insert><insert id="insertSelective" parameterType="demo.domain.TUser">
insert into t_user
<trim prefix="(" suffix=")" suffixOverrides=","><if test="id != null">
id,
</if><if test="username != null">
username,
</if><if test="password != null">
password,
</if><if test="createtime != null">
createtime,
</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="id != null">
#{id,jdbcType=INTEGER},
</if><if test="username != null">
#{username,jdbcType=VARCHAR},
</if><if test="password != null">
#{password,jdbcType=VARCHAR},
</if><if test="createtime != null">
#{createtime,jdbcType=TIMESTAMP},
</if></trim></insert><update id="updateByPrimaryKeySelective" parameterType="demo.domain.TUser">
update t_user
<set><if test="username != null">
username = #{username,jdbcType=VARCHAR},
</if><if test="password != null">
password = #{password,jdbcType=VARCHAR},
</if><if test="createtime != null">
createtime = #{createtime,jdbcType=TIMESTAMP},
</if></set>
where id = #{id,jdbcType=INTEGER}</update><update id="updateByPrimaryKey" parameterType="demo.domain.TUser">
update t_user
set username = #{username,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR},
createtime = #{createtime,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=INTEGER}</update><select id="selectAll" resultMap="BaseResultMap">
select <include refid="Base_Column_List" /> from t_user
</select></mapper>

其中:

<cache type="demo.cache.MybatisRedisCache" />

是关键。

然后就可以在自己写的测试类或者controller中做测试了,测试的时候可以把日志级别设置为debug级别,这样可以看到Mybatis的sql语句。当走缓存的时候,是不会打印sql语句的,反之会出现sql语句。

例如,我们在原有的数据里,新加了一条数据,这时缓存数据和数据库数据就对应不上,可以看到日志里有sql语句打印

[org.mybatis.spring.SqlSessionUtils] - Creating a new SqlSession
[org.mybatis.spring.SqlSessionUtils] - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1005765] was not registered for synchronization because synchronization is not active
[demo.cache.MybatisRedisCache] - >>>>>>>>>>>>>>>>>>>>>>>>getObject:-1445659396:380449231:demo.dao.TUserMapper.selectAll:0:2147483647:select  
id, username, password, createtime
  from t_user:SqlSessionFactoryBean=null
[demo.dao.TUserMapper] - Cache Hit Ratio [demo.dao.TUserMapper]: 0.0
[org.springframework.jdbc.datasource.DataSourceUtils] - Fetching JDBC Connection from DataSource
[org.mybatis.spring.transaction.SpringManagedTransaction] - JDBC Connection [jdbc:mysql://127.0.0.1:3306/demo, UserName=root@localhost, MySQL Connector Java] will not be managed by Spring
[demo.dao.TUserMapper.selectAll] - ==>  Preparing: select id, username, password, createtime from t_user 
[demo.dao.TUserMapper.selectAll] - ==> Parameters: 
[demo.dao.TUserMapper.selectAll] - <==      Total: 9
[demo.cache.MybatisRedisCache] - >>>>>>>>>>>>>>>>>>>>>>>>putObject:-1445659396:380449231:demo.dao.TUserMapper.selectAll:0:2147483647:select  
id, username, password, createtime
  from t_user:SqlSessionFactoryBean=[demo.domain.TUser@4f6d47, demo.domain.TUser@8f7ea3, demo.domain.TUser@c309e0, demo.domain.TUser@bd7ea6, demo.domain.TUser@c5fc10, demo.domain.TUser@2784fd, demo.domain.TUser@8c0b75, demo.domain.TUser@443aea, demo.domain.TUser@177e204]

一旦这个执行过一次后,再执行(不再有数据变更),可以看到,也就不再有sql语句的打印了。

[org.mybatis.spring.SqlSessionUtils] - Creating a new SqlSession
[org.mybatis.spring.SqlSessionUtils] - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@b14a45] was not registered for synchronization because synchronization is not active
[demo.cache.MybatisRedisCache] - >>>>>>>>>>>>>>>>>>>>>>>>getObject:-1445659396:380449231:demo.dao.TUserMapper.selectAll:0:2147483647:select  
id, username, password, createtime
  from t_user:SqlSessionFactoryBean=[demo.domain.TUser@78471b, demo.domain.TUser@847332, demo.domain.TUser@1a6f080, demo.domain.TUser@f78840, demo.domain.TUser@11232a8, demo.domain.TUser@1bbe24e, demo.domain.TUser@672d9, demo.domain.TUser@15e2565, demo.domain.TUser@1e93ee7]
[demo.dao.TUserMapper] - Cache Hit Ratio [demo.dao.TUserMapper]: 0.6666666666666666
[org.mybatis.spring.SqlSessionUtils] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@b14a45]
[demo.domain.TUser@78471b, demo.domain.TUser@847332, demo.domain.TUser@1a6f080, demo.domain.TUser@f78840, demo.domain.TUser@11232a8, demo.domain.TUser@1bbe24e, demo.domain.TUser@672d9, demo.domain.TUser@15e2565, demo.domain.TUser@1e93ee7]

备注:在网上看到有些人说mybatis和redis整合的时候,数据库使用mysql总是加载第一页的数据,不会显示以后的数据,经测试,可以正确加载指定页数的数据,分页也是采用常规的分页方法,这里就不再做描述了。

-------------------------------2016-5-12更新SerializeUtil.java------------------------

public class SerializeUtil {
/**
* 序列化
* @param object
*/
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;
} /**
* 反序列化
* @param bytes
*/
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) {
e.printStackTrace();
}
return null;
}
}
 

Redis之实战篇(与Mybatis整合)的更多相关文章

  1. Spring Boot 揭秘与实战(二) 数据存储篇 - MyBatis整合

    文章目录 1. 环境依赖 2. 数据源3. 脚本初始化 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 4. MyBatis整合5. 总结 4.1. 方案一 通过 ...

  2. Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存

    一. Canal 简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同 ...

  3. 二、Redis基本操作——String(实战篇)

    小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...

  4. 框架篇:Spring+SpringMVC+Mybatis整合开发

    前言: 前面我已搭建过ssh框架(http://www.cnblogs.com/xrog/p/6359706.html),然而mybatis表示不服啊. Mybatis:"我抗议!" ...

  5. SpringBoot非官方教程 | 第六篇:springboot整合mybatis

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot-mybatis/ 本文出自方志朋的博客 本文主要 ...

  6. Redis实战篇

    Redis实战篇 1 Redis 客户端 1.1 客户端通信 原理 客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 . 客户端和服务器发送的命令或数据一律以 \r\n ...

  7. Mybatis整合Redis实现二级缓存

    Mybatis集成ehcache . 为什么需要缓存 拉高程序的性能 . 什么样的数据需要缓存 很少被修改或根本不改的数据 业务场景比如:耗时较高的统计分析sql.电话账单查询sql等 . ehcac ...

  8. Mybatis整合(Redis、Ehcache)实现二级缓存

    目的: Mybatis整合Ehcache实现二级缓存 Mybatis整合Redis实现二级缓存 Mybatis整合ehcache实现二级缓存 ssm中整合ehcache 在POM中导入相关依赖 < ...

  9. mybatis整合redis二级缓存

    mybatis默认开启了二级缓存功能,在mybatis主配置文件中,将cacheEnabled设置成false,则会关闭二级缓存功能 <settings> <!--二级缓存默认开启, ...

随机推荐

  1. linux内核代码的编写初步以及makefile的配置

    在linux内核代码开发中,头文件不能包含标准C头文件,只能采用GNC标准 而且内核开发中没有main函数,只有init 和 exit ,这是每个内核模块中必须要包含的函数模块. 在GNU C标准中, ...

  2. Android通过编译源代码提供系统服务-android学习之旅(85)

    通过编译android4.1.2的源代码,添加一个FregServer的系统服务,以及一个服务代理FregClient 具体分为三部分,client,common,server,common中规定了c ...

  3. Adobe Audition 基本使用

    1.1简介 Adobe Audition (前身是Cool Edit Pro) 是Adobe公司开发的一款功能强大.效果出色的多轨录音和音频处理软件.它是一个非常出色的数字音乐编辑器和MP3制作软件. ...

  4. TCP的核心系列 — SACK和DSACK的实现(四)

    和18版本不同,37版本把DSACK的检测部分独立出来,可读性更好. 37版本在DSACK的处理中也做了一些优化,对DSACK的两种情况分别进行处理. 本文主要内容:DSACK的检测.DSACK的处理 ...

  5. C语言之数值计算--级数算法

    在编程语言的学习中,我们学习过不少的算法,比如累加,累乘,数值交换,排序等等.在一些软件比赛和面试题中,有一类算法不容忽视,属于高频题目,我之前去企业面试的时候就遇到这样的一类题目,题目不算难,掌握方 ...

  6. 【LaTeX排版】LaTeX论文排版<一>

    本文及接下来的几篇文章主要讲关于毕设论文的排版. 1.论文的整体构架     学校规定论文字数不得少于15000:说明论文属于中篇论文.一般来说,中长篇论文采用book文类,短篇论文采用article ...

  7. javascript中正则表达式和ruby中的一点差异

    看到一个例子,不过这个例子中正则表达式的格式貌似是错的: Function.prototype.get_name = function(){ return this.name || this.toSt ...

  8. The 1st tip of DB Query Analyzer

     The 1st tip of DB Query Analyzer               Ma Genfeng   (Guangdong Unitoll Services incorporate ...

  9. mac os x下Dreamweaver如何还原初始配置

    上次在mac下修改Dreamweaver(以下简称dw)时,不知动了哪里,导致打开html文档时设计按钮变灰不能使用!这个太蛋疼了,只能在浏览器中查看效果,live按钮更不用说也是灰化状态. 于是使用 ...

  10. JVM学习--(七)性能监控工具

    前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...