苍穹外卖--课堂笔记
Sky-take-out 苍穹外卖笔记
项目难点:文件上传(阿里云OSS)
公共字段自动填充(切面类实现)
9月6日
第三天第6个视频
上传文件功能遇到的卡顿与不熟练
①上传文件,使用Spring MVC框架中的MultipartFile类型参数来接收
file.getOriginalFilename();获取原始文件名。示例:
@PostMapping("/upload")
@ApiOperation(value = "文件上传")
public Result<String> upload(MultipartFile file) {
log.info("文件上传,接收文件:{}", file);
//获取原始文件名
String originalFilename = file.getOriginalFilename();
②@ConditionalOnMissingBean 条件创建
当没有这个bean对象的时候,才创建对象,一般用于工具类,因为工具类只用创建一个就好了。
Bean注解一般用在方法上,将该方法的返回值作为Bean交给Spring IOC容器管理
示例:
@Configuration
@Slf4j
public class AliOssConfiguration {
@Bean
@ConditionalOnMissingBean
public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {
log.info("开始创建阿里云文件上传工具类:{}", aliOssProperties);
return new AliOssUtil(aliOssProperties.getEndpoint(),
aliOssProperties.getAccessKeyId(),
aliOssProperties.getAccessKeySecret(),
aliOssProperties.getBucketName());
}
}
实现新增菜品功能遇到的卡顿与不熟练
①将@Transactional写在了Controller层,一般事务用在Service层也就是业务层
②@Transactional今日使用场景:新增菜品时,有需要新增口味,同时给两张表插入数据时,需要开启事务。
并且需要开启 开启注解方式的事务管理,如:
@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
public class SkyApplication {
public static void main(String[] args) {
SpringApplication.run(SkyApplication.class, args);
log.info("server started");
}
}
③通常,Controller层用实体对应的DTO接受前端发送的json格式的数据,但是Mapper层实际操作数据库的到时候,一般用实体类。将DTO属性值传递给实体类可以用BeanUtils,如:将DishDTO传递给DTO
public void saveWithFlavor(DishDTO dishDTO) {
Dish dish = new Dish();
//属性传递
BeanUtils.copyProperties(dishDTO, dish);
④在mapper.xml文件中写insert语句时,values后面填写的是实体类的属性名称,用驼峰命名格式,values前面填写的是,数据库中列名一般采用下划线分割,如:
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into dish
(name, category_id, create_time)
values (#{name}, #{categoryId}, #{createTime})
</insert>
⑤添加菜品以后,想要获取菜品的主键ID如何操作?
useGeneratedKeys="true" keyProperty="id"
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into dish
(name, category_id, create_time)
values (#{name}, #{categoryId}, #{createTime})
</insert>
然后在Service层调用get方法得到ID
Long id = dish.getId();
⑥判断集合是否为空用null和size,如:
List<DishFlavor> flavors = dishDTO.getFlavors();
if (flavors != null && flavors.size() > 0)
⑦forEach与lombda表达式一起使用,常用于集合遍历,如:
if (flavors != null && flavors.size() > 0) {
//将DishId设置给dish_flavor
flavors.forEach(flavor -> flavor.setDishId(id));
//设置好DishId后存入表中 整体录入
dishFlavorMapper.insertBatch(flavors);
}
⑧当前端传递数据为一个集合,且需要存储时,可以一次性存储。在mapper.xml文件中用动态SQL foreach标签
<insert id="insertBatch">
insert into dish_flavor (dish_id, name, value) values
<foreach collection="flavors" item="df" separator=",">
(#{df.dishId}, #{df.name}, #{df.value})
</foreach>
</insert>
collection表示mapper接收的参数 item集合遍历的一个参数,separator间隔符
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了