IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 数据比较(包含注解方式和使用配置表方式) -> 正文阅读

[游戏开发]数据比较(包含注解方式和使用配置表方式)

package com.rg.spd.common.utils;

import com.rg.spd.common.annotations.ForUpdate;
import com.rg.spd.common.mode.ChangeProperties;
import com.rg.spd.common.mode.Compare;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author DC
 * @description 获取两次数据的变化
 */
public class UpdateBeanUtils {

    /**
     * 通过注解比较
     *
     * @param newBean 新数据
     * @param oldBean 旧数据
     * @param <T>
     * @return
     */
    public static <T> List<ChangeProperties> getChangedFields(T newBean, T oldBean) {
        Field[] fields = newBean.getClass().getDeclaredFields();
        List<ChangeProperties> changePropertiesList = new ArrayList<>();
        String updTime = null;
        for (Field field : fields) {
            //设置访问权限
            field.setAccessible(true);
            //获取新数据的变更时间属性
            if (field.getName().equals("updTime")) {
                try {
                    //获取该数据的对象中的指定属性的值
                    Object o = field.get(newBean);
                    updTime = String.valueOf(o);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            if (field.isAnnotationPresent(ForUpdate.class)) {
                try {
                    Object newValue = field.get(newBean);
                    Object oldValue = field.get(oldBean);
                    if (!Objects.equals(newValue, oldValue)) {
                        //获取被ForUpdate注解修饰的属性
                        String fieldName = field.getAnnotation(ForUpdate.class).fieldName();
                        ChangeProperties changeProperties = new ChangeProperties(updTime, fieldName, newValue, oldValue);
                        changePropertiesList.add(changeProperties);
                    }
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
        return changePropertiesList;
    }

    /**
     * 通过指定字段比较
     *
     * @param newBean     新数据
     * @param oldBean     旧数据
     * @param compareList 比较字段 在数据库中查询出来
     * @param whetherToGetTheTime 是否获取时间
     * @param <T>
     * @return
     */
    public static <T> List<ChangeProperties> getChangedFields(T newBean, T oldBean, List<Compare> compareList,Boolean whetherToGetTheTime) {
        List<String> CompareFields = compareList.stream().map(Compare::getCompareFields).collect(Collectors.toList());
        Field[] fields = newBean.getClass().getDeclaredFields();
        List<ChangeProperties> changePropertiesList = new ArrayList<>();
        String updTime = null;
        for (Field field : fields) {
            //设置访问权限
            field.setAccessible(true);
            if (whetherToGetTheTime) {
                //获取新数据的变更时间属性
                if (field.getName().equals("updTime")) {
                    try {
                        //获取该数据的对象中的指定属性的值
                        LocalDateTime updateTime = (LocalDateTime) field.get(newBean);
                        updTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(updateTime);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
            if (CompareFields.contains(field.getName())) {
                try {
                    Object newValue = field.get(newBean);
                    Object oldValue = field.get(oldBean);
                    if (!Objects.equals(newValue, oldValue)) {
                        //获取属性对应的属性中文名称
                        String fieldName = field.getName();
                        for (Compare compare : compareList) {
                            if (compare.getCompareFields().equals(field.getName())) {
                                fieldName = compare.getCompareFieldsN();
                            }
                        }
                        //如果是枚举类
                        if(field.getType().isEnum()){
                            newValue = getEnumValue(field, newBean);
                            oldValue = getEnumValue(field, oldBean);
                        }
                        ChangeProperties changeProperties = new ChangeProperties(updTime, fieldName, newValue, oldValue);
                        changePropertiesList.add(changeProperties);
                    }
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
        return changePropertiesList;
    }

    /**
     * 反射处理枚举值
     *
     * @param field
     * @param object
     * @return
     * @throws Exception
     */
    public static String getEnumValue(Field field, Object object) throws Exception {
        //获取枚举类型
        Class<Enum> type = (Class<Enum>) field.getType();
        //获取枚举常量
        Enum[] enumConstants = type.getEnumConstants();
        //获取值得方法
        Method getValue = type.getMethod("getValue");
        //获取值中文的方法
        Method getValueCh = type.getMethod("getValueCh");
        for (Enum v : enumConstants) {
            //类中实际枚举值
            String theActualEnumValueInTheClass = String.valueOf(field.get(object));
            //执行枚举方法获取枚举的value
            String value = String.valueOf(getValue.invoke(v));
            if (value.equals(theActualEnumValueInTheClass)) {
                //执行枚举方法获取枚举的valueCh
                String valueCh = String.valueOf(getValueCh.invoke(v));
                return valueCh;
            }
        }
        return null;
    }

}

第一个是注解方法
自定义注解(注解放在类中的属性上即可)

package com.rg.spd.common.annotations;

import java.lang.annotation.*;

/**
 * @author DC
 * 需要记录变化的字段
 */
@Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface ForUpdate {
        String fieldName() default "";
    }

第二种方法
把字段一个个放到数据库中
需要时查询出来,其中有分组概念,
可以把不同类中的字段分开,可以手动在数据库中开启是否比较

数据表结构

/*
 Navicat MySQL Data Transfer

 Source Server         : 221
 Source Server Type    : MySQL
 Source Server Version : 50727
 Source Host           : 192.168.2.221:3306
 Source Schema         : spd

 Target Server Type    : MySQL
 Target Server Version : 50727
 File Encoding         : 65001

 Date: 10/03/2022 17:15:51
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_compare
-- ----------------------------
DROP TABLE IF EXISTS `t_compare`;
CREATE TABLE `t_compare`  (
  `rid` bigint(20) NOT NULL,
  `verno` int(11) NULL DEFAULT 1 COMMENT '版本号',
  `add_account` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '添加者',
  `add_time` datetime(0) NULL DEFAULT NULL COMMENT '添加时间',
  `upd_account` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
  `upd_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `compare_fields` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '比较的字段名称',
  `compare_fields_n` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '比较字段中文',
  `status_flag` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否有效',
  `field_grouping` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段分组',
  PRIMARY KEY (`rid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;


  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:53:59  更:2022-03-12 17:56:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/12 18:04:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码