SSM+redis整合

59 篇文章 2 订阅
49 篇文章 0 订阅

具体步骤如下:

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

springmvc+mybatis整合

2,准备好Redis服务器

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
< 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 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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 文件

1
2
3
4
5
6
7
8
9
10
11
12
< 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 >

其中:

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

是开启的关键。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<? 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 >

其中:

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

是关键。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[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] - >>>>>>>>>>>>>>>>>>>>>>>>getO select -1445659396:380449231 id emo.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
[dem select TUserM id per.selectAll] - ==>  Preparing: select id, username, password, createtime from t_user 
[demo.dao.TUserMapper.selectAll] - ==> Parameters: 
[demo.dao.TUserMapper.selectAll] - <==      Total: 9
[demo.cache.MybatisRedisCache] - >>>>> select gt;>>>>&g id >>>>>>>>>>>>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语句的打印了。

1
2
3
4
5
6
7
8
[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] - >>>>>>>>>>>>>>>>>>>>>>>>getO select -1445659396:380449231 id emo.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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值