说说JPA——JPA是一组规范,并不是一个框架。hibernate是实现JPA最好的一个框架,框架使用JPA对数据库的交互进行了封装,,所以我下面的案例中就是用hibernate框架进行融合展示的。
说说redis——redis也是相当于数据库,不过传统的数据库数据是存储在硬盘中的,而redis可以将数据存储在内存中,书写的速度很快,所以它被用于缓存当中,使用redis缓存后操作数据库得到数据时,只要redis服务器不关,就可以直接从缓存中得到数据。
redis支持的数据类型(可以直接去官网学习,很详细):
——String:String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。
——Hsah:hash 是一个 string 类型的 field 和 value 的映射表,适合用于储存对象。
——List:链表
——Set:set 对外提供的功能与list类似是一个列表的功能,特殊之处在于 set 是可以自动排重的
——zSet:和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。
关于redis的知识推荐一篇博客:https://blog.youkuaiyun.com/qq_34337272/article/details/80012284?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
案例目录:
pom.xml文件:
<!-- springBoot父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- springBoot——redis依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- springBoot测试依赖 -->
<dependency>
<!-- this is needed or IntelliJ gives junit.jar or junit-platform-launcher:1.3.2 not found errors -->
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
<!-- 阿里数据连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- jsp的支持依赖 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
application.properties配置文件,redis服务器地址,端口,密码这些是默认的,还有下面的一些rides配置根据自己的情况进行配置,我写出来是为了记录笔记:
#连接池
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/spring_aop?useUnicode=true&characterEncoding=utf8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#修改为阿里连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#springmvc
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
#jpa
spring.jpa.database: mysql
spring.jpa.show-sql: true
spring.jpa.hibernate.naming.physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#redis
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=200
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.pool.max-idle=10
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0
RedisApplication类,@SpringBootApplication注解指定类为主配置文件,@EnableCaching注解指定配置文件在启动的时候允许使用redis缓存。
@SpringBootApplication
@EnableCaching //配置文件开启时,允许使用缓存,,注意要把redis服务器打开。。
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
}
Bank对象类,@Componentc注解实例化,@Entity注解指定实体类,@Table(name=“bank”)注解指定表:
@Component
@Entity
@Table(name="bank")
public class Bank implements java.io.Serializable{
private static final long serialVersionUID = 1L;
@Id
@Column(name="bid")
private int bid;
@Column(name="bname")
private String bname;
@Column(name="money")
private double money;
BankDao接口,继承封装好的简单CRUD-JpaRepository,和复杂CRUD-JpaSpecificationExecutor 的接口。
public interface BankDao extends JpaRepository<Bank, Integer>,JpaSpecificationExecutor<Bank>,Serializable{
}
service接口就一个查询全部的功能,这里直接上serviceimpl类,@Cacheable(cacheNames=“bank.service.all”)注解作用是在指定需要用缓存的方法,cacheNames是给缓存指定一个名字,可以随便写。
@Service("bankService")
public class BankServiceImpl implements BankService{
@Autowired
private BankDao bankDao;
//在要缓存的方法上面添加缓存注解
@Cacheable(cacheNames="bank.service.all")
@Override
public List<Bank> findAll() {
return bankDao.findAll();
}
}
没有做页面,控制层就不写了,直接通过springBoot测试类测试一下,测试两次会发现第一次发出了sql语句,第二次是从缓存中得到数据的,所以没有发出sql语句:
@SpringBootTest
public class ApplicationTest {
@Autowired
private BankService bankService;
@Test
void testFindAll() {
System.out.println(bankService.findAll().size());
}
}