SpringBoot集成EhCache

SpringBoot和EhCache基础不在啰嗦,这里只说集成

1.首先创建数据库文件,这里使用MySQL

CREATE TABLE `sveell_student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键,自动递增',
  `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL COMMENT '姓名',
  `sex` char(1) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL COMMENT '性别:0:女 1:男',
  `birthday` date NULL DEFAULT NULL COMMENT '出生日期',
  `picture` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL COMMENT '照片',
  `hobby` varchar(36) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL COMMENT '爱好:1.足球2.篮球3.排球4.乒乓球5.音乐6.舞蹈',
  `phone` char(11) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL COMMENT '电话',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL COMMENT '家庭地址',
  `introduce` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL COMMENT '自我介绍',
  `create_time` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
  `state` char(1) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT '0' COMMENT '状态: 0:正常 1:已删除',
  `spare` varchar(32) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL COMMENT '备用字段',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 27 CHARACTER SET = utf8 COLLATE = utf8_croatian_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

2.创建一个SpringBoot项目,加入pom依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </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>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.41</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--数据库连接池代替C3P0-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-guava</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
    </dependencies>

3.配置application.yml文件



# 配置访问端口
server:
  port: 8080
  #配置项目路径
  servlet:
    context-path: /
# 配置模板引擎
thymeleaf:
  # 是否启用模板缓存
  cache: false
  # 应用于模板的模板模式,参考TemplateMode 枚举
  mode: HTML5
  # 模板文件编码
  encoding: UTF-8
  # 构建URL时预先查看视图名称的前缀
  prefix: classpath:/templates/
  # 在构建URL时附加到视图名称的后缀
  suffix: .html
  # 文件解析格式
  content-type: text/html
  resources: # 指定静态资源的路径
    static-locations: classpath:/static/,classpath:/templates/,classpath:/public/
  # 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
  static-path-pattern: /**


# mysql配置  
spring:
  # 运行的环境 dev:开发环境|test:测试环境|prod:生产环境
  profiles:
    active: dev
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/Student?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: oywh
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    filters: stat
    #连接池的最大值,同一时间可以从池分配的最多连接数量,0时无限制
    maxActive: 20  
    #连接初始值,连接池启动时创建的连接数量的初始值
    initialSize: 1  
    maxWait: 60000
    #最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请
    minIdle: 1  
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: select 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    #是否对已备语句进行池管理(布尔值),是否对PreparedStatement进行缓存
    poolPreparedStatements: true  
    maxOpenPreparedStatements: 20
    jackson:
      date-format: yyyy-MM-dd HH:mm:ss
      #time-zone: GMT+8
  servlet:
    multipart:
      enabled: true
      #配置文件传输
      file-size-threshold: 0
      #单个数据的大小
      max-file-size: 100MB
      #总数据的大小
      max-request-size: 100MB
      #配置ehcache配置文件
  cache:
    ehcache:
      config: classpath:ehcache.xml
    type: ehcache


#日志打印级别
debug: false
logging:
  level:
    top.denghuolanshan.admin.dao: DEBUG
  file: F:\student.log



mybatis-plus:
  type-aliases-package: cn.svell.entity
#config-location: classpath*:/mapper/**Mapper.xml
global-config:
  #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
  id-type: 0
  #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
  field-strategy: 2
  #驼峰下划线转换
  db-column-underline: true
  #刷新mapper 调试神器
  refresh-mapper: true
  #数据库大写下划线转换
  capital-mode: true
  #逻辑删除配置(下面3个配置)
  logic-delete-value: 0
  logic-not-delete-value: 1
  #自定义SQL注入器
  #sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false

4.在resources下加入ehcache.xml配置文件,内容如下

<?xml version="1.0" encoding="UTF-8"?>
 
<ehcache>
   <!-- 
         磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存
          path:指定在硬盘上存储对象的路径
   -->
   <diskStore path="G:\ehcache" />
    
   <!-- 
        defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理
        maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象
        eternal:代表对象是否永不过期
        overflowToDisk:当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中
   -->
   <defaultCache
      maxElementsInMemory="100"
      eternal="true"
      overflowToDisk="true"/>


    <!--
           maxElementsInMemory设置成1,overflowToDisk设置成true,只要有一个缓存元素,就直接存到硬盘上去
           eternal设置成true,代表对象永久有效
           maxElementsOnDisk设置成0 表示硬盘中最大缓存对象数无限大
           diskPersistent设置成true表示缓存虚拟机重启期数据
        -->
    <cache
            name="a"
            maxElementsInMemory="1"
            eternal="true"
            overflowToDisk="true"
            maxElementsOnDisk="0"
            diskPersistent="true"/>

</ehcache>

5.因为涉及到了前端,我这里不给代码了,因为页面,代码太多,我会在文末放置项目链接的,数据持久层我用的是MyBatisPlus,实体类,dao接口和controller不在写了,但有几个需要之一的地方

1.SpringBoot启动类上要添加一个@EnableCaching注解
2.实体类要序列化,实现Serializable即可

6.直接说Service,因为缓存是用在Service方法上的,我看网上有些说注解写在dao接口上,我没有测试,但如果使用MyBatisPlus的话,基本的CRUD是没有办法加注解的

package cn.svell.service.impl;

import cn.svell.entity.Student;
import cn.svell.mappeer.StudentMapper;
import cn.svell.service.StudentService;
import cn.svell.utils.DataUtil;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * @ClassName StudentServiceImpl
 * @Description TODO
 * @Author 小欧
 * @Date 2019/7/19 21:42
 * @Version 1.0
 **/
@Service
public class StudentServiceImpl implements StudentService {
    @Resource
    private StudentMapper studentMapper;

    @Cacheable(value="a")
    @Override
    public List<Student> getStudentList() {
        List<Student> studentList = null;
        studentList = studentMapper.findAll();
        String result = "";
        for (Student student : studentList) {
            // 因为该字段使用的Date类型所以需要格式化日期
            String birthday = DataUtil.formatDatetoString(student.getBirthday(), "yyyy-MM-dd");
            student.setBirth(birthday);
            String hobby = student.getHobby();
            if (hobby==null){
                // 写不写无所谓
                student.setHobby("无");
            }else if (hobby.contains("1")||hobby.contains("2")||hobby.contains("3")||hobby.contains("4")||hobby.contains("5")||hobby.contains("6")){
                // 因为前端不是很精通所以爱好数据直接在这里处理了,解决方案不是很好
                hobby = judgmentType(result, student);
                student.setHobby(hobby);
            }
        }
        return studentList;
    }
    @CacheEvict(value="a",allEntries=true)
    @Override
    public int deleteStudent(Integer id) {
        return studentMapper.updateStateById(id);
    }

    @CacheEvict(value="a",allEntries=true)
    @Override
    public int saveStudent(Student student) throws Exception {
        String birth = student.getBirth();
        Date date = DataUtil.StringFormatDate(birth, "yyyy-MM-dd");
        student.setBirthday(date);
        student.setCreateTime(DataUtil.formatDatetoString(new Date(),"yyyy-MM-dd HH:mm:ss"));
        if (student.getId() == null){
            // 添加
            Integer add = studentMapper.insert(student);
            if(add == 1){
                return add;
            }
            throw new Exception();
        }
        // 修改
        Integer edit = studentMapper.updateAllColumnById(student);
        if(edit == 1){
            return edit;
        }
        return 0;
    }

    /***
     * 直接在后台根据前端的value值转换成了对应的文字,
     * 因为StringBuffer不能传入空值,所以我采用类比较消耗内存的“+”号连接符
     * @param result
     * @param student
     * @return
     */
    private String judgmentType(String result, Student student) {
        String hobby = student.getHobby();
        if (hobby.contains("1")){
            result = result + "足球 ";
        }
        if (hobby.contains("2")){
            result = result + "篮球 ";
        }
        if (hobby.contains("3")){
            result = result + "排球 ";
        }
        if (hobby.contains("4")){
            result = result + "乒乓球 ";
        }if (hobby.contains("5")){
            result = result + "音乐 ";
        }
        if (hobby.contains("6")){
            result = result + "舞蹈 ";
        }
        return result;
    }
}

7.直接在service查询方法上添加@Cacheable(value=“a”)注解就可以了,而删除,修改,添加后要更新缓存,则添加注解@CacheEvict(value=“a”,allEntries=true)即可。

8.最后附上项目地址链接:https://pan.baidu.com/s/1LR5QZL2dZlLoDl2BtNLUVA
提取码:fxzh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值