首页 > 编程语言 >关于JAVA项目公共字段自动填充的理解

关于JAVA项目公共字段自动填充的理解

时间:2023-07-04 21:56:41浏览次数:59  
标签:JAVA 填充 private 自动 FieldFill 公共 public

公共字段字段填充是什么?

  “公共字段自动填充”顾名思义,其实就是省略了在程序当中对某些字段手动填写的步骤,大大提高了效率! 

为什么要使用公共字段填充技术在我们的程序当中?

  在我们项目的开发中,当我们在修改数据库中的某些值的时候,有一些字段属于公共子段,就是有些字段不仅是在某一个表里有,而是好几张表里面都要设置这些字段。

为了简化项目的开发,缩小代码量,我们就可以使用mybatis Plus为我们提供的公共字段填充功能,使我们的开发更有效率,没必要把时间和代码量花费在这些重复的工作上。具体可参考 https://blog.csdn.net/weixin_61724992/article/details/127435077
 

实现步骤:

1.在实体类的属性上加入@TableField注解,指定自动填充的策略
@TableField注解的fill属性:

FieldFill.DEFAULT  //默认不自动填充

FieldFill.INSERT  //插入时自动填充

FieldFill.UPDATE  //修改时自动填充

FieldFill.INSERT_UPDATE  //插入和修改时都自动填充

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("books")
public class Book {
 
    private Integer ID;
    private String booksname;
    private String author;
 
    @TableField(fill = FieldFill.INSERT)
    private Integer num;
 
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Double price;
}

2.按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口,并实现insertFill和updateFill方法,再使用MetaObject来设置对应字段要自动添加的值。


此类交spring管理,需要加上@Component注解
 

//公共字段自动填充处理器
@Slf4j
@Component
public class MyMetaObjecthandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("添加时的操作...");
        metaObject.setValue("字段名","值");
    }
 
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("修改时的操作...");
        metaObject.setValue("字段名","值");
    }
}

对于自动添加静态值就如上即可

3.动态值自动添加
ThreadLocal

ThreadLocal并不是一个Thread,而是Thread的局部变量。hreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。

简单概况为:在多线程并发情况下,每个线程中的变量都是相互独立的(线程隔离效果)

创建一个ThreadLocal封装类

 

public class BaseContext {
//    这里的Double不是固定,根据自己的需求决定
    private static ThreadLocal<Double> threadLocal = new ThreadLocal<>();
 
    public static void setCurrent(Double num) {
        threadLocal.set(num);
    }
    public static Double getCurrent() {
        return threadLocal.get();
    }
}

回到MyMetaObjecthandler类中把具体值替换成BaseContext.getCurrent()即可

注:如果设置自动填充的话,就必须满足MyMetaObjecthandler 类中对应方法的所有字段。例如insertFill方法中要自动填充两个字段,那么你就必须得在实体类中也要设置两个字段与之匹配,如果想解决这类问题需要在MyMetaObjecthandler 类中进行相应的设置

简单的测试

@Autowired
    private BookService bookService;
    @Test
    void contextLoads() {
        Book book = new Book();
        book.setBooksname("三国演义");
        book.setAuthor("罗贯中");
        BaseContext.setCurrent(1111d);
        bookService.save(book);
    }

效果

标签:JAVA,填充,private,自动,FieldFill,公共,public
From: https://www.cnblogs.com/ZhuAo/p/17527118.html

相关文章

  • Spring Boot 3.0.0 来啦!最小依赖 Java17!升还是不升?
    Spring官方于2022年1月20日发布SpringBoot3.0.0-M1版本,预示开启了SpringBoot3.0的里程碑。官方公告下的中文评论有点东西。。。熟悉的味道!就是那个味!  分享一篇朋友对SpringBoot3.0的介绍:生还是不生?SpringBoot3版本有起飞前兆,最小依赖Java17!一直......
  • Java数组和数据存储
    数组的定义数组是相同类型数据的有序集合。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。数组的四个基本特点:1.长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2.其元素的类型必须是相同类型,不允许出现混合类型。3.数组类型可以是任何数据类......
  • 模拟双色球彩票系统(java)
    一、问题描述 注:六个红色球号码均不同,蓝色球号码可以红色球号码相同;二、设计思路(1)先随机出一个中奖号码,依据这个号码对后续进行颁奖;(2)再从用户端接收对应的6个红色球号码以及1个蓝色球号码;(3)将中奖号码与用户号码进行对比,得出对应的中奖结果;ps:”如何得到不重复的随机数“值......
  • GitHub上最热门的Java开源项目
    这是一个轻快,简洁,功能强大,使用Java开发的博客系统。2jeecg-boothttps://github.com/zhangdaiscott/jeecg-bootStar2873这是一款基于代码生成器的JAVA快速开发平台!提高UI能力的同时,降低前后分离的开发成本,JeecgBoot还独创在线开发模式,No代码概念,一系列在线智能开发:在线配置......
  • 高级Java开发面试常用题的答案
    一、数据结构与算法基础·说一下几种常见的排序算法和分别的复杂度。·用Java写一个冒泡排序算法/**现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字,那么在第一趟遍历后,最后发生交换的位置必定小于100,且这个位置之后的数据必定已......
  • 最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁
    最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁在Java并发场景中,会涉及到各种各样的锁如公平锁,乐观锁,悲观锁等等,这篇文章介绍各种锁的分类:公平锁/非公平锁可重入锁独享锁/共享锁乐观锁/悲观锁分段锁自旋锁 最全Java锁详解:独享锁/共享锁+公平锁/非......
  • JAVA生产环境性能监控与调优看这一篇就够了
     JVM的内存结构 JVM的参数类型标准参数(各版本中保持稳定)-help-server-client-version-showversion-cp-classpathX参数(非标准化参数)-Xint:解释执行-Xcomp:第一次使用就编译成本地代码-Xmixed:混合模式,JVM自己决定是否编译成本地代码示例:java-version(默认是......
  • 数据库问题之“字符编码问题 Cause: java.sql.SQLException: Incorrect string value:
     1)表1和表2的产品名称[数据库字段]字符编译方式不一致①问题 org.springframework.jdbc.UncategorizedSQLException:Errorupdatingdatabase.Cause:java.sql.SQLException:Incorrectstringvalue:'\xF0\x9F\x8E\x81\xE7\x88...'forcolumn'product_name'atr......
  • LeetCode 235. 二叉搜索树的最近公共祖先
    题目链接:LeetCode235.二叉搜索树的最近公共祖先题意:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。解题思路:对于二叉搜索树,找两个点的最近公共祖先,这两个点所处的位置只有两种情况:情况一:两点在根节点的左右两侧情况二:两点在根节点的一侧(左侧或者右侧)递归......
  • java中concurrentHashMAP和HashTable有什么区别?
    ConcurrentHashMap和HashTable都是Java中用于实现线程安全的哈希表数据结构的类,但它们有一些关键的区别。线程安全性:ConcurrentHashMap是通过使用锁分段技术来实现线程安全的。它将整个哈希表分成了多个段(默认为16个),每个段有自己的锁。这样,在大多数情况下,多个线程可以同时访问不同......