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

苍穹外卖——DAY3

核心知识点:

知识点1:公共字段自动填充

自定义注解本质上是一种特殊的接口,通过固定语法声明,核心包括:元注解(控制注解的行为) + 注解属性(存储注解的配置信息)


/*** 自定义注解,用于表示某个方法需要进行功能字段自动填充*//*** 指定注解只能加在的位置*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
//用@interface声明这是一个注解
public @interface AutoFill {//指定数据库操作类型:UPDATE INSERT//因为这个公共字段只有在UPDATE INSERT才会使用OperationType value();//注解的属性:格式为[返回值类型 属性名();],这里的value是默认属性
}
元注解 你的配置 作用
@Target ElementType.METHOD 限定@AutoFill只能标注在方法上(不止)
@Retention RetentionPolicy.RUNTIME 注解保留到运行时(核心!只有运行时保留,后续切面才能通过反射读取注解信息)

3. 注解属性:存储业务配置

OperationType value(); 是注解的核心属性,作用是:
1.接受 update/insert 的枚举值,标记当前对应方法的数据库的操作类型
2.通过这个属性告诉切面 “该执行哪种填充逻辑:只有 INSERT/UPDATE 时需要填充公共字段
 
4.自定义注解@AutoFill的工作原理
注解本身是一个标记,没有任何执行逻辑,需要配合注解处理器AutoFillAspect才能实现“自动填充字段”的功能

 第一步:注解的 “标记” 作用

需要自动填充字段的方法上添加@AutoFill(OperationType.INSERT)@AutoFill(OperationType.UPDATE)
// 示例:给新增方法打标签,标记需要执行INSERT类型的字段填充
@AutoFill(OperationType.INSERT)
public void insertUser(User user) {// 原本只有插入逻辑,无字段填充
}

第二步:切面的 “解析 + 执行” 作用

AutoFillAspect是注解的 “处理器”,通过AOP(面向切面编程) 技术实现核心逻辑:
  • 第一步:通过@Pointcut定义 “切点”,匹配所有带有@AutoFill注解的方法;
  • 第二步:通过@Before/@Around等通知,在方法执行前拦截;
  • 第三步:反射读取方法上的@AutoFill注解,获取value(INSERT/UPDATE);
  • 第四步:根据操作类型,自动填充对应的公共字段(如 INSERT 填充createTime/createUser,UPDATE 填充updateTime/updateUser);
  • 第五步:执行原方法,完成数据库操作。

 

知识点2:新增菜品的开发

//开发逻辑:
//通过查看接口文档,了解接口和传参
//controller层
@PostMapping
@ApiOperation("新增菜品")
public Result<String> save(@RequestBody DishDTO dishDTO,DishFlavor dishFlavor){log.info("新增菜品:{}", dishDTO);dishService.saveWithFlavor(dishDTO);return Result.success();}
//接受参数,调用service层
//service层 (实现逻辑)
public void saveWithFlavor(DishDTO dishDTO) {Dish dish = new Dish();//属性拷贝BeanUtils.copyProperties(dishDTO , dish);//分类状态默认为禁用状态0dish.setStatus(StatusConstant.DISABLE);dishMapper.insert(dish);//获取insert语句生成的主键值Long dishId = dish.getId();
//        插入口味List<DishFlavor> flavors = dishDTO.getFlavors();/*** 如何对口味进行处理:* 因为口味存储在一个列表里面,所以从列表中取出* 判断是否为空,size大于0(说明确实提交过来了)*/if(flavors !=null && flavors.size()>0){flavors.forEach(dishFlavor -> {dishFlavor.setDishId(dishId);});dishFlavorMapper.insertBatch(flavors);}}
//Mapper层实现
<insert id="insertBatch">insert into dish_flavor(name, dish_id, value)VALUES<foreach collection="flavors" item="df" separator=",">(#{df.name}, #{df.dishId}, #{df.value})</foreach></insert>

 

属性 含义
collection 指定要遍历的集合参数名:必须和 Mapper 接口方法中传入的集合参数名一致(比如接口方法是insertBatch(List<DishFlavor> flavors),这里就写flavors;如果参数加了@Param注解,比如@Param("flavors") List<DishFlavor> flavors,也要对应写flavors);
item 遍历集合时,给当前元素起的别名:比如遍历flavors集合时,每拿到一个DishFlavor(口味对象),就用df代表它,后续可以通过df.属性名获取对象的属性值;
separator 指定每个循环生成的 SQL 片段之间的分隔符:批量插入时,VALUES后每个括号(())之间需要用逗号分隔,所以这里设为,,保证 SQL 语法正确;

 

http://www.zskr.cn/news/159569.html

相关文章:

  • 嚯,拼多多也开奖了
  • OpenAI ChatGPT功能大升级,NVIDIA斯坦福开源游戏AI,通义千问Qwen Code生态扩展,中国AI产业突破万亿大关
  • 【课程设计/毕业设计】基于springboot的课程互助学习系统 “课程答疑、资源共享、组队学习” 一体化平台【附源码、数据库、万字文档】
  • Stream是怎么运行的?
  • 虚拟机操作系统选择指南(2025)
  • 【计算机毕业设计案例】基于Java+SpringBoot的网上宠物店管理系统基于Java的网上宠物店管理系统(程序+文档+讲解+定制)
  • 一文讲清楚DOM动态观察器MutationObserver的原理和使用场景
  • 意识、物理规律与宿命论
  • AI提示系统的商业模式的用户分层:提示工程架构师的3个方法
  • ‌测试代码覆盖率:Jacoco配置详解
  • 【课程设计/毕业设计】基于Java的网上宠物店管理系统基于java的宠物用品店系统【附源码、数据库、万字文档】
  • FreeSwtich 闲杂笔记
  • 【计算机毕业设计案例】基于springboot的课程互助学习系统“资源共享 - 协作学习 - 互助答疑(程序+文档+讲解+定制)
  • 【开题答辩全过程】以 共享单车管理系统为例,包含答辩的问题和答案
  • 鸿蒙开发入门:从环境搭建到第一个ArkTS应用,30分钟上手
  • SpringBoot Maven 项目 pom 中的 plugin 插件用法整理 - 教程
  • 英伟达圣诞偷袭,200亿美元收购Groq
  • 汇川H5U结构体编程项目:程序完整,功能块未加密
  • 如何构建一个模型,将企业特定的知识集可视化展示,并可以据此引导用户进行有针对性的提问?
  • 放弃 HarmonyOS 7?OpenHarmony 6.1 LTS 版本适配指南(含老机型兼容技巧)
  • 如何复现论文中的大模型方法并解决实际问题
  • 基于微信小程序的维修服务平台的设计与实现
  • 2025最新!8个AI论文工具测评:本科生写论文还能这么快?
  • 图解23种设计模式应用场景 - 智慧园区
  • 完整教程:bluecms代码审计
  • 以茶叶取小名,萌到想贴贴[特殊字符]
  • 记录一下自己不会的单词,我一定会整明白你们的
  • cs50-linked list笔记
  • OpenAI 格式 API 通用接入说明(含 Cherry Studio 配置教程)
  • 学长亲荐8个AI论文工具,研究生搞定毕业论文+格式规范!