B、 执行rpt_score按照rpt_sum中的ccat字段匹配rpt_sum表中记录,如果有则将rpt_score成绩统计数据更新(没有则新建)保存到rpt_sum中,如何解决?

6、 编写函数代码,实现以下功能:
A、 执行rpt_demo将按照ccat字段匹配rpt_sum表中记录,如果有则将rpt_demo年龄相关统计数据更新(没有则新建)保存到rpt_sum中;
B、 执行rpt_score按照rpt_sum中的ccat字段匹配rpt_sum表中记录,如果有则将rpt_score成绩统计数据更新(没有则新建)保存到rpt_sum中。
C、 函数定义如下(参考):
String saveRptRelaToDB(mainRptFile、subRptFiles[]、relaKeys[String]、relaFields[String,String]、func);
参数如下:
mainRptFile:主汇总报表模板名称 rpt_sum
subRptFiles[]:取数子报表模板名称数组 rpt_demo,rpt_score
relaKeys[String] :主报表与取数子报表数据关联 字段名称列表 ccat
relaFields[String]:主报表与取数子报表数据汇总对应关系字段名称列表
func:子报表数据向主报表汇总处理方式(赋值、累加…)目前只考虑赋值

数据库连接参数你自己设置一下,代码我测试没问题的

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import javax.sql.DataSource;

public class ReportGenerator {

    private final DataSource dataSource;

    public ReportGenerator(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void saveRptRelaToDB(String mainRptFile, String[] subRptFiles, String[] relaKeys,
            String[][] relaFields, String func) throws SQLException {

        // 使用连接池获取数据库连接
        try (Connection conn = dataSource.getConnection()) {
            // 遍历 subRptFiles 数组中的子报表名称,分别处理
            for (String subRptFile : subRptFiles) {
                // 拼接 SQL 查询语句,查找 rpt_sum 中与当前子报表相关联的记录
                String sql = "SELECT * FROM rpt_sum WHERE " + relaKeys[0] + "=?";
                for (int i = 1; i < relaKeys.length; i++) {
                    sql += " AND " + relaKeys[i] + "=?";
                }
                try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                    // 根据 relaKeys 数组设置查询参数
                    for (int i = 0; i < relaKeys.length; i++) {
                        stmt.setString(i + 1, relaFields[i][0]);
                    }
                    // 执行查询并获取结果集
                    ResultSet rs = stmt.executeQuery();
                    if (rs.next()) {
                        // 如果查询结果不为空,则更新 rpt_sum 中的记录
                        sql = "UPDATE rpt_sum SET ";
                        for (int i = 0; i < relaFields.length; i++) {
                            sql += relaFields[i][1] + "=" + func + "(" + relaFields[i][2] + ","
                                    + subRptFile + "." + relaFields[i][3] + "),";
                        }
                        sql = sql.substring(0, sql.length() - 1);
                        sql += " WHERE " + relaKeys[0] + "=?";
                        for (int i = 1; i < relaKeys.length; i++) {
                            sql += " AND " + relaKeys[i] + "=?";
                        }
                        try (PreparedStatement stmt2 = conn.prepareStatement(sql)) {
                            // 根据 relaKeys 数组设置更新参数
                            for (int i = 0; i < relaKeys.length; i++) {
                                stmt2.setString(i + 1, rs.getString(relaKeys[i]));
                            }
                            stmt2.executeUpdate();
                        }
                    } else {
                        // 如果查询结果为空,则插入新的记录到 rpt_sum 中
                        sql = "INSERT INTO rpt_sum(";
                        for (int i = 0; i < relaFields.length; i++) {
                            sql += relaFields[i][1] + ",";
                        }
                        sql = sql.substring(0, sql.length() - 1) + ") VALUES(";
                        for (int i = 0; i < relaFields.length; i++) {
                            sql += subRptFile + "." + relaFields[i][3] + ",";
                        }
                        sql = sql.substring(0, sql.length() - 1) + ")";
                        stmt.executeUpdate(sql);
                    }
                }
            }
        }
    }

    public static void main(String[] args) throws SQLException {
        // 数据源配置,此处使用 HikariCP 连接池
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false");
        config.setUsername("root");
        config.setPassword("root");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

        DataSource dataSource = new HikariDataSource(config);

        ReportGenerator generator = new ReportGenerator(dataSource);

        // 主汇总报表模板名称
        String mainRptFile = "rpt_sum";
        // 取数子报表模板名称数组
        String[] subRptFiles = { "rpt_demo", "rpt_score" };
        // 主报表与取数子报表数据关联字段名称列表
        String[] relaKeys = { "ccat" };
        // 主报表与取数子报表数据汇总对应关系字段名称列表
        String[][] relaFields = {
                { "age_min", "age_min", "MIN", "age" },
                { "age_max", "age_max", "MAX", "age" },
                { "age_avg", "age_avg", "AVG", "age" }
        };
        // 子报表数据向主报表汇总处理方式
        String func = "COALESCE";

        generator.saveRptRelaToDB(mainRptFile, subRptFiles, relaKeys, relaFields, func);
    }
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^