蒼穹外賣項目 常用注解 + 動態sql

常用注解

常見的注解解析方法有兩種:

  • 編譯期直接掃描:編譯器在編譯 Java 代碼的時候掃描對應的注解并處理,比如某個方法使用@Override 注解,編譯器在編譯的時候就會檢測當前的方法是否重寫了父類對應的方法。
  • 運行期通過反射處理:像框架中自帶的注解(比如 Spring 框架的 @Value、@Component)都是通過反射來進行處理的

這個博客對常用注解講的很詳細且有例子 SpringBoot常用的50個注解

以下是根據蒼穹外賣來整理的注解和使用實例。
1.@ResponseBody
的作用其實是將java對象轉為json格式的數據,然后直接寫入HTTP response 的body中;
@RequestMapping后,返回值通常解析為跳轉路徑,但是加上 @ResponseBody 后返回結果不會被解析為跳轉路徑,而是直接寫入 HTTP response body 中。
2.@RestController=@ReponseBody+@Controller
在類上用@RestController,其內的所有方法都會默認加上@ResponseBody,也就是默認返回JSON格式。將控制器方法的返回值轉換為JSON格式,并以HTTP響應的方式返回給客戶端。
@RestController和@Controller的共同點是都用來表示Spring某個類是否可以接收HTTP請求,二者區別: @RestController無法返回指定頁面,而@Controller可以;前者可以直接返回數據,后者需要@ResponseBody輔助。

@RestController中指定Bean的名稱。

@RestController("adminShopController")//為了避免兩個Bean都叫shopController的沖突,所以用為了區分他倆
@RequestMapping("/admin/shop")
@Slf4j
@Api(tags = "店鋪相關接口")
public class ShopController {
}
@RestController("UserShopController")
@RequestMapping("/user/shop")
@Api(tags = "店鋪相關接口")
@Slf4j
public class ShopController {
}

3.@RequestBody作用在形參列表上,用于將前臺發送過來固定格式的數據【xml格式 或者 json等】封裝為對應的 JavaBean 對象,封裝時使用到的一個對象是系統默認配置的 HttpMessageConverter進行解析,然后封裝到形參上。
就是將JSON格式的數據封裝到實體類中
4.@Transactional是Spring框架中用于聲明式事務管理的關鍵注解。通過使用@Transactional注解,我們可以更加方便地管理事務,保障數據的一致性和可靠性。用于聲明式事務管理**,保證方法或類中的操作在同一個事務中執行**。
5.@RequestMapping映射請求URL和處理方法。跳轉路徑
6.@GetMapping用于映射HTTP GET請求。
7.@PostMapping用于映射HTTP POST請求。
8. @RequestParam用于獲取請求參數的值。

@DeleteMapping
@ApiOperation("菜品批量刪除")
public Result delete(@RequestParam List<Long> ids){//注解@RequestParam,可以將地址欄中多個數字參數提取出來然后變成List集合。 log.info("菜品批量刪除:{}",ids);dishService.deleteBatch(ids);return Result.success();
}

在這里插入圖片描述
9. @ConfigurationProperties注解代表當前類是一個配置屬性類,作用是:封裝配置文件中的一些配置項。
原理就是:通過配置屬性類,將配置文件中的配置項,封裝成一個類,然后通過@Autowired注解注入到要使用的地方。
10.取的是路徑參數,加注解@PathVariable,如果和路徑參數不同名,就要加括號雙引號指明取的是哪個路徑參數@PathVariable("status") ;如果同名,就不用加。

	@PostMapping("/status/{status}")@ApiOperation("啟用禁用員工賬號")public Result startOrStop(@PathVariable Integer status,Long id){log.info("啟用禁用員工賬號:{},{}",status,id);employeeService.startOrStop(status,id);return Result.success();
}
  1. AOP相關注解
    切入點@Pointcut里面寫的是對哪些方法進行攔截,要滿足2點:
    ①必須是mapper下的所有類的方法,
    ②還要有AutoFill這個注解。
    在對切面的定義中共使用@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")這里指定使用的包范圍和在有注解標注的方法上。

mapper中使用的示例:

@AutoFill(OperationType.UPDATE)
void update(Employee employee);

(1)創建自定義注解
annotation.AutoFill.java 注解類
@Target(ElementType.METHOD)//指定注解只能加載方法上,@Retention(RetentionPolicy.RUNTIME)運行時
Target注解指定加上什么上面,Retention注解指定什么時候用,

@Target(ElementType.METHOD)//指定注解只能加載方法上
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {//通過枚舉-指定當前屬性OperationType//數據庫操作類型OperationType:就兩種 Update 和 InsertOperationType value();
}

(2)切面類 aspect.AutoFillAspect.java 自動填充的切片類

@Aspect
@Component
@Slf4j
public class AutoFillAspect {//這個包里的類和方法和加上@AutoFill注解的@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointCut() {}//前置通知,在sql執行前加上即(公共字段賦值)@Before("autoFillPointCut()")//當匹配上切點表達式的執行這個public void autoFill(JoinPoint joinPoint) {//插入鏈接點的參數值//1.獲取到當前被欄截的方法上的數據庫操作類型//2.獲取到當前被攔截的方法的參數--實體對象//3.準備賦值的數據//4.根據當前不同的操作類型,為對應的屬性通過反射來賦值}
}

12.Swagger使用注解
在這里插入圖片描述
@Api(tags = “員工相關接口”)

@RestController
@RequestMapping("/admin/employee")
@Slf4j
@Api(tags = "員工相關接口")//tags用來描述類的作用
public class EmployeeController {

@ApiOperation(“員工登錄”)

	@PostMapping("/login")@ApiOperation("員工登錄")public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {

@ApiModel(description = “員工登錄時傳遞的數據模型”)
@ApiModelProperty(“用戶名”)

@Data
@ApiModel(description = "員工登錄時傳遞的數據模型")
public class EmployeeLoginDTO implements Serializable {@ApiModelProperty("用戶名")private String username;@ApiModelProperty("密碼")private String password;}

13.@Bean //項目啟動時就會調用方法創建對象
@ConditionalOnMissingBean//保證Spring容器里只有一個Util對象,條件對象當沒Bean時再創建
注意要return的是這個新創建的對象,不然后面自動注入會失敗,這里的主要目的就是創建Bean對象

@Bean //項目啟動時就會調用方法創建對象@ConditionalOnMissingBean//保證Spring容器里只有一個Util對象,條件對象當沒Bean時再創建public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}

因為涉及到多個表,所以添加@Transactional的注解
(需要在啟動類上添加@EnableTransactionManagement注解):開啟注解方式的事務管理

@Transactional//涉及幾多個數據表,需要保證數據一致性,需要事務注解--保證原子性,全成功或全失敗
@Override
public void saveWithFlavor(DishDTO dishDTO) {
//開始新增菜品
}

15.Spring Cache框架,實現了基于注解的緩存功能。
在這里插入圖片描述
都是在Controller層:
(1)@CachePut這個注釋將方法的返回結果,user對象保存到Redis中,同時生成動態的key,userCache::user.id

@CachePut(cacheNames="userCache",key="abs")//Spring Cache緩存數據,key的生成:userCache:abc
@CachePut(cacheNames="userCache",key="#user.id")//與形參保持一致,或者
@CachePut(cacheNames="userCache",key="#result.id")//返回值result,或者
@CachePut(cacheNames="userCache",key="#p0.id")//獲得當前方法的第一個參數user,或者
@CachePut(cacheNames="userCache",key="#a0.id")//獲得當前方法的第一個參數user,或者
@CachePut(cacheNames="userCache",key="#root.args[0].id")//獲得當前方法的第一個參數user
public User save(@RequestBody User user){userMapper.insert(user);return result;
}

插入完數據后,數據庫生成的主鍵值會自動賦給user對象
Redis可以形成樹形結構

(2)@Cacheable注解

@Cacheable(cahceNames="userCache"),key="#id")//key的生成,userCache::10
public User getById(Long id){User user = userMapper.getById(id);return user;
}

(3)@CacheEvict一次清理一條數據

@CacheEvict(cahceNames="userCache"),key="#id")//key的生成,userCache::10
public void deleteById(Long id){userMapper.deleteById(id);
}

清除所有數據

@CacheEvict(cahceNames="userCache"),allEntries=true)//userCache下的所有鍵值對
public void deleteAlld(){userMapper.deleteAll();
}

動態sql

insert 返回生成的主鍵值

<insert id="insert" useGeneratedKeys="true" keyProperty="id"><!-- 產生的主鍵值會賦給id屬性-->insert into dish (name, category_id, price, image, description, create_time, update_time, create_user, update_user, status)values (#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}, #{status})</insert>

mapper:
不用注解,動態sql使用映射文件
在resource文件夾里都是xml文件

select

<select>標簽的id是mapper中的對應方法名,resultType是返回的參數類型。

<select id="selectByPage" resultType="com.sky.entity.Employee">select * from employee<where><if test="name!=null and name !='' ">and name like concat('%',#{name},'%') <!--模糊查詢 like --></if></where>order by create_time desc <!--創建時間降序-->
</select>

稍復雜一點的select

動態sql
sql語句:左外鏈接:將左邊的表的所有項與右邊的表作連接
將菜和種類兩個表按照種類id鏈接起來,以此獲得種類名稱

select d.*,c.name as categoryName from dish d left outer join category c on d.category_id=c.id

由于種類名稱查出來也叫name,所以給字段起別名

<select id="pageQuery" resultType="com.sky.vo.DishVO">select d.*,c.name categoryName from dish d left join category c on d.category_id = c.id<where><!--畢竟動態sql。給它用where動態拼上DTO的3個屬性 --><if test="categoryId! =null">d.category_id=#{categoryId}</if><if test="status!=null">d.status=#{status}</if><if test="name!=null">d.name like concat('%',#{name},'%')</if></where>order by d.create_time desc<!--根據創建時間降序 --></select>

delete

(1)sql
按照菜id查全部信息,以此得到是否在售賣

@Select("select * from dish where id=#{id}")Dish getById(Long id);

(2)sql
是否有套餐關聯
// select setmeal id from setmeal dish where dish_id in (1,2,3,4)
List queryUnsale(List ids);傳入菜品List列表,用動態sql查每個菜品是否有套餐
SetMealDishMapper.xml

<select id="getSetmealIdsByDishIds" resultType="java.lang.Long">select setmeal_id from setmeal_dish where dish_id in<foreach collection="dishIds" separator="," item="id" open="(" close=")">#{id}</foreach></select>

foreach循環,collection是集合,item是一個個項,separator是分割符號,open是開始符號,close是結束符號。每個元素用逗號分割,然后用大括號括起來。
(3)刪除菜—傳入為列表

<delete id="deleteBatch">delete from dish where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>

(4)刪除口味—傳入為列表

<delete id="deleteBatchByDishIds">delete from dish_flavor where dish_id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach></delete>

update

<update id="update">update dish<set><if test="name!=null">name=#{name},</if><if test="categoryId!=null">category_id=#{categoryId},</if><if test="price!=null">price=#{price},</if><if test="image!=null">image=#{image},</if><if test="description!=null">description=#{description},</if><if test="status!=null">status=#{status},</if><if test="updateTime!=null">update_time=#{updateTime},</if><if test="updateUser!=null">update_user=#{updateUser},</if></set>where id=#{id}</update>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39277.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SAP_ABAP相關日語單詞

基本概念 1. プログラミング言語 (プログラミングげんご, Puroguramingu gengo) - 編程語言 2. 開発 (かいはつ, Kaihatsu) - 開發 3. システム (システム, Shisutemu) - 系統 4. モジュール (モジュール, Mojūru) - 模塊 5. トランザクションコード (トランザクションコード,…

探索旅游卡項目的八大黃金賽道,你離月入十幾萬僅一步之遙!

作為旅游卡項目的推廣精英&#xff0c;我深知在這個充滿機遇與挑戰的時代&#xff0c;選擇正確的賽道至關重要。今天&#xff0c;我將從定位、內容、產品、流量、變現這五個核心維度出發&#xff0c;為你揭秘旅游卡項目的八大熱門方向。如果你正對旅游充滿熱情&#xff0c;或擁…

【基于R語言群體遺傳學】-3-計算等位基因頻率

書接上文&#xff0c;我們講完了哈代溫伯格基因型頻率&#xff0c;也使用數據進行了擬合&#xff0c;那么接下來就是考慮一些計算的問題&#xff1a; 【基于R語言群體遺傳學】-1-哈代溫伯格基因型比例-CSDN博客 【基于R語言群體遺傳學】-2-模擬基因型&#xff08;simulating …

【leetcode--最小棧】

設計一個支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常數時間內檢索到最小元素的棧。 實現 MinStack 類: MinStack() 初始化堆棧對象。void push(int val) 將元素val推入堆棧。void pop() 刪除堆棧頂部的元素。int top() 獲取堆棧頂部的元素。int get…

TextInput是用于在用戶界面中輸入文本的控件,通常應用于表單、搜索框等需要用戶輸入文字的場景

TextInput是用于在用戶界面中輸入文本的控件&#xff0c;通常應用于表單、搜索框等需要用戶輸入文字的場景。以下是對TextInput的詳細解釋&#xff0c;涵蓋其各個方面的功能和屬性。 基本屬性 text 描述&#xff1a;TextInput中當前顯示的文本。用法&#xff1a;text: "示…

WebKey備受矚目的Web3.0新敘事,硬件與加密生態完美融合特性成為數字世界的新入口

在當今迅速發展的科技領域&#xff0c;Web3.0正在引領一場顛覆性的變革。而作為這一變革的先鋒&#xff0c;WebKey無疑是備受矚目的創新項目。它不僅代表了一種全新的技術趨勢&#xff0c;更是數字世界中硬件與加密生態完美融合的典范。 硬件與加密生態的完美融合 WebKey的核心…

Java基礎面試題(簡單版):

1.java的8個基本數據類型? 整型: byte(占用1個字節) short(占用2個字節) int(占用4個字節) long(占用8個字節) 浮點型: float(占用4個字節)、double(占用8個字節) 字符型: char 布爾型: boolean 2.ArrayList和LinkedList的區別? 可以說ArrayList和LinkedList除了是同屬于集合…

【QT】輸入類控件

目錄 Line Edit 核心屬性 核心信號 正則表達式 示例&#xff1a;使用正則表達式驗證輸入框內容 示例&#xff1a;切換輸入框密碼模式下的顯示狀態 Text Edit 核心屬性 核心信號 示例&#xff1a;獲取多行輸入框的內容同步顯示到label 示例&#xff1a;獲取文本的選…

三生隨記——眉筆詭事

在一個被遺忘的古鎮上&#xff0c;流傳著一個關于眉筆的詭異傳說。這個古鎮坐落在群山的環抱中&#xff0c;鮮少有人知曉它的存在。而在這片土地上&#xff0c;卻有著一件被視為詛咒之源的眉筆。 眉筆的來歷無人知曉&#xff0c;只知它在一夜之間出現在鎮上的古董店中。那支眉筆…

一文講懂npm link

前言 在本地開發npm模塊的時候&#xff0c;我們可以使用npm link命令&#xff0c;將npm 模塊鏈接到對應的運行項目中去&#xff0c;方便地對模塊進行調試和測試 用法 包鏈接是一個兩步過程&#xff1a; 1.為依賴項創建全局軟鏈npm link。一個符號鏈接&#xff0c;簡稱軟鏈&a…

0702_ARM5

練習&#xff1a;使用usart4 main.c #include "uart4.h"int main() {// 初始化 UART4hal_uart4_init();while (1) {// 發送一個字符串//hal_put_char( hal_get_char());hal_put_string(hal_get_string());}return 0; } usart4.c #include "uart4.h"//**…

c# 操作mysql的幫助類

MySqlHelper 的靜態類&#xff0c;其中包含了一些用于執行 MySQL 數據庫操作的方法。這些方法包括執行存儲過程、插入、更新、刪除操作以及執行數據庫事務查詢操作等。 該類中的方法主要有&#xff1a; ExecuteNonQuery 方法&#xff1a;用于執行存儲過程、插入、更新、刪除操…

如何降低布隆過濾器的誤判率

降低布隆過濾器的誤判率&#xff08;也稱為假陽性率&#xff09;是布隆過濾器應用中一個關鍵的問題。誤判率主要來源于哈希碰撞&#xff0c;即不同的元素可能被哈希到相同的位置。為了降低誤判率&#xff0c;可以從以下幾個方面進行優化&#xff1a; 1. 增加哈希函數的個數 原…

Asp.net Core 反射加載dll

定義一個類庫&#xff0c;定義接口 namespace Plugin {public interface IPlugin{void EllisTest();} }定義另外一個類庫&#xff0c;引用上面的類庫&#xff0c;實現接口 using Plugin;namespace UserCustom {public class Custom : IPlugin{public void EllisTest(){Conso…

二刷力扣——DP算法(子序列問題)

300. 最長遞增子序列 定義是以本元素結尾&#xff0c;所以公式初始化都好弄。但是太慢 class Solution {public int lengthOfLIS(int[] nums) {int nnums.length;int[] dp new int[n];//以自己結尾的最長遞增子序列dp[0]1;int maxzi1;for(int i1;i<n;i){dp[i]1;for(int j…

QT中QDomDocument讀寫XML文件

一、XML文件 <?xml version"1.0" encoding"UTF-8"?> <Begin><Type name"zhangsan"><sex>boy</sex><school>Chengdu</school><age>18</age><special>handsome</special>&l…

【YOLOv5進階】——引入注意力機制-以SE為例

聲明&#xff1a;筆記是做項目時根據B站博主視頻學習時自己編寫&#xff0c;請勿隨意轉載&#xff01; 一、站在巨人的肩膀上 SE模塊即Squeeze-and-Excitation 模塊&#xff0c;這是一種常用于卷積神經網絡中的注意力機制&#xff01;&#xff01; 借鑒代碼的代碼鏈接如下&a…

在C#中使用RabbitMQ做個簡單的發送郵件小項目 _

前言 好久沒有做項目了&#xff0c;這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作&#xff0c;之前在我的個人博客里面回復評論和友鏈申請是會通過發送郵件來通知對方的&#xff0c;不過當時只是簡單的進行了異步操作。那么這次來使用RabbitMQ去統一發送郵件&#x…

vue中路由來回切換頁面直接卡死

今天發現一個很嚴重的問題&#xff0c;項目好不容易做好了&#xff0c;結果頁面多了&#xff0c;切換之后卡死。頁面所有的交互效果都失效了。 排查了許久的錯誤原因最后發現原來是路由名稱重復了。 如上圖當頁面跳轉到riskdetails詳細頁面之后&#xff0c;框架則被這個詳情頁…

隨機森林R語言預測工具

隨機森林&#xff08;Random Forest&#xff09;是一種基于決策樹的集成學習方法&#xff0c;它通過構建多個決策樹并集成它們的預測結果來提高預測的準確性。在R語言中&#xff0c;我們可以使用randomForest包來構建和訓練隨機森林模型。以下是對隨機森林的詳細介紹以及使用R語…