java数据修改记录实现

  1. 自定义注解,标识需要记录的属性

@Target(ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface EditRecord {

    /**
     * 属性名称
     *
     * @return
     */
    String value() default "";


    /**
     * 标记属性是否为日期类型
     *
     * @return
     */
    boolean isDate() default false;

    /**
     * 日期格式
     *
     * @return
     */
    String dateFormat() default "yyyy-MM-dd";

    /**
     * 标记属性是否为文件
     *
     * @return
     */
    boolean isFile() default false;

    /**
     * 标记属性是否为金额
     *
     * @return
     */
    boolean isMoney() default false;


    /**
     * 标记属性是否为枚举值
     *
     * @return
     */
    boolean isEnum() default false;


    Class<? extends Enum> enumClass() default ProjectDicEnum.CustomerType.class;

}
  1. 属性增加标识

@EditRecord(value = "客户属性")
  1. 核心方法

 /**
     * 获取修改数据信息
     *
     * @param beforeObj 修改前对象
     * @param afterObj  修改后对象
     * @param sb        修改信息
     * @param clazz     类
     * @return
     */
public String getBeanEditMsg(Object beforeObj, Object afterObj, StringBuffer sb, Class clazz) {
        Arrays.stream(clazz.getDeclaredFields()).forEach(e -> {
            if (e.isAnnotationPresent(EditRecord.class)) { // 注解拦截
                Object beforeValue = ReflectUtil.getFieldValue(beforeObj, e);
                Object afterValue = ReflectUtil.getFieldValue(afterObj, e);
                if (beforeValue == null || afterValue == null) { // 这里需要优化
                    return;
                }
                if (e.getAnnotation(EditRecord.class).isDate()) { // 日期数据处理
                    beforeValue = DateUtil.format((Date) beforeValue, e.getAnnotation(EditRecord.class).dateFormat());
                    afterValue = DateUtil.format((Date) afterValue, e.getAnnotation(EditRecord.class).dateFormat());
                }
                if (e.getAnnotation(EditRecord.class).isFile()) { // 文件数据处理
                    // 取差集
                    List<String> fileIdList = (List<String>) CollUtil.disjunction(Arrays.asList(((String) beforeValue).split(",")), Arrays.asList(((String) afterValue).split(",")));
                    if (CollUtil.isNotEmpty(fileIdList)) {
                        // 修改前的文件信息
                        List<BaseFileInfoResp> beforeFileList = baseFileInfoService.getFileList(Arrays.asList(((String) beforeValue).split(",")));
                        StringBuffer fileSb = new StringBuffer();
                        beforeFileList.stream().forEach(f -> {
                            fileSb.append("<a target=\"_blank\" href=\"" + FILE_PATH + f.getUri() + "\">" + f.getName() + "</a>");
                        });
                        sb.append("[" + e.getAnnotation(EditRecord.class).value() + "]:修改前:" + fileSb.toString());
                        fileSb.setLength(0); // 清空StringBuffer
                        // 修改后的文件信息
                        List<BaseFileInfoResp> fileList = baseFileInfoService.getFileList(Arrays.asList(((String) afterValue).split(",")));
                        fileList.stream().forEach(f -> {
                            fileSb.append("<a target=\"_blank\" href=\"" + FILE_PATH + f.getUri() + "\">" + f.getName() + "</a>");
                        });
                        sb.append(",修改后:" + fileSb.toString() + "<br/>");
                    }
                } else if (e.getAnnotation(EditRecord.class).isMoney()) { // 金额数据处理
                    if (((BigDecimal) beforeValue).compareTo(((BigDecimal) afterValue)) != 0) {
                        sb.append("[" + e.getAnnotation(EditRecord.class).value() + "]:修改前:" + ((BigDecimal) beforeValue).stripTrailingZeros().toPlainString() + ",修改后:" + afterValue + "<br/>");
                    }
                } else {
                    if (!beforeValue.toString().equals(afterValue.toString())) { // 数据判断
                        sb.append("[" + e.getAnnotation(EditRecord.class).value() + "]:修改前:" + beforeValue + ",修改后:" + afterValue + "<br/>");
                    }
                }
            }
        });
        return sb.toString();
    }
  1. 使用

getBeanEditMsg(beforeReq, req, editSb, ProjectReportReq.class);
  1. 依赖


        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.8</version>
        </dependency>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的男女比例。 男女比例。
要在Java实现MySQL数据操作记录,你可以使用JDBC(Java Database Connectivity)API来连接MySQL数据库并执行SQL语句。以下是一个简单的示例代码,可以记录INSERT、UPDATE和DELETE操作: ```java import java.sql.*; public class MySQLLogger { private Connection conn; private PreparedStatement insertStmt; public MySQLLogger(String url, String user, String password) throws SQLException { conn = DriverManager.getConnection(url, user, password); insertStmt = conn.prepareStatement("INSERT INTO log (query, operation_time) VALUES (?, ?)"); } public void logQuery(String query) throws SQLException { PreparedStatement stmt = conn.prepareStatement(query); stmt.execute(); logOperation(query); } public void logOperation(String query) throws SQLException { Timestamp timestamp = new Timestamp(System.currentTimeMillis()); insertStmt.setString(1, query); insertStmt.setTimestamp(2, timestamp); insertStmt.executeUpdate(); } public void close() throws SQLException { conn.close(); } } ``` 在这个示例中,我们首先创建了一个MySQLLogger类来连接到MySQL数据库,并提供了一个方法logQuery来执行SQL查询。如果查询成功执行,我们调用logOperation方法来记录该操作的时间戳和查询语句。 你需要为MySQLLogger类提供MySQL数据库的连接URL、用户名和密码。使用该类的示例代码如下: ```java MySQLLogger logger = new MySQLLogger("jdbc:mysql://localhost:3306/mydb", "myuser", "mypassword"); logger.logQuery("INSERT INTO users (name, email) VALUES ('John', 'john@example.com')"); logger.logQuery("UPDATE users SET email='john@example.org' WHERE name='John'"); logger.logQuery("DELETE FROM users WHERE name='John'"); logger.close(); ``` 在上面的示例中,我们创建了一个MySQLLogger实例来连接到MySQL数据库。然后我们执行了三个SQL查询,分别是INSERT、UPDATE和DELETE操作。每个操作都会在数据库中记录一条日志。最后,我们调用了MySQLLogger的close方法来关闭数据库连接。 请注意,这只是一个简单的示例代码,你可以根据自己的需求进行修改和扩展。例如,你可以将日志记录到文件或发送到远程服务器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值