You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何优化Oracle CLOB相关代码为面向对象风格,操作集合内变量

看起来你已经搞定了最核心的数据库访问部分,接下来要把代码优化得更具面向对象特性其实很简单——核心思路就是把零散的namestatus这些变量封装成一个数据模型类,让数据和操作数据的逻辑绑定在一起。我给你一步步拆解具体方案:


1. 先创建一个数据模型类(DataExchangeResult

这个类专门用来承载从CLOB里提取的所有字段,同时把数据检查、计算、JSON转换这类和数据相关的逻辑都封装进来,完全符合面向对象的封装原则。

import java.time.LocalDateTime;
import java.time.Duration;
import org.json.JSONObject;

public class DataExchangeResult {
    // 把原来的零散变量改成私有字段,通过getter暴露(不需要修改的字段可以只写getter)
    private String name;
    private String status;
    private LocalDateTime lastSuccess;
    // 可以根据需求添加更多字段,比如执行时长、错误信息等

    // 构造方法(按需提供全参或必要参数的构造器)
    public DataExchangeResult(String name, String status, LocalDateTime lastSuccess) {
        this.name = name;
        this.status = status;
        this.lastSuccess = lastSuccess;
    }

    // Getter方法(如果字段需要修改再添加setter)
    public String getName() { return name; }
    public String getStatus() { return status; }
    public LocalDateTime getLastSuccess() { return lastSuccess; }

    // 把数据检查逻辑封装到类里,比如判断是否超过指定时长未成功
    public boolean isOverdue(Duration threshold) {
        if ("SUCCESS".equalsIgnoreCase(status)) {
            return false;
        }
        return lastSuccess != null && LocalDateTime.now().minus(threshold).isAfter(lastSuccess);
    }

    // 直接在类里实现JSON转换逻辑,不用在外部零散处理
    public JSONObject toJson() {
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("exchangeName", name);
        jsonObj.put("status", status);
        jsonObj.put("lastSuccessTime", lastSuccess != null ? lastSuccess.toString() : null);
        return jsonObj;
    }

    // 还可以添加其他业务逻辑,比如计算执行间隔、状态描述转换等
    public String getStatusDescription() {
        return switch(status.toUpperCase()) {
            case "SUCCESS" -> "执行成功";
            case "FAILED" -> "执行失败";
            case "RUNNING" -> "正在执行";
            default -> "未知状态";
        };
    }
}
2. 改造原有的数据库访问方法

把原来在getDataExchangeInfo里零散赋值变量的逻辑,改成直接创建DataExchangeResult对象并加入列表,让这个方法专注于数据库访问+数据映射的职责:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Clob;
import java.sql.SQLException;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

public class DataExchangeExecReport {
    // 把数据库连接逻辑抽成私有方法,避免重复代码
    private static Connection getDbConnection() throws SQLException {
        // 这里替换成你的数据库连接逻辑,比如用DataSource或者DriverManager
        return null;
    }

    // 把CLOB解析成DataExchangeResult的逻辑抽成单独方法,让代码更清晰
    private static DataExchangeResult parseClobToResult(Clob clobData) throws SQLException, IOException {
        // 读取CLOB内容到字符串(你的原有逻辑)
        String clobContent = readClobToString(clobData);
        
        // 从clobContent里提取各个字段(这里替换成你实际的解析逻辑,比如JSON解析/字符串截取)
        String name = extractNameFromClob(clobContent);
        String status = extractStatusFromClob(clobContent);
        LocalDateTime lastSuccess = extractLastSuccessFromClob(clobContent);
        
        // 直接返回模型对象
        return new DataExchangeResult(name, status, lastSuccess);
    }

    public static List<DataExchangeResult> getDataExchangeInfo() {
        List<DataExchangeResult> resultList = new ArrayList<>();
        
        try (Connection conn = getDbConnection()) {
            String sql = "SELECT your_clob_column FROM data_exchange_reports";
            try (PreparedStatement stmt = conn.prepareStatement(sql);
                 ResultSet rs = stmt.executeQuery()) {
                
                while (rs.next()) {
                    Clob clob = rs.getClob("your_clob_column");
                    DataExchangeResult result = parseClobToResult(clob);
                    resultList.add(result);
                }
            }
        } catch (SQLException | IOException e) {
            // 这里建议用日志框架记录异常,而不是直接打印
            e.printStackTrace();
        }
        
        return resultList;
    }

    // 辅助方法:读取CLOB到字符串
    private static String readClobToString(Clob clob) throws SQLException, IOException {
        try (Reader reader = clob.getCharacterStream()) {
            StringBuilder sb = new StringBuilder();
            char[] buffer = new char[1024];
            int readLen;
            while ((readLen = reader.read(buffer)) != -1) {
                sb.append(buffer, 0, readLen);
            }
            return sb.toString();
        }
    }

    // 以下是你的字段提取逻辑,根据实际情况实现
    private static String extractNameFromClob(String clobContent) {
        // 替换成你的解析逻辑,比如用JSONPath或者正则
        return "";
    }

    private static String extractStatusFromClob(String clobContent) {
        return "";
    }

    private static LocalDateTime extractLastSuccessFromClob(String clobContent) {
        return null;
    }
}
3. 使用模型对象执行数据检查与计算

现在你拿到的是List<DataExchangeResult>,可以直接调用模型类里的方法完成各种操作,代码可读性和可维护性拉满:

import java.time.Duration;
import java.util.List;
import java.io.FileWriter;
import java.io.IOException;

public class BusinessProcessor {
    public static void main(String[] args) {
        List<DataExchangeResult> results = DataExchangeExecReport.getDataExchangeInfo();
        
        for (DataExchangeResult result : results) {
            // 执行数据检查:判断是否超过7天未成功
            boolean isOverdue = result.isOverdue(Duration.ofDays(7));
            if (isOverdue) {
                System.out.printf("警告:数据交换[%s]已超过7天未成功,当前状态:%s%n", 
                                  result.getName(), result.getStatusDescription());
            }
            
            // 生成JSON并写入文件
            try (FileWriter writer = new FileWriter(result.getName() + "_report.json")) {
                writer.write(result.toJson().toString(4)); // 格式化JSON输出
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
额外优化:职责单一化(可选)

如果数据库访问逻辑比较复杂,还可以把这部分抽成单独的DAO类(比如DataExchangeDao),让DataExchangeExecReport专注于业务逻辑组装,进一步降低耦合度。


内容的提问来源于stack exchange,提问作者Phoenix

火山引擎 最新活动