SpringBoot+MyBatis+Mysql+redis
这是由 SpringBoot+MyBatis+Mysql+redis 进行搭建的,主要是redis,为了提升访问速度,一般会将经常查询且不会经常发生改变的数据存入缓存,然后从缓存中查询数据,提升查询速度。这是一个简单基础的配置,适合新手去学习。
有完整的项目资源可供下载:https://download.****.net/download/qq_34350964/10644926
已经打包上传了,可以进行下载。
一:基本要求
(1)如果开发工具中没有安装SpringBoot插件的,需要安装 STS 插件,安装过程可以百度一下,很简单。
(2)下载安装Maven
(3)需要安装 redis 数据库 下载地址:https://github.com/MicrosoftArchive/redis/releases 根据自己需要进行下载安装,可以自行百度一下安装过程。
二:开始搭建
所有环境和所需工具安装好之后,可以开始搭建项目框架。
(1)搭建过程及简单说明如下图:
第二步
第三步
第四步
第五步:
第六步:
第七步:
以上是简单的创建步骤。
下面直接贴出代码部分:
配置文件
application.properties
注解的方式
# 端口号
server.port=7082
#session 时间
server.session-timeout=900
server.context-path=/
server.tomcat.compression=off
server.tomcat.max-threads=800
server.tomcat.uri-encoding=UTF-8
spring.jmx.default-domain=smr-web
#jsp
spring.mvc.view.prefix= /admin/
spring.mvc.view.suffix= .jsp
# 驱动配置信息 很具自己的
需要选择数据库的驱动
#spring.datasource.url = jdbc:sqlserver://192.168.1.199\\MSSQL\:1433;DatabaseName=ymt55555
#spring.datasource.url = jdbc:sqlserver://47.74.249.122\\MSSQL\:1433;DatabaseName=ymt55555
spring.datasource.url = jdbc\:mysql\://localhost\:3306/4v4?useUnicode\=true&characterEncoding\=utf-8
spring.datasource.username = root
#spring.datasource.password = SLJM.COM123
spring.datasource.password = root
spring.datasource.driverClassName =com.mysql.jdbc.Driver
#连接池的配置信息
## 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
## 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
#mybatis
mybatis.config-locations=classpath\:mybatis-config.xml
mybatis.type-aliases-package=com.redis.bean
mybatis.mapper-locations=classpath:com/redis/Dao/Mapper/*.xml,com/redis/Dao/Mapper/*.xml
#打印sql
logging.level.com.wangti.controller=WARN
logging.level.com.wangti.dao=DEBUG
# redis 缓存相关配置
#Redis数据库索引(默认为0)
spring.redis.database=0
#redis 服务器地址
spring.redis.host=127.0.0.1
#端口号
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最小空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=5000
JDBC配置文件
generatorConfig.properties
jdbc.driverLocation=D:/sqljdbc4-4.0.jar
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://127.0.0.1:3306/4v4?useUnicode=true&characterEncoding=utf-8
jdbc.userId=root
jdbc.password=root
Mybatis 配置文件
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>
<properties>
<property name="dialect" value="sqlserver" />
</properties>
<settings>
<!-- 这个配置使全局的映射器启用或禁用缓存。系统默认值是true,设置只是为了展示出来 -->
<setting name="cacheEnabled" value="true" />
<!-- 驼峰命名关闭 -->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 系统默认值是true,设置只是为了展示出来 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)。 系统默认值是true,设置只是为了展示出来 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!--使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动。 系统默认值是true,设置只是为了展示出来 -->
<setting name="useColumnLabel" value="true" />
<!--允许 JDBC 支持生成的键。需要适合的驱动。如果设置为 true 则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如
Derby)。 系统默认值是false,设置只是为了展示出来 -->
<setting name="useGeneratedKeys" value="false" />
<!--配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 系统默认值是SIMPLE,设置只是为了展示出来 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!--设置超时时间,它决定驱动等待一个数据库响应的时间。 系统默认值是null,设置只是为了展示出来 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
</configuration>
POM.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.redis</groupId>
<artifactId>Redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Redis</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<!-- 缺少此包注解会出问题 @mapper -->
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- 记录日志 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<!-- servlet 依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- JSTL标签库 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat 的支持.-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- redis缓存配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(一)实体类:
package com.redis.bean;
import java.io.Serializable;
import java.util.Date;
/**
* 用户实体
* @author Administrator
* 实体需要进行序列化 不然会出现问题
*/
public class User implements Serializable{
private int userid;
private String name;
private String img;
private String phone;
private String password;
private Date createtime;
private int is_delete;
private int integral;
private int age;
private String sex;
private String likes;
private String province;
private String city;
private String district;
private String content;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public int getIs_delete() {
return is_delete;
}
public void setIs_delete(int is_delete) {
this.is_delete = is_delete;
}
public int getIntegral() {
return integral;
}
public void setIntegral(int integral) {
this.integral = integral;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getLikes() {
return likes;
}
public void setLikes(String likes) {
this.likes = likes;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getDistrict() {
return district;
}
public void setDistrict(String district) {
this.district = district;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
接口层: DAO
package com.redis.Dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.redis.bean.User;
@Mapper
public interface UserDao {
public List<User> findAll();//获取所有的信息
public User getinfo(@Param("userid") int userid);//根据编号获取实体信息
}
XML Mapper 类
<?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="com.redis.Dao.UserDao">
<resultMap id="BaseResultMap" type="com.redis.bean.User">
<id column="userid" property="userid"/>
<result column="name" property="name" />
<result column="img" property="img" />
<result column="phone" property="phone" />
<result column="password" property="password" />
<result column="createtime" property="createtime" />
<result column="character" property="character" />
<result column="is_delete" property="is_delete" />
<result column="integral" property="integral" />
<result column="age" property="age" />
<result column="sex" property="sex" />
<result column="likes" property="likes" />
<result column="province" property="province" />
<result column="city" property="city"/>
<result column="district" property="district" />
<result column="content" property="content" />
</resultMap>
<select id="findAll" resultMap="BaseResultMap">
select * from User
</select>
</mapper>
Service 层 业务逻辑层
package com.redis.Service;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.redis.bean.User;
public interface UserService {
public List<User> findAll();
public User getinfo(@Param("userid") int userid);
}
Impl 实现类 要注意 导入此包 import org.springframework.data.redis.core.*; 注意JAR是否下载全,如果下载不全会出现问题
会出现package下面有红线,导致项目启动失败
package com.redis.Service.Impl;
import org.springframework.data.redis.core.*;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.redis.Dao.UserDao;
import com.redis.Service.UserService;
import com.redis.bean.User;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao dao;
@Autowired
private RedisTemplate redisTemplate;
@Override
public List<User> findAll() {
// TODO 存入redis数据
//清空
while (redisTemplate.opsForList().size("user") > 0){
redisTemplate.opsForList().leftPop("user");
}
//向redis的某个key下面的list列表里面插入一个list列表,不会去重。
redisTemplate.opsForList().rightPushAll("user", dao.findAll());
return dao.findAll();
}
@Override
public User getinfo(int userid) {
// TODO Auto-generated method stub
redisTemplate.opsForValue().set("userid", dao.getinfo(userid));//将实体写入缓存,在需要用到的地方用 redisTemplate.opsForValue().get("userid"); 进行获取数据
return dao.getinfo(userid);
}
}
Controller 层
UserController
package com.redis.Controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.redis.Service.UserService;
import com.redis.bean.User;
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userservice;
@Autowired
private RedisTemplate redisTemplate;
/**
* 获取所有的数据信息
* @return
*/
@RequestMapping("/findall")
public List<User> findALL(){
//从redis中取出某一个key下面的list列表, 0表示从列表的第0个元素开始取,-1表示直取到倒数第一个元素,也就是整个列表的所有元素都取出来。
List<User> list = redisTemplate.opsForList().range("user", 0, -1);
if(list.size()==0){//如果缓存中的数据为空的时候进行重新获取数据
list=userservice.findAll();
}
return list;
}
/**
* 根据编号获取信息实体
* @param userid 用户编号
* @return
*/
@RequestMapping("/getinfo")
public User getinfo(@RequestParam("userid") Integer userid){
return userservice.getinfo(userid);
}
}
以上是全部的代码部分,开始运行
找到启动类
项目启动成功后会提示 如下:
项目启动成功后还需要经 Redis 的服务启动,否则无法进行访问
开始访问:
http://localhost:7082/user/findall 可以不用带项目名称,至于为什么,在这里先不进行深究
运行结果如下:
到这里项目搭建成功,基本运行没有问题,有一些基本的运行原理,在这里先不进行深究,只是一个项目简单的搭建和基本的运行。
在redis中有很多操作数据的方法:这里就不进行举例,可以给大家推荐一个相关介绍的链接,让大家学习:
RedisTemplate缓存用法小记 :https://blog.****.net/wxx151556/article/details/78493147
redis 不仅可以做数据的缓存,还可以进行如下操作:
(1):以下内容转载自:http://www.cnblogs.com/jing1617/p/9075105.html
1、最新列表
例如新闻列表页面最新的新闻列表,如果总数量很大的情况下,尽量不要使用select a from A limit 10,尝试redis的 LPUSH命令构建List,一个个顺序都塞进去就可以啦。不过万一内存清掉了咋办?也简单,查询不到存储key的话,用mysql查询并且初始化一个List到redis中就好了。
2、排行榜应用
实现这个功能主要用到的redis数据类型是redis的有序集合zset。zset 是set 类型的一个扩展,比原有的类型多了一个顺序属性,此属性在每次插入数据时会自动调整顺序值,保证value值按照一定顺序连续排列。
我们假设是一个游戏经验值排行榜,那主要的实现思路是:
-
1、在一个新的玩家参与到游戏中时,在redis中的zset中新增一条记录(记录内容看具体的需求)score为0
-
2、当玩家的经验值发生变化时,修改该玩家的score值
-
3、使用redis的ZREVRANGE方法获取排行榜
3、计数器应用
Redis的命令都是原子性的,你可以轻松地利用INCR、DECR命令进行原子性操作,来构建计数系统。由于单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能。
比如在一个 web 应用程序中,如果想知道用户在一年中每天的点击量,那么只要将用户 ID 以及相关的日期信息作为键,并在每次用户点击页面时,执行一次自增操作即可。
4、数据排重
Redis set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口。
实现方案:
set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
5、实时的反垃圾系统
反垃圾系统通常都是基于关键词的,使用Redis储存关系词,能够利用Redis的高性能,为监控系统提供稳定及精确的实时监控功能,典型的案例如,邮件系统、评论系统等。
6、可以发布、订阅的实时消息系统
Redis中Pub/Sub系统可以构建实时的消息系统,比如,很多使用Pub/Sub构建的实时聊天应用。
设计思路:
-
服务端发送消息(含标题,内容),标题按照一定规则存入redis,同时标题(以最少的信息量)推送到客户端,客户点击标题时,获取相应的内容阅读.
-
如果未读取,可以提示多少条未读,redis能够很快记数
-
根据一定时间清理缓存
技术实现:
-
需要redis数据库,客户端websocket,服务器端websocket
7、队列应用
队列在现在程序中应用十分广泛,比如日志推送、任务处理等等。以往通常使用http sqs实现队列,其实,使用redis的list类型,也可以实现队列。
谢谢,到这里就结束了!