SpringBoot记录一次对实体的修改

这次记录的是使用SpringBoot的对实体一次新增和修改,至于对图片的,下次在解说。
顺序依旧是HTML(JS)–service–Controller,dao层就不进行记录了。

1HTML的记录。通过在后台获得的主键(UUID),在click事件中将ID传过去。
这里写图片描述

 <button class="layui-btn layui-btn-primary layui-btn-xs"
                                    data-ng-click="modifyMaintain(temp.uuid)">
                                <i class="layui-icon" >修改</i></button>

2.JS的记录
在JS中,通过一个ajax,将ID传到后台,查询出来我们需要修改的对象,放到一个新的页面中。
这里写图片描述

    // 更新操作
    $scope.modifymaintainDTO = {};
    $scope.modifyMaintain=function(id){
        $.ajax({
            url:"/maintain/detail/"+id ,
            type:'GET',
            success:function(result){
                // 把对象赋值到表单中
                $scope.maintainImgMaintains = result.data.imageMaintains;
                $scope.maintainImgMaintainFaults = result.data.imageMaintainFaults;
                $scope.maintainImgMaintainFrees = result.data.imageMaintainFrees;
             

                $("#city-form").text(result.data.city);
                $("#warehouse-form").text(result.data.warehouse);
                $("#carNumber-form").text(result.data.carNumber);
                $("#vehicleType-form").text(result.data.carNumber);
                $("#patenteName-update-form").text(result.data.patenteName);
                $("#date-modifyMantian-form").val(result.data.date);
                $("#compannyName-form").val(result.data.compannyName);
                $("#site-form").val(result.data.site);
                $("#free-form").val(result.data.free);
                $("#info-form").val(result.data.info);

接下来,继续在这个函数中,将表单中的值获得,放到对象中,将对象传给后台,通过一个$http请求(跟ajax一样的请求)
这里写图片描述

    // 将表单中的修改值 传到后台
                        $scope.modifymaintainDTO.uuid = result.data.uuid;
                        $scope.modifymaintainDTO.date = $("#date-modifyMantian-form").val();
                        $scope.modifymaintainDTO.patenteName = result.data.patenteName;
                        $scope.modifymaintainDTO.site = $("#site-form").val();
                        $scope.modifymaintainDTO.compannyName = $("#compannyName-form").val();
                        $scope.modifymaintainDTO.free = $("#free-form").val();
                        $scope.modifymaintainDTO.info = $("#info-form").val();
                        $http.post("/updateMaintain",$scope.modifymaintainDTO).success(function (result) {
                            if (result.result == 'success') {
                                layer.alert('操作成功', {icon: 6});
                                location.replace(location.href);
                            }
                            if (result.result == 'fail') {
                                layer.alert('操作失败');
                                return false;
                            }
                        });

到此,比较复杂的部分就算完成了。
dao层:
关于XML:
这里写图片描述


  <update id="updateByPrimaryKey" parameterType="com.yijiupi.himalaya.supplychain.vehicle.domain.po.MaintainPO" >
   UPDATE maintain
    SET
     DATE = #{date,jdbcType=TIMESTAMP},
      companny_name = #{compannyName,jdbcType=VARCHAR},
      site =#{site,jdbcType=VARCHAR},
      info =#{info,jdbcType=VARCHAR},
      free = #{free,jdbcType=DECIMAL}
    WHERE UUID = #{uuid,jdbcType=CHAR}
  </update>

关于dao接口:
int updateByPrimaryKey(MaintainPO record);
在Service 层:
这里写图片描述
在controller层中:
这里写图片描述

 @RequestMapping(value = "/updateMaintain",method = RequestMethod.POST)
    public Map<String, String> updateMaintain(@RequestBody MaintainDTO maintainDTO) {
        Map<String, String> resultMap = new HashMap<>(1);
        try {
            LOGGER.info("需要更新维修的车辆信息是:{}\n", maintainDTO);
            iMaintainService.updateMaintain(maintainDTO);
            resultMap.put("result", "success");
        } catch (Exception e) {
            resultMap.put("result", "fail");
        }
        return resultMap;

    }

到此,一个完整的修改描述完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用 Spring AOP 的方式,在数据更新时拦截相关方法,将数据修改前后的差异信息记录下来,然后将记录返回给前端。以下是简单的代码示例: 首先定义一个切面类,用于拦截数据更新方法: ```java @Aspect @Component public class DataChangeAspect { @Autowired private HttpServletRequest request; @Pointcut("execution(public * com.example.demo.service.*.update*(..))") public void updatePointcut() {} @Around("updatePointcut()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { // 获取方法名 String methodName = joinPoint.getSignature().getName(); // 获取参数列表 Object[] args = joinPoint.getArgs(); // 获取被更新的实体对象 Object entityObject = args[0]; // 获取原始实体对象 Object originalObject = getOriginalEntityObject(entityObject); // 执行方法 Object result = joinPoint.proceed(); // 记录数据差异并返回给前端 recordDataChange(originalObject, entityObject); return result; } /** * 获取原始实体对象 */ private Object getOriginalEntityObject(Object entityObject) { // 根据实体对象的 ID 查询原始实体对象 // 这里需要根据具体业务进行实现 Long entityId = ((BaseEntity) entityObject).getId(); return entityManager.find(entityObject.getClass(), entityId); } /** * 记录数据差异并返回给前端 */ private void recordDataChange(Object originalObject, Object entityObject) { // 计算数据差异 Map<String, Object> diffMap = getDiff(originalObject, entityObject); // 将差异信息记录到日志中 String diffStr = convertDiffMapToString(diffMap); logService.info("数据修改前后差异:" + diffStr); // 将差异信息返回给前端 request.setAttribute("dataDiff", diffMap); } /** * 计算实体对象的属性差异信息 */ private Map<String, Object> getDiff(Object originalObject, Object entityObject) { Map<String, Object> diffMap = new HashMap<>(); Class<?> clazz = entityObject.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { // 非持久化字段不参与差异计算 if (!field.isAnnotationPresent(Column.class)) { continue; } String fieldName = field.getName(); Object originalValue = ReflectionUtils.getFieldValue(originalObject, fieldName); Object newValue = ReflectionUtils.getFieldValue(entityObject, fieldName); if (originalValue == null || !originalValue.equals(newValue)) { diffMap.put(fieldName, newValue); } } return diffMap; } /** * 将差异信息转换为字符串 */ private String convertDiffMapToString(Map<String, Object> diffMap) { StringBuilder sb = new StringBuilder(); for (Map.Entry<String, Object> entry : diffMap.entrySet()) { sb.append(entry.getKey()).append(": ").append(entry.getValue()).append(","); } if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); } return sb.toString(); } } ``` 然后,使用 AOP 拦截 Spring Data JPA 的 save 或 update 方法: ```java @Aspect @Component public class JpaRepositoryAspect { @Autowired private HttpServletRequest request; @Around("execution(public * org.springframework.data.jpa.repository.JpaRepository+.save(..)) || execution(public * org.springframework.data.jpa.repository.JpaRepository+.saveAndFlush(..))") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { // 获取被保存或更新的实体对象 Object entityObject = joinPoint.getArgs()[0]; // 记录数据变化并返回给前端 request.setAttribute("originalData", entityObject); Object result = joinPoint.proceed(); request.setAttribute("modifiedData", entityObject); return result; } } ``` 最后,在 Controller 中获取前面拦截器中记录的数据差异信息和修改前后的实体对象: ```java @RestController public class DataController { @GetMapping("/users/{userId}") public User getUser(@PathVariable Long userId, HttpServletRequest request) { // 查询用户 User user = userRepository.findById(userId).orElse(null); // 获取数据差异信息 Map<String, Object> dataDiff = (Map<String, Object>) request.getAttribute("dataDiff"); // 获取修改前的实体对象 User originalData = (User) request.getAttribute("originalData"); // 获取修改后的实体对象 User modifiedData = (User) request.getAttribute("modifiedData"); // 合并差异信息到修改后的实体对象中 mergeDiffIntoModifiedData(modifiedData, dataDiff); return modifiedData; } /** * 将数据差异合并到修改后的实体对象中 */ private void mergeDiffIntoModifiedData(User modifiedData, Map<String, Object> dataDiff) { if (dataDiff == null || dataDiff.isEmpty()) { return; } BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(modifiedData); beanWrapper.setAutoGrowNestedPaths(true); for (Map.Entry<String, Object> entry : dataDiff.entrySet()) { String fieldName = entry.getKey(); Object value = entry.getValue(); beanWrapper.setPropertyValue(fieldName, value); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

virtuousOne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值