字段自动填充、线程工具类、LambdaQueryWrapper

字段自动填充功能:

减少重复填充的无用代码。

实现步骤:

  1. 实体类中需要自动填充的属性添加@TableField属性,并设置fill属性为FieldFill.INSERT (添加时自动填充)、FieldFill.INSERT(修改时自动填充)还是FieldFill.INSERT_UPDATE(添加时、修改时自动填充)

  2. 定义元数据对象处理器:创建一个类实现MetaObjectHandler接口,并添加@Component注解将该类交给Springboot托管,重写insertFill和updateFill方法

  3. 设置自动填充字段的值:调用MetaObject对象的setValue方法,以键值对的形式设置自动填充自动值。

代码演示:

//创建时间
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
​
//更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
​
//创建人
@TableField(fill = FieldFill.INSERT)
private Long createUser;
​
//修改人
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
@Component //交给Spring管理
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
//    插入操作时实现字段自动填充
    @Override
    public void insertFill (MetaObject metaObject) {
        //        参数传入的时字段名,要设置的字段值
        metaObject.setValue("createTime",LocalDateTime.now());
        metaObject.setValue("createUser",BaseContext.getCurrentId());
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
​
//    修改操作时实现字段自动填充
    @Override
    public void updateFill (MetaObject metaObject) {
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
}

线程工具类:

适用场景:前端每发送一条请求,从请求的开始--->到请求结束,都由一个线程在处理。在三层架构处理请求过程中,可以在请求开始位置(放行前)设置共享线程变量值,传递给后面要用到该值的地方。请求结束后要注意remove共享线程变量。(不进行remove当线程过多会溢出)

实现步骤:

  1. 创建线程工具类。

  2. 创建ThreadLocal<>对象并设置为static

  3. 创建工具类的三个静态方法分别是:定义set方法调用ThreadLocal类中的set方法,返回值为void

    定义get方法调用ThreadLocal类中的get方法,返回值为泛型类型

    定义remove方法调用ThreadLocal类中的remove方法,返回值为void

  4. 移除共享线程变量:该项目请求结束是放行后所以在dofilter方法后r进行emove共享线程变量,避免共享线程在内存中过多导致内存溢出。

代码演示:

public class BaseContext {
//    创建线程工具类 一个线程可以执行多个类 通过这个特性可以使用线程来传递id
    private static ThreadLocal<Long> threadLocal=new ThreadLocal<>();
​
//  设置共享线程变量的值
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }
​
//  获取共享线程变量的值
    public static Long getCurrentId(){
        return threadLocal.get();
    }
​
//  释放共享线程变量
    public static void removeCurrentId(){
        threadLocal.remove();
    }
}
  BaseContext.setCurrentId(id);
//        放行前
//        设置共享变量的值
//-----------------------------
            filterChain.doFilter(request,response);
//-----------------------------
//        放行后
//        释放共享变量的值
            BaseContext.removeCurrentId();

LambdaQueryWrapper构造sql条件(本质是构造sql语句):

实现步骤:

  1. 设置条件构造器

  2. 设置判断条件

  3. 调用聚合查询方法传入判断条件并获取该方法的返回值。

代码实现:

@Override
    public R<String> remove (Long id) {
//        设置查询条件 根据id进行菜品查询
        LambdaQueryWrapper<Dish> queryWrapper1=new LambdaQueryWrapper<>();
//       设置判断添加 通过传入id与实体类的id相匹配。
        queryWrapper1.eq(Dish::getCategoryId,id);
//      调用count聚合查询方法 并返回统计查询结果
        int count1 = dishService.count(queryWrapper1);
        //如果已经关联,抛出一个业务异常
        if (count1>0){
            throw new CustomException("当前分类下关联了菜品,不能删除");
        }
​
        //        设置查询条件 根据id进行套餐查询
        LambdaQueryWrapper<Setmeal> queryWrapper2 =new LambdaQueryWrapper<>();
        //        判断传入的id是否与套餐id相关联
        queryWrapper2.eq(Setmeal::getCategoryId,id);
        //      调用count查询 并统计查询结果
        int count2 = setmealService.count(queryWrapper2);
​
        //如果已经关联,抛出一个业务异常
        if (count2>0){
            throw new CustomException("当前分类下关联了套餐,不能删除");
        }
        //正常删除分类
        categoryMapper.deleteById(id);
        return R.success("分类信息删除成功");
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值