当前位置: 首页 > news >正文

瑞吉外卖学习笔记

@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.dtcms.com/a/299505.html

相关文章:

  • 基于FPGA的SPI控制FLASH读写
  • 【C++高效编程】STL queue深度剖析:从底层原理到高级应用
  • 什么是ICMP报文?有什么用?
  • 以实时语音转文字项目为例,介绍一下如何手动部署python应用到Linux服务器(附脚本)
  • 根据ip获取地址库
  • 【Git】Git下载全攻略:从入门到精通
  • 如何在 Git 中控制某些文件不被提交?
  • 图解网络-小林coding笔记(持续更新)
  • 【2025最新】浏览器插件开发选型建议:WXT、Plasmo、原生TS/JS
  • 融合为体,AI为用:数据库在智能时代的破局之道
  • Maven之依赖管理
  • 《Java 程序设计》第 6 章 - 字符串
  • 智慧城市多目标追踪精度↑32%:陌讯动态融合算法实战解析
  • 【Canvas与旗帜】条纹版大明三辰旗
  • 神经网络中的反向传播原理:驱动智能的核心引擎
  • k8s:将打包好的 Kubernetes 集群镜像推送到Harbor私有镜像仓库
  • 电子电气架构 --- 高阶智能驾驶对E/E架构的新要求
  • Java操作Excel文档
  • Spring的深入浅出(6)--使用AOP的思想改造转账案例
  • 人形机器人指南(八)操作
  • 手动开发一个串口调试工具(二):Qt 串口类基本认识与使用
  • 基于 ThinkPHP 开发的垂直化网址导航
  • Linux进程地址空间:深入探索其结构与机制
  • 元宇宙新基建:重塑数字市场的“超大陆”边界
  • 【Android】内容提供器
  • 7️⃣ 递归函数
  • 【AcWing 835题解】滑动窗口
  • 数据结构 双向链表
  • greenhills编译出错问题
  • C++学习之深入学习模板(进阶)