@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 、@CacheEvict 的 value 指定 |
@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)处理
INSERT
、UPDATE
、DELETE
(写操作)。 - 从库(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
目录中即可。