瑞吉外卖学习笔记

@TableField

作用:

  • 当数据库中表的列名与实体类中的属性名不一致,使用@TableField 使其对应
@TableField("db_column_name")
private String entityFieldName;
  • exist 属性 : 指定该字段是否参与增删改查操作。

    @TableField(exist = false)
    private String tempField;  // 该字段不会参与数据库操作
    
  • 实现自动填充,标注在需要自动填充的字段上:

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;  // 插入时自动填充
    
  • 指定更新策略:

    @TableField(updateStrategy = FieldStrategy.NOT_NULL)
    private String name;  // 只有字段不为空时才更新
    
异常处理器
package warren.reggie.common;/** author: Warren*/import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.sql.SQLIntegrityConstraintViolationException;@ControllerAdvice(annotations = {RestControllerAdvice.class, Controller.class}) // 处理加了这些注解的类(@RestController 或 @Controller)
@ResponseBody // 返回的对象会自动序列化为JSON,直接作为HTTP响应体返回
public class ExceptionHandler {/*** 处理SQLIntegrityConstraintViolationException异常。* @param ex 捕获的异常对象* @return 返回错误信息的响应对象(R类)*/@org.springframework.web.bind.annotation.ExceptionHandler(SQLIntegrityConstraintViolationException.class)public R<String> ExceptionHandler(SQLIntegrityConstraintViolationException ex) {System.out.println("异常信息:" + ex.getMessage());if (ex.getMessage().contains("Duplicate entry")) {//将异常信息按空格拆分并取出相关字段String[] s = ex.getMessage().split(" ");// 错误信息提取:获取重复条目的字段值,通常是数据库的唯一键(如用户名、手机号等)String msg = s[2] + "已存在"; // 提示用户该数据已存在return R.error(msg);}// 如果不是重复数据的错误,则返回通用的错误信息return R.error("出错了");}
}

@ExceptionHandler : 捕获并处理指定类型的异常。

@ControllerAdvice : 集中处理所有控制器类中抛出的异常。应用于所有带有 @Controller@RestController 注解的类.

强制刷新浏览器缓存 :(Ctrl + Shift + R)。

Spring Cache
  • 一个框架,使用注解实现缓存功能
  • CacheManager 是spring提供的各种缓存技术的接口.

![[Pasted image 20250219101359.png]]

如何使用缓存技术 : 导入对应技术的依赖包,并在启动类上使用@EnableCaching注解

常用注解:

注解作用
@Cacheable查询缓存,如果缓存存在数据,则直接返回,否则查询数据库,并存入缓存
@CachePut更新缓存,执行方法并更新缓存数据
@CacheEvict删除缓存,当数据更新/删除时,清除对应缓存
@Caching组合多个缓存注解,用于复杂缓存策略
@CacheConfig类级别的缓存配置,简化 @Cacheable@CachePut@CacheEvictvalue 指定
@Cacheable(查询缓存):
@Service
public class DishService {@Cacheable(value = "dish_list", key = "#categoryId + ':' + #status")public List<DishDto> getDishList(Long categoryId, int status) {System.out.println("查询数据库...");return dishMapper.findDishesByCategory(categoryId, status);}
}

解释:

  • value = "dish_list" → 缓存的名称(类似 Redis key)。
  • key = "#categoryId + ':' + #status" → 缓存的键

注意:

  • 默认不缓存 null 值,如果数据库查询结果是 null,下次仍然会查询数据库。
  • 默认缓存不会过期,需要手动配置 TTL 机制(如果底层存储是 Redis,可以设置过期时间)。
@CachePut(更新缓存):

@CachePut 不会查询缓存,它的作用是更新缓存.

@CachePut(value = "dish_list", key = "#dto.categoryId + ':1'")
public DishDto updateDish(DishDto dto) {dishMapper.updateDish(dto);return dto;  // 返回值会存入缓存
}

区别 @Cacheable@CachePut

  • @Cacheable 先查询缓存,如果缓存存在,直接返回,不执行方法。
  • @CachePut 一定会执行方法,然后更新缓存数据。
@CacheEvict(删除缓存):
@CacheEvict(value = "dish_list", key = "#dto.categoryId + ':1'")
public void deleteDish(DishDto dto) {dishMapper.deleteDish(dto.getId());
}

清除所有缓存:

@CacheEvict(value = "dish_list", allEntries = true)
public void clearCache() {System.out.println("清空缓存");
}
  • allEntries = true → 清空 dish_list 里的所有缓存
Spring Cache 整合 Redis
  • 引入 Redis 依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 配置 Redis:
# Redis 服务器地址
spring.redis.host=localhost
spring.redis.port=6379
spring.cache.type=redis
  • 使用 Spring Cache:
@Cacheable(value = "dish_list", key = "#categoryId + ':' + #status")
public List<DishDto> getDishList(Long categoryId, int status) {return dishMapper.findDishesByCategory(categoryId, status);
}
  • 设置缓存过期时间(TTL):

    如果使用 Redis,在 application.yml 设置 TTL:

spring:cache:redis:time-to-live: 3600000  # 设置缓存 1 小时过期(单位:毫秒)
MySQL主从复制:
  • 主库(Master)处理 INSERTUPDATEDELETE(写操作)。
  • 从库(Slave)处理 SELECT(读操作),分担查询压力,提高并发能力。

主从复制的过程:

主库生成 binlog(Binary Log): 主库的所有数据变更操作都会记录到 binlog(二进制日志)。

从库复制 binlog(Relay Log 复制): 从库会通过 I/O 线程,从主库拉取 binlog 并存储到本地的 Relay Log(中继日志)**。

从库回放 Relay Log,更新数据 : 从库的 SQL 线程读取 Relay Log,并执行 SQL 语句,使从库的数据与主库保持一致。

Nginx
目录结构:
  • conf/nginx.conf : 配置文件
  • html : 存放静态文件(html,css,js)
  • logs : 存放日志文件
  • sbin/nginx : 二进制文件,用于启动,停止nginx服务
在linux中配置nginx环境变量后,Nginx 可用的命令:
命令作用
nginx -v查看 Nginx 版本
nginx -t检查 Nginx 配置是否正确
nginx启动 Nginx
nginx -s stop停止 Nginx
nginx -s reload重新加载 Nginx 配置
nginx -s quit优雅关闭 Nginx(处理完当前请求后退出)
Nginx 配置文件结构介绍

整体分为三部分:

  • 全局块:和 Nginx 运行相关的全局配置
  • events 块:和网络连接相关的配置
  • http 块:代理、缓存、日志记录、虚拟主机配置
    • http 全局块
    • Server 块
      • Server 全局块
      • location 块

注意:http 块中可以配置多个 Server,每个 Server 块中可以配置多个 location 块。

配置示例:

worker_processes 1;events {worker_connections 1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile      on;keepalive_timeout 65;server {listen       80;server_name  localhost;location / {root   html;index  index.html index.htm;}}
}
Nginx部署静态资源:

Nginx 可以作为静态 Web 服务器来部署静态资源。

相较于 Tomcat,Nginx 处理静态资源的能力更强,在生产环境下,一般都会将静态资源部署到 Nginx。
部署方式 : 只需要将文件复制到 Nginx 安装目录下的 html 目录中即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90773.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RoPE:相对位置编码的旋转革命——原理、演进与大模型应用全景

“以复数旋转解锁位置关系的本质表达&#xff0c;让Transformer突破长度藩篱” 旋转位置编码&#xff08;Rotary Position Embedding, RoPE&#xff09; 是由 Jianlin Su 等研究者 于2021年提出的突破性位置编码方法&#xff0c;通过复数空间中的旋转操作将相对位置信息融入Tra…

震网(Stuxnet):打开潘多拉魔盒的数字幽灵

在科技飞速发展的今天&#xff0c;代码和数据似乎只存在于无形的数字世界。但如果我告诉大家&#xff0c;一段代码曾悄无声息地潜入一座受到严密物理隔离的核工厂&#xff0c;并成功摧毁了其中的物理设备&#xff0c;大家是否会感到一丝寒意&#xff1f;这不是科幻电影的情节&a…

一文读懂:到底什么是 “具身智能” ?

今天咱们来好好聊聊一个最近很火的一个技术话题——具身智能&#xff01; 这个词听起来是不是有点难懂&#xff1f;其实我们可以简单理解为&#xff1a;具身智能是具有身体的人工智能体。这样是不是会容易理解一些&#xff1f; 具身智能&#xff08;Embodied Intelligence&…

企业级区块链平台Hyperchain核心原理剖析

Hyperchain作为国产自主可控的企业级联盟区块链平台&#xff0c;其核心原理围绕高性能共识、隐私保护、智能合约引擎及可扩展架构展开&#xff0c;通过多模块协同实现企业级区块链网络的高效部署与安全运行。 以下从核心架构、关键技术、性能优化、安全机制、应用场景五个维度展…

论文阅读-RaftStereo

文章目录1 概述2 模块说明2.1 特征抽取器2.2 相关金字塔2.3 多级更新算子2.4 Slow-Fast GRU2.5 监督3 效果1 概述 在双目立体匹配中&#xff0c;基于迭代的模型是一种比较主流的方法&#xff0c;而其鼻祖就是本文要讲的RaftStereo。 先来说下什么是双目立体匹配。给定极线矫正…

内存优化:从堆分配到零拷贝的终极重构

引言 在现代高性能软件开发中&#xff0c;内存管理往往是性能优化的关键战场。频繁的堆内存分配(new/delete)不仅会导致性能下降&#xff0c;还会引发内存碎片化问题&#xff0c;严重影响系统稳定性。本文将深入剖析高频调用模块中堆分配泛滥导致的性能塌方问题&#xff0c;并…

【GoLang#2】:基础入门(工具链 | 基础语法 | 内置函数)

前言&#xff1a;Go 的一些必备知识 1. Go 语言命名 Go的函数、变量、常量、自定义类型、包(package)的命名方式遵循以下规则&#xff1a; 首字符可以是任意的Unicode字符或者下划线剩余字符可以是Unicode字符、下划线、数字字符长度不限 Go 语言代码风格及开发事项代码每一行结…

Bert项目--新闻标题文本分类

目录 技术细节 1、下载模型 2、config文件 3、BERT 文本分类数据预处理流程 4、对输入文本进行分类 5、计算模型的分类性能指标 6、模型训练 7、基于BERT的文本分类预测接口 问题总结 技术细节 1、下载模型 文件名称--a0_download_model.py 使用 ModelScope 库从模型仓…

sendfile系统调用及示例

好的&#xff0c;我们继续学习 Linux 系统编程中的重要函数。这次我们介绍 sendfile 函数&#xff0c;它是一个高效的系统调用&#xff0c;用于在两个文件描述符之间直接传输数据&#xff0c;通常用于将文件内容发送到网络套接字&#xff0c;而无需将数据从内核空间复制到用户空…

数据结构习题--删除排序数组中的重复项

数据结构习题–删除排序数组中的重复项 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 方法&…

Docker的容器设置随Docker的启动而启动

原因也比较简单&#xff0c;在docker run 的时候没有设置–restartalways参数。 容器启动时&#xff0c;需要增加参数 –restartalways no - 容器退出时&#xff0c;不重启容器&#xff1b; on-failure - 只有在非0状态退出时才从新启动容器&#xff1b; always - 无论退出状态…

JWT安全机制与最佳实践详解

JWT&#xff08;JSON Web Token&#xff09; 是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间安全地传输信息作为紧凑且自包含的 JSON 对象。它被广泛用于身份验证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff…

如何解决pip安装报错ModuleNotFoundError: No module named ‘ipython’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘ipython’问题 摘要 在开发过程中&#xff0c;我们常常会遇到pip install报错的问题&#xff0c;其中一个常见的报错是 ModuleNotFoundError: No module named…

从三维Coulomb势到二维对数势的下降法推导

题目 问题 7. 应用 9.1.4 小节描述的下降法&#xff0c;但针对二维的拉普拉斯方程&#xff0c;并从三维的 Coulomb 势出发 KaTeX parse error: Invalid delimiter: {"type":"ordgroup","mode":"math","loc":{"lexer&qu…

直播一体机技术方案解析:基于RK3588S的硬件架构特性​

硬件配置​​主控平台​​▸ 搭载瑞芯微RK3588S旗舰处理器&#xff08;四核A762.4GHz 四核A55&#xff09;▸ 集成ARM Mali-G610 MP4 GPU 6TOPS算力NPU▸ 双通道LPDDR5内存 UFS3.1存储组合​​专用加速单元​​→ 板载视频采集模块&#xff1a;支持4K60fps HDMI环出采集→ 集…

【氮化镓】GaN取代GaAs作为空间激光无线能量传输光伏转换器材料

2025年7月1日,西班牙圣地亚哥-德孔波斯特拉大学的Javier F. Lozano等人在《Optics and Laser Technology》期刊发表了题为《Gallium nitride: a strong candidate to replace GaAs as base material for optical photovoltaic converters in space exploration》的文章,基于T…

直播美颜SDK动态贴纸模块开发指南:从人脸关键点识别到3D贴合

很多美颜技术开发者好奇&#xff0c;如何在直播美颜SDK中实现一个高质量的动态贴纸模块&#xff1f;这不是简单地“贴图贴脸”&#xff0c;而是一个融合人脸关键点识别、实时渲染、贴纸驱动逻辑、3D骨骼动画与跨平台性能优化的系统工程。今天&#xff0c;就让我们从底层技术出发…

学习游戏制作记录(剑投掷技能)7.26

1.实现瞄准状态和接剑状态准备好瞄准动画&#xff0c;投掷动画和接剑动画&#xff0c;并设置参数AimSword和CatchSword投掷动画在瞄准动画后&#xff0c;瞄准结束后才能投掷创建PlayerAimSwordState脚本和PlayerCatchSwordState脚本并在Player中初始化&#xff1a;PlayerAimSwo…

【c++】问答系统代码改进解析:新增日志系统提升可维护性——关于我用AI编写了一个聊天机器人……(14)

在软件开发中&#xff0c;代码的迭代优化往往从提升可维护性、可追踪性入手。本文将详细解析新增的日志系统改进&#xff0c;以及这些改进如何提升系统的实用性和可调试性。一、代码整体背景代码实现了一个基于 TF-IDF 算法的问答系统&#xff0c;核心功能包括&#xff1a;加载…

visual studio2022编译unreal engine5.4.4源码

UE5系列文章目录 文章目录 UE5系列文章目录 前言 一、ue5官网 二.编译源码中遇到的问题 前言 一、ue5官网 UE5官网 UE5源码下载地址 这样虽然下载比较快,但是不能进行代码git管理,以后如何虚幻官方有大的版本变动需要重新下载源码,所以我们还是最好需要visual studio2022…