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);
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话: