@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
目錄中即可。