系列导航

springBoot项目打jar包

1、springboot工程新建(单模块)

2、springboot创建多模块工程

3、springboot连接数据库

4、SpringBoot连接数据库引入druid

5、SpringBoot连接数据库引入mybatis

6、SpringBoot-mybatis分页实现pagehelper

7、SpringBoot-mybatis-plus引入

8、SpringBoot 事务

9、SpringBoot-mybatis-druid多源数据多源数据

10、SpringBoot-mybatis-plus-druid多源数据

11、SpringBoot-mybatis-plus-druid多源数据事务

12、SpringBoot-mybatis-plus-ehcache

13、SpringBoot-配置文件里密码加密

14、SpringBoot-easyexcel导出excle

完结

1、数据库中创建表

CREATE TABLE TEST_BLOCK_T
(
BLOCK_ID VARCHAR2(10 BYTE) PRIMARY KEY, --编码
BLOCK_NAME VARCHAR2(200 BYTE) --资源名称
);

2、pom.xml依赖

 <properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.1.16.RELEASE</spring-boot.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- ehcache依赖 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency> <!-- 集成mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency> <!-- oracle驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency> </dependencies>

3、工程结构

4、配置文件

application.properties

# 应用名称
spring.application.name=demo
# 应用服务 WEB 访问端口
server.port=8080 spring.cache.type=ehcache
spring.cache.ehcache.config=classpath:/config/ehcache.xml # 数据库设置
spring.datasource.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@192.168.0.100:1521:orcl
spring.datasource.username=zy
spring.datasource.password=1 #mybatis-plus控制台打印sql
mybatis-plus.configuration.log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

ehcache.xml

<ehcache>

    <!--
磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存
path:指定在硬盘上存储对象的路径
path可以配置的目录有:
user.home(用户的家目录)
user.dir(用户当前的工作目录)
java.io.tmpdir(默认的临时目录)
ehcache.disk.store.dir(ehcache的配置目录)
绝对路径(如:d:\\ehcache)
查看路径方法:String tmpDir = System.getProperty("java.io.tmpdir");
-->
<diskStore path="java.io.tmpdir"/> <defaultCache
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="false"
/>
<cache
name="myCache"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="false"
/> <!--
cache :自定的缓存,当自定的配置不满足实际情况时可以通过自定义(可以包含多个cache节点)
name : 缓存的名称,可以通过指定名称获取指定的某个Cache对象
maxElementsInMemory :内存中允许存储的最大的元素个数,0代表无限个
clearOnFlush:内存数量最大时是否清除。
eternal :设置缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。根据存储数据的不同,例如一些静态不变的数据如省市区等可以设置为永不过时
timeToIdleSeconds : 设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds :缓存数据的生存时间(TTL),也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
overflowToDisk :内存不足时,是否启用磁盘缓存。
maxEntriesLocalDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
maxElementsOnDisk:硬盘最大缓存个数。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
diskPersistent:是否在VM重启时存储硬盘的缓存数据。默认值是false。
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
--> </ehcache>
注:配置文件中注意eternal参数,建议设置为true让其一直存在缓存中,否则timeToIdleSeconds、timeToLiveSeconds参数如果设置的时间太短就会导致缓存删除了,导致缓存失效。具体参数含义看配置文件里的注释

5、源码

package com.example.ehcache;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching; @SpringBootApplication
@EnableCaching
@MapperScan("com.example.ehcache.mapper")
public class EhcacheApplication { public static void main(String[] args) {
SpringApplication.run(EhcacheApplication.class, args);
} }
package com.example.ehcache.controller;

import com.example.ehcache.domain.Block;
import com.example.ehcache.service.DemoService;
import org.springframework.web.bind.annotation.*; /**
* @author lz
* @date 2018/12/27
*/
@RestController
@RequestMapping("/cache")
public class CacheController {
private final DemoService demoService; public CacheController(DemoService demoService) {
this.demoService = demoService;
} @PostMapping( value = "/put" )
@ResponseBody
public void put() {
Block block = new Block();
block.setBlockId("9999");
block.setBlockName("哈哈哈");
demoService.save(block); } @GetMapping(value = "/get" )
@ResponseBody
public void cacheable() {
Block block = new Block();
block.setBlockId("9999");
Block blockResult = demoService.findOne(block);
System.out.println("controller:"+blockResult); } @PostMapping( value = "/remove")
@ResponseBody
public String evict() {
String id = "9999";
demoService.remove(id);
return "ok";
} @PostMapping( value = "/put1" )
@ResponseBody
public void put1() {
String id ="oiline";
String name ="100";
demoService.put(id, name); } @GetMapping(value = "/get1" )
@ResponseBody
public void cacheable1() {
String id ="oiline";
String result = demoService.get(id);
System.out.println("取到的数据result是:"+result); } @PostMapping( value = "/remove1")
@ResponseBody
public String evict1() {
String id ="oiline";
demoService.delete(id);
return "ok";
} }
package com.example.ehcache.domain;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; /**
* <p>
* 。
* </p>
*
* @author yc
* @since 2021-09-18
*/
@TableName(value = "TEST_BLOCK_T")
public class Block {
private static final long serialVersionUID = 1L; @TableId
private String blockId;
/**
* $field.comment。
*
*/
private String blockName; public String getBlockId() {
return blockId;
} public void setBlockId(String blockId) {
this.blockId = blockId;
} public String getBlockName() {
return blockName;
} public void setBlockName(String blockName) {
this.blockName = blockName;
} @Override
public String toString() {
return "TEST_BLOCK_T{" +
"blockId='" + blockId + '\'' +
", blockName='" + blockName + '\'' +
'}';
}
}
package com.example.ehcache.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.example.ehcache.domain.Block;

public interface BlockMapper extends BaseMapper<Block> {

}
package com.example.ehcache.service;

import com.example.ehcache.domain.Block;

import java.util.Map;

/**
* @author lz
* @date 2018/12/27
*/
public interface DemoService {
Block save(Block block); void remove(String id); Block findOne(Block block); String put(String id,String value);
String get(String id);
void delete(String id); }
package com.example.ehcache.service.impl;

import com.example.ehcache.domain.Block;
import com.example.ehcache.mapper.BlockMapper;
import com.example.ehcache.service.DemoService; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import java.util.HashMap;
import java.util.Map; /**
* @author lz
* @date 2018/12/27
*/
@Service
@CacheConfig(cacheNames = {"myCache"})
public class DemoServiceImpl implements DemoService { /**
* 注意:如果没有指定key,则方法参数作为key保存到缓存中
*/
@Autowired
BlockMapper blockMapper;
/**
* @param block
* @return
* @CachePut缓存新增的或更新的数据到缓存,其中缓存的名称为people,数据的key是person的id
*/
@CachePut(key = "#block.blockId")
@Override
public Block save(Block block) {
blockMapper.insert(block);
System.out.println("新增");
System.out.println("为id,key为:" + block.getBlockId() + "数据做了缓存");
return block;
} /**
* @param id
* @CacheEvict从缓存people中删除key为id的数据
*/
@CacheEvict
@Override
public void remove(String id) {
System.out.println("删除");
System.out.println("删除了id,key为" + id + "的数据缓存");
//personRepository.deleteById(id);
} /**
* @param block
* @return
* @Cacheable缓存key为person的id数据到缓存people中
*/
//@Cacheable(value="HelloWorldCache", key="#param") 这里可以用value指定缓存的名称
// 因为在@CacheConfig(cacheNames = {"myCache"}) 指定过了所以这里不用重复指定
@Cacheable(key = "#block.blockId")
@Override
public Block findOne(Block block) {
Block BlockResult = blockMapper.selectById(block.getBlockId());
System.out.println("查询");
System.out.println("为id,key为:"+ block.getBlockId() + "数据做了缓存");
return BlockResult;
} //-----------------------单纯存一个数的缓存,不需要存入数据库里-----------------------------------
private final Map<String,String> map=new HashMap<>(); @Override
@CachePut( key = "#id")
public String put(String id, String value) {
System.out.println("插入数据:"+id+" ==> "+value);
map.put(id,value); return value;
} @Override
@Cacheable( key = "#id")
public String get(String id) {
System.out.println("查询数据:"+id); String result=map.get(id);
if (result==null){
return "查询的数据不存在";
} return result;
} @CacheEvict( key = "#id")
public void delete(String id){
System.out.println("删除数据:"+id);
map.remove(id);
} }

6、测试

(1)get方法 : http://localhost:8080/cache/get  获取数据

结果:

说明:此时缓存和数据库里都没有数据。缓存里没有数据所以查了一次数据库。

(2)post方法 : http://localhost:8080/cache/put   新增数据

结果:

说明:此时向缓存和数据库里增加了数据。

(3)get方法 : http://localhost:8080/cache/get   获取数据

结果:

说明:此时缓存里有数据了,就没有查数据库找数据。(这是该缓存技术的闪光点)

(4)post方法 : http://localhost:8080/cache/remove  删除数据

结果:

说明:此时删除了缓存里的数据。注:代码里并没有删除数据库的数据

(5)get方法 : http://localhost:8080/cache/get   再次获取数据

结果:

说明:此时由于缓存里有数据,所以查询一次数据库。(这是该缓存技术的闪光点)

(6)get方法 : http://localhost:8080/cache/get   获取数据

结果:

说明:经过上一个查询,缓存里又有数据了,所以直接从缓存里取数据。

7、如何只单纯放一个数据在缓存里,不存在数据库里

请看如下Controller中的方法,测试方法和上面一样。

http://localhost:8080/cache/get1      GET

http://localhost:8080/cache/put1      POST

http://localhost:8080/cache/remove1  POST

12、SpringBoot-mybatis-plus-ehcache的更多相关文章

  1. easy-table-vue+VueJs、SpringBoot+Mybatis实现MVVM模型前后台数据交互

    该项目分为前端展示部分和后台服务部分. 前端部分 使用的技术是:NodeJs.Webpack.VueJs 使用的组件库是:IVIEW.easy-table-vue 使用的开发工具是:WebStorm ...

  2. 9、SpringBoot+Mybatis整合------动态sql

    开发工具:STS 前言: mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活. 动态sql中的语法: where标签 if标签 trim标签 set标签 s ...

  3. 2、SpringBoot+Mybatis整合------一对一

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis01/tree/93398da60c647573645917b2 ...

  4. 1、SpringBoot+Mybatis整合------简单CRUD的实现

    编译工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis01/commit/b757cd9bfa4e2de551b2e9 ...

  5. 1、springboot+mybatis+zookeeper+dubbox+maven+pagehelper

    一.创建普通的maven的web项目 2.配置KD42WF_Part1下的pom.xml <?xml version="1.0" encoding="UTF-8&q ...

  6. 12、springboot注解

    @RestController和@Controller import java.lang.annotation.Documented; import java.lang.annotation.Elem ...

  7. 8、SpringBoot+Mybatis整合------参数取值方式

    前言: 我们知道,在mybatis中,参数取值方式有两种: #{ } 和 ${ } 下面,我们来探讨下#{ }与${ }不同. 一.#{ } 例: select * from student wher ...

  8. 7、SpringBoot+Mybatis整合------PageHelper简单分页

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis/tree/1d30d2a573ce6784149a28af9b ...

  9. 6、SpringBoot+Mybatis整合------参数传递

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis/tree/7892801d804d2060774f3720f8 ...

  10. 5、SpringBoot+Mybatis整合------多对多

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis/tree/3baea10a3a1104bda815c20695 ...

随机推荐

  1. 记一次逆向分析解密还原Class文件

    前言 前阵子我的一位朋友发来一份代码让我帮忙看看.具体就是所有的jsp文件内容和大小都一样,漏洞挖掘无从下手.经过分析发现所有的Class都使用了自定义的加密工具加密,经过逆向分析,顺利解密,因而有了 ...

  2. AtCoder_abc327

    T1 ab 循环从s[0] 到s[n-2] 判断有无ab相邻 T2 A^A 两层循环枚举就可以了 由于aa会增长的很快,所以当a=16时aa就已经大于\(10^{18}\)了,一定不会T 就这么点数打 ...

  3. 深度解读DBSCAN聚类算法:技术与实战全解析

    探索DBSCAN算法的内涵与应用,本文详述其理论基础.关键参数.实战案例及最佳实践,揭示如何有效利用DBSCAN处理复杂数据集,突破传统聚类限制. 关注TechLead,分享AI全维度知识.作者拥有1 ...

  4. 使用Netty实现文件传输的HTTP服务器和客户端

    现在我们来用netty实现文件传输的HTTP服务器和客户端 pom依赖文件: <?xml version="1.0" encoding="UTF-8"?& ...

  5. 关于C#反射概念,附带案例!

    反射 C#中的反射是一种使程序在运行时能够动态地获取类型信息并调用其成员的技术.通过反射,程序可以在运行时进行类型的动态加载.创建对象.调用方法和属性,以及访问和修改字段等.反射可以使程序更加灵活,但 ...

  6. SpringBoot 异步编程浅谈

    1. 需求背景 当我们需要提高系统的并发性能时,我们可以将耗时的操作异步执行,从而避免线程阻塞,提高系统的并发性能.例如,在处理大量的并发请求时,如果每个请求都是同步阻塞的方式处 理,系统的响应时间会 ...

  7. 使用RFC跳过权限校验的方法

    1.业务背景 由于业务流程的复杂性,用户往往只具备部分功能的权限,导致在操作自开发程序时出现权限问题.例如前台限制了用户对销售订单的修改,而自开发功能中又涉及单据修改,此时一味限制权限,则无法正常使用 ...

  8. 9.mysql的数据迁移到es中

    背景 从开发的角度说,就是老板叫我用es了,没那么多为什么,爸爸说了算 从业务角度,mysql已经不能满足我对全文检索的需求了.我需要检索某一个字段包含"圣诞节刚刚过去"这一字符串 ...

  9. 作为所有类的顶层父类,没想到Object的魔力如此之大!

    写在开头 在上一篇博文中我们提到了Java面向对象的四大特性,其中谈及"抽象"特性时做了一个引子,引出今天的主人公Object,作为所有类的顶级父类,Object被视为是James ...

  10. Java 获取Excel中的表单控件

    Excel中可通过[开发工具]菜单栏下插入表单控件,如文本框.单选按钮.复选框.组合框等等,插入后的控件可执行设置控件格式,如大小.是否锁定.位置.可选文字.数据源区域.单元格链接等.当Excel中已 ...