意思是当某个字段需要重复使用和填充的时候,这个类会给你自动填充,前提是你自己得自定义数据,比如:你在添加员工信息的时候,创建的时间和创建的人都是需要反复写的数据,有这个类的话就不需要反复的去写了,他会给你自己填充你自己自定义的数据。
MetaObjecthandler
定义一个类来实现Mybatis-plus里的MetaObjecthandler接口,这个接口的作用是自定义元数据对象处理器,需要添加注解@Component来让Spring管理,必须实现接口的俩个类insertFill和updateFill。
当在类里面自定义设置了这些公共字段的值时,在controller类里的值就不需要再写了,因为在项目执行的时候,Spring会扫描到这个类从而自动填充相关字段的数据,避免了反复的操作。
其中有一个问题就是修改和添加的时候,管理员信息不能直接get到session对话,从而获取到他的数据。这里我获取id的值是自己打上去的。
上面俩张图的意思就是使用自动填充类来替换第二张图的数据。
ThreadLocal
获取到id的数据,我们要用到ThreadLocal,ThreadLocal的也是就是线程,只有在线程内才可以获取到相对应的值,线程外的则不能访问。
Long id = Thread.currentThread.getId();
代码的意思为获取当前线程的id,而我写的项目中LoginCheckFilter的doFilter方法、EmployeeController的update方法和MyMetaObjectHandler的updateFill方法在同一个线程中,在LoginCheckFilter的doFilter方法里我能够通过session获取到id的值,所以我只要在这个方法中使用ThreadLocal设置set id的值,表示存到了线程里,在线程的所有方法多可以通过ThreadLocal获取到值 ,这样我的获取id的问题就解决了。
思路有了,接下来就是实施,首先我们创建一个工具类BaseContext,用来封装ThreadLocal,用户保存和获取当前用户的id
在LoginCheckFilter的doFilter方法里设置id的值,用BaseContext工具类设置
BaseContext.setThreadLocal(empId);
因为他们在同一个线程所以直接在自动填充字段的类里直接获取
metaObject.setValue("createUser",BaseContext.getThreadLocal());
metaObject.setValue("updateUser",BaseContext.getThreadLocal());
这样id就可以传过来了,为动态数据,且不用自己手动的去设置,他是自动给你填充的,在有关于这个字段的方法和类中都会自动填充。
以上就是采用自动填充字段的方法来简化代码,并且用ThreadLocal来传递数据,用BaseContext工具类封装ThreadLocal,实现添加员工信息和更新员工信息的时候自动添加一些存在的公共字段。