返回实体类的所有 null 字段,自定义工具类

//案例         
//vo为拿到的值    info为数据库查询到的值
//由vo赋值给info  由自定义的工具类方法来忽略字段为null的所有字段
                    String[] nullPropertyNames = IprmisUtils.getNullPropertyNames(vo);
                    BeanUtils.copyProperties(vo, info,nullPropertyNames);
                    xxxInfoMapper.update(info);

IprmisUtils工具类

public class IprmisUtils {
    /**
     * 返回实体的所有非 null 字段
     */
    public static String[] getNotNullPropertyNames(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
        Set<String> notEmptyNames = new HashSet<>();
        for (java.beans.PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue != null) notEmptyNames.add(pd.getName());
        }
        String[] result = new String[notEmptyNames.size()];
        return notEmptyNames.toArray(result);
    }

    /**
     * 返回实体的所有 null 字段
     */
    public static String[] getNullPropertyNames(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());
        }
        String[] result = new String[emptyNames.size()];
        return emptyNames.toArray(result);
    }

    /**
     * 面积单位转换
     * @param area 面积
     * @param fromUnit 传入面积单位 "0001"平方米、"0002"亩、"0003"公顷、"0004"平方千米(默认"0001"平方米)
     * @param toUnit 输出面积单位 "0001"平方米、"0002"亩、"0003"公顷、"0004"平方千米
     * @return 转换后面积
     */
    public static BigDecimal convertArea(BigDecimal area, String fromUnit, String toUnit) {
        if(area==null) return null;
        if (StrUtil.isBlank(fromUnit)) fromUnit = "0001";
        if (fromUnit.equals(toUnit)) return area;
        // 将所有单位转换为平方米
        double area1 = area.doubleValue();
        double squareMeters = 0.0;
        switch (fromUnit) {
            case "0004": //平方千米
                squareMeters = area1 * 1000000;
                break;
            case "0003": //公顷
                squareMeters = area1 * 10000;
                break;
            case "0002": //亩
                squareMeters = area1 * 666.667;
                break;
            //case "0001": //平方米
            default://平方米
                squareMeters = area1;
        }

        // 将平方米转换为目标单位
        double convertedArea = 0.0;
        switch (toUnit) {
            case "0001": //平方米
                convertedArea = squareMeters;
                break;
            case "0004": //平方千米
                convertedArea = squareMeters / 1000000;
                break;
            case "0003": //公顷
                convertedArea = squareMeters / 10000;
                break;
            case "0002": //亩
                convertedArea = squareMeters / 666.667;
                break;
            default:
                throw new BusinessException("输出面积单位错误!");
        }
        return BigDecimal.valueOf(convertedArea);
    }

    /**
     * 金额单位转换
     * @param amount 金额
     * @param fromUnit 传入金额单位 "0001"元、"0002"万元(传入不在限定值或空默认元)
     * @param toUnit  输出金额单位 "0001"元、"0002"万元
     * @return 转换后金额
     */
    public static BigDecimal convertAmount(BigDecimal amount, String fromUnit, String toUnit) {
        if(amount==null) return null;
        if (StrUtil.isBlank(fromUnit)) fromUnit = "0001";
        if(fromUnit.equals(toUnit)) return amount;
        // 先将输入的金额统一转换为元
        double amount1 = amount.doubleValue();
        double yuan = 0.0;
        switch (fromUnit.toLowerCase()) {
            case "0002": // 万元
                yuan = amount1 * 10000;
                break;
            //case "0001": // 元
            default:// 元
                yuan = amount1;
        }

        // 根据目标金额单位进行转换
        double convertedAmount = 0.0;
        switch (toUnit.toLowerCase()) {
            case "0001": // 元
                convertedAmount = yuan;
                break;
            case "0002": // 万元
                convertedAmount = yuan / 10000;
                break;
            default:
                throw new BusinessException("输出金额单位错误!");
        }

        return BigDecimal.valueOf(convertedAmount);
    }

    /**
     * 格式化日期
     * @param date 需格式化日期
     * @param formatPattern 格式 不指定默认返回【yyyy-MM-dd】格式
     * @return 格式化后日期
     */
    public static String formatDateToString(Date date, String formatPattern) {
        if(date==null) return null;
        if(StrUtil.isBlank(formatPattern))formatPattern="yyyy-MM-dd";
        try {
            // 创建SimpleDateFormat对象,并指定日期格式
            SimpleDateFormat sdf = new SimpleDateFormat(formatPattern);
            // 使用format()方法将日期对象格式化为字符串并返回
            return sdf.format(date);
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

    /**
     * 对象属性赋值批量操作
     * @param listA 源数据list
     * @param listB 操作源list
     * @param primaryKey 关联主键
     * @param excludedProperties 排除的字段
     * @param <T> 泛型A
     * @param <U> 泛型B
     */
    public static <T, U> void updateListB(List<T> listA, List<U> listB,String primaryKey, String... excludedProperties) {
        for (T t : listA) {
            for (U u : listB) {
                if (ObjectUtil.equals(getFieldValue(t,primaryKey),getFieldValue(u,primaryKey))){
                    BeanUtils.copyProperties(t, u, excludedProperties);
                }
            }
        }
    }

    /**
     * 反射获取泛型的对应字段的值
     * @param obj 泛型对象
     * @param fieldName 属性名称
     * @param <T> 泛型
     * @return 属性值
     */
    public static <T> Object getFieldValue(T obj, String fieldName) {
        Class<?> clazz = obj.getClass();
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            return field.get(obj);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值