beanCopy,将非空的字段复制到另一个javabean

本文介绍了一种在使用Hibernate框架更新数据库记录时,避免将NULL值字段更新到数据库的方法。通过两个实用函数,可以实现只更新非NULL值字段,以及在更新时忽略特定字段的功能,有效防止了不必要的数据覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于hibernate更新数据时,不想把null的字段给更新到数据库所有这样
有两个方法:
target:数据库查的,source前端传的,会去除所有前端传的为null的字段
beanCopy(T source, T target)
beanCopyWithIngore(T source, T target, String… ignoreProperties) //不复制部分字段的值

beanCopyWithIngore(T source, T target, String… ignoreProperties)

public class BeanCopyUtil {
//source中的非空属性复制到target中
public static void beanCopy(T source, T target) {
BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
}

//source中的非空属性复制到target中,但是忽略指定的属性,也就是说有些属性是不可修改的(个人业务需要)
public static <T> void beanCopyWithIngore(T source, T target, String... ignoreProperties) {
    String[] pns = getNullAndIgnorePropertyNames(source, ignoreProperties);
    BeanUtils.copyProperties(source, target, pns);
}

public static String[] getNullAndIgnorePropertyNames(Object source, String... ignoreProperties) {
    Set<String> emptyNames = getNullPropertyNameSet(source);
    for (String s : ignoreProperties) {
        emptyNames.add(s);
    }
    String[] result = new String[emptyNames.size()];
    return emptyNames.toArray(result);
}

public static String[] getNullPropertyNames(Object source) {
    Set<String> emptyNames = getNullPropertyNameSet(source);
    String[] result = new String[emptyNames.size()];
    return emptyNames.toArray(result);
}

public static Set<String> getNullPropertyNameSet(Object source) {
    final BeanWrapper src = new BeanWrapperImpl(source);
    java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
    Set<String> emptyNames = new HashSet<>();
    for (java.beans.PropertyDescriptor pd : pds) {
        Object srcValue = src.getPropertyValue(pd.getName());
        if (srcValue == null) emptyNames.add(pd.getName());
    }
    return emptyNames;
}
@Data
public static class Student{
    Long  id;
    String name;
    String schoolName;
    String home;
}
public static void main(String[] args) {
  /*  Student student = new Student();
    student.setId(1l);
    student.setName("zs");

    final BeanWrapper src = new BeanWrapperImpl(student);
    java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
    Set<String> emptyNames = new HashSet<>();
    for (java.beans.PropertyDescriptor pd : pds) {
        System.out.println(pd.getName());
        Object srcValue = src.getPropertyValue(pd.getName());
        if (srcValue == null) emptyNames.add(pd.getName());
    }
    System.out.println(emptyNames);*/
   // return emptyNames;

    Student target = new Student();
    target.setId(1l);
    target.setName("张三");

    Student source = new Student();
    source.setHome("云南");
    beanCopy(source,target);
    System.out.println(target);


}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值