新增的尺度流程

王柳  金牌会员 | 2024-9-20 16:49:29 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 907|帖子 907|积分 2721

同样的新增的话我们也是分成两种,
 
共同点:
返回值都是只必要一个Result.success就可以了
接受前端的格式都是json格式,所以必要requestbody
1.不必要毗连其他表的

传统方法,在service层把各种数据拼接给new出来的employee从而实现到数据库的保存

示例代码:
 
  1. @Override
  2. public void save(EmployeeDTO employeeDTO) {
  3.     // 获取当前用户ID
  4.     Long currentUserId = BaseContext.getCurrentId();
  5.     // 使用builder流构建Employee对象
  6.     Employee employee = Employee.builder()
  7.             .username(employeeDTO.getUsername())
  8.             .password(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()))
  9.             .name(employeeDTO.getName())
  10.             .phone(employeeDTO.getPhone())
  11.             .sex(employeeDTO.getSex())
  12.             .idNumber(employeeDTO.getIdNumber())
  13.             .createTime(LocalDateTime.now())   // 设置创建时间
  14.             .updateTime(LocalDateTime.now())   // 设置修改时间
  15.             .createUser(currentUserId)         // 设置创建人
  16.             .updateUser(currentUserId)         // 设置修改人
  17.             .status(1)                         // 设置默认状态为启用
  18.             .build();
  19.     // 保存到数据库
  20.    employeeMapper.save(employee);
  21. }
复制代码

但是我们对于所有的增加和修改方法我们都必要必要纪录时间和操纵人,就必要用到切面编程

自定义切面注解如下
  1. package com.sky.annotation;
  2. import com.sky.enumeration.OperationType;
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. /**
  8. * 自定义注解,用于标识某个方法需要进行功能字段自动填充处理
  9. */
  10. @Target(ElementType.METHOD)
  11. @Retention(RetentionPolicy.RUNTIME)
  12. public @interface AutoFill {
  13.     //数据库操作类型:UPDATE INSERT
  14.     OperationType value();
  15. }
复制代码

  1. 
package com.sky.aspect;
  2. import com.sky.annotation.AutoFill;
  3. import com.sky.constant.AutoFillConstant;
  4. import com.sky.context.BaseContext;
  5. import com.sky.enumeration.OperationType;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.aspectj.lang.JoinPoint;
  8. import org.aspectj.lang.annotation.Aspect;
  9. import org.aspectj.lang.annotation.Before;
  10. import org.aspectj.lang.annotation.Pointcut;
  11. import org.aspectj.lang.reflect.MethodSignature;
  12. import org.springframework.stereotype.Component;
  13. import java.lang.reflect.Method;
  14. import java.time.LocalDateTime;
  15. /**
  16. * 自定义切面,实现公共字段自动填充处理逻辑
  17. */
  18. @Aspect
  19. @Component
  20. @Slf4j
  21. public class AutoFillAspect {
  22.     /**
  23.      * 切入点
  24.      */
  25.     @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
  26.     public void autoFillPointCut(){}
  27.     /**
  28.      * 前置通知,在通知中进行公共字段的赋值
  29.      */
  30.     @Before("autoFillPointCut()")
  31.     public void autoFill(JoinPoint joinPoint){
  32.         log.info("开始进行公共字段自动填充...");
  33.         //获取到当前被拦截的方法上的数据库操作类型
  34.         MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象
  35.         AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
  36.         OperationType operationType = autoFill.value();//获得数据库操作类型
  37.         //获取到当前被拦截的方法的参数--实体对象
  38.         Object[] args = joinPoint.getArgs();
  39.         if(args == null || args.length == 0){
  40.             return;
  41.         }
  42.         Object entity = args[0];
  43.         //准备赋值的数据
  44.         LocalDateTime now = LocalDateTime.now();
  45.         Long currentId = BaseContext.getCurrentId();
  46.         //根据当前不同的操作类型,为对应的属性通过反射来赋值
  47.         if(operationType == OperationType.INSERT){
  48.             //为4个公共字段赋值
  49.             try {
  50.                 Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
  51.                 Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
  52.                 Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
  53.                 Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
  54.                 //通过反射为对象属性赋值
  55.                 setCreateTime.invoke(entity,now);
  56.                 setCreateUser.invoke(entity,currentId);
  57.                 setUpdateTime.invoke(entity,now);
  58.                 setUpdateUser.invoke(entity,currentId);
  59.             } catch (Exception e) {
  60.                 e.printStackTrace();
  61.             }
  62.         }else if(operationType == OperationType.UPDATE){
  63.             //为2个公共字段赋值
  64.             try {
  65.                 Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
  66.                 Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
  67.                 //通过反射为对象属性赋值
  68.                 setUpdateTime.invoke(entity,now);
  69.                 setUpdateUser.invoke(entity,currentId);
  70.             } catch (Exception e) {
  71.                 e.printStackTrace();
  72.             }
  73.         }
  74.     }
  75. }
复制代码
service层代码如下
  1. 
@Override
  2. public void save(EmployeeDTO employeeDTO) {
  3.     Employee employee = new Employee();
  4.     // 使用 BeanUtils 复制相同字段的属性
  5.     BeanUtils.copyProperties(employeeDTO, employee);
  6.     // 设置默认密码(需要手动设置)
  7.     employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
  8.     // 设置默认状态为启用(需要手动设置)
  9.     employee.setStatus(1);
  10.    
  11.     // 保存到数据库
  12.     employeeMapper.save(employee);
  13. }
复制代码
//简朴的总结一下切面编程的大体逻辑

controller很简朴以后传dto就行

Service层举行处理
1.新建实体类用于传给数据库保存
2.将dto的内容复制到实体类里面。:BeanUtils.copyProperties(categoryDTO,category);
3.补充一些实体类里面没有的内容,然后直接交给数据库就行
mapper层的使用@Autofill注解举行拼接插入
数据库直接简朴的保存就可以了

  1.     @AutoFill(OperationType.INSERT)
  2.     @Insert("INSERT INTO employee (name, username, password, phone, sex, id_number, status, create_time, update_time, create_user, update_user) " +
  3.             "VALUES (#{name}, #{username}, #{password}, #{phone}, #{sex}, #{idNumber}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
  4.     void save(Employee employee);
复制代码

2.必要把前端接受的数据传到两张表的做法


1.Controller层就接受dto就好了然后直接调用service层的方法

示例代码:
  1. //新增菜品
  2. @PostMapping
  3. public Result save(@RequestBody DishDTO dishDTO)
  4. {
  5.     dishServcice.save(dishDTO);
  6.     return Result.success();
  7. }
复制代码

2.service层的话就是首先建立一个实体类,把接受到的dto保存到实体类中,然后的话就是向实体类里面加东西,然后直接把实体类加入到mapper层的一个表里面,不过这里要注意
1.@Autofill保举在Mapper层里面加入
2.然后的话应为第二张表必要拿到第一表插入数据库里面自动天生的主键,所以的话就是我们必要在第一张表插入的时间加上一个返回主键的语句,然后的话我们在插入第二张表的前面的时间就必要先把拿到主键赋值给第二张表的关联键
这里补充说明一下,前端是不会给后端传来主键的,因为主键是在插入数据库的时间自动天生的


示例代码:
  1. 
public void save(DishDTO dishDTO) {
  2.     Dish dish = new Dish();
  3.     BeanUtils.copyProperties(dishDTO, dish);
  4.     dish.setStatus(StatusConstant.ENABLE);
  5.     // 保存菜品
  6.     dishMapper.save(dish);
  7.     // 保存口味,设置 dishId
  8.     dishDTO.getFlavors().forEach(flavor -> flavor.setDishId(dish.getId()));
  9.     dishFlavorMapper.saveFlavors(dishDTO.getFlavors());
  10. }
复制代码


    两个mapper层
  
  1. @AutoFill(OperationType.INSERT)
  2. @Insert("insert into dish(category_id, name, price, status, description, image, create_time, update_time, create_user, update_user) " +
  3.         "values (#{categoryId}, #{name}, #{price}, #{status}, #{description}, #{image}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
  4. @Options(useGeneratedKeys = true, keyProperty = "id")
  5. void save(Dish dish);
复制代码

  
  1. @Insert({
  2.         "<script>",
  3.         "insert into dish_flavor (dish_id, name, value) values ",
  4.         "<foreach collection='flavors' item='flavor' separator=','>",
  5.         "(#{flavor.dishId}, #{flavor.name}, #{flavor.value})",
  6.         "</foreach>",
  7.         "</script>"
  8. })
  9. void saveFlavors(List<DishFlavor> flavors);
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表