苍穹外卖--课堂笔记

发布时间 2023-09-06 21:45:28作者: 微盖

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间隔符