Db2 type2和type4的区别

本文详细介绍了IBM DB2的JDBC驱动程序,包括新的通用驱动com.ibm.db2.jcc.DB2Driver及其所在文件db2jcc.jar和sqlj.zip。此外还对比了Legacy驱动与通用驱动之间的主要区别,以及类型2与类型4驱动的不同之处。

今天晚了明天写不好意思。

IBM db2的新驱动程序名称为com.ibm.db2.jcc.DB2Driver,它包含在db2jcc.jar文件和sqlj.zip文件里。db2jcc.jar文件包含JDBC驱动程序和SQLJ运行时实现,sqlj.zip文件包含标准SQLJ预编译器的参考实现。sqlj.zip中的SQLJRuntime会调用db2jcc.jar中的JDBC驱动。

  在DB2 JDBC/SQLJ通用驱动程序推出之前,Legacy jdbc 驱动程序依赖于CLI,类型1的驱动名称是com.ibm.db2.app.DB2Driver,类型3的驱动程序名字是com.ibm.db2.net.DB2Driver.这些Legacy程序包含在db2java.zip中。通用驱动程序从架构上除了Legacy驱动程序对CLI(ODBC)的依赖。通用驱动程序同时支持类型2和类型4,这两种类型的主要区别在于:

一。类型2驱动通过C公共客户端代码(CCC)建立到数据库的连接,CCC也被CLI和旧JDBC驱动(app/net)使用。类型2驱动使用CCC,使得它能够使用CCC支持数据服务器中以支持JAVA存储过程(类型4驱动可以调用各种存储过程,但是不能再服务器端使用).如果访问本地数据服务器,类型2驱动通过共享内存连接会非常快。类型2驱动如果在连接URL中使用数据库别名,那么,对应的航速据库必须被编目(可以通过CLP命令或者是DB2配置助手来编目)。需要注意的是,类型2驱动也可以使用TCP/IP连接,这时,需要在URL里制定主机名和断口号;

二。类型2驱动需要安装相应的DLL/共享Object,而且在客户端需要安装本地DB2数据库服务器或者db2 connect,类型4驱动则是“纯Java"的实现,更容易安装,大部分IBM的测评表明,类型4的驱动性能比Legacy好,但是比类型2差。

三。类型4驱动程序支持更多的安全机制,有些安全机制被DB2服务器支持但是不被CCC支持

四。如果使用Datasource,这两种连接的区别就表现在属性”driverType“上,这个属性取值2就会载入类型2驱动程序(默认值),取值4就会载入类型4驱动程序。

我们现在需要 **调整输出结构**:将每个季度、每个责任单位的 `type1` 到 `type4` 的数量合并到 **同一条记录中**,而不是每种类型单独一行。 --- ### ✅ 新目标:输出格式 希望得到一个 `List<QuarterDutyTypeSummary>`,每条数据表示: ```java class QuarterDutyTypeSummary { private String year; private String quarter; // Q1/Q2/Q3/Q4 private String dutyUnit; // 责任单位 private Long type1Count; private Long type2Count; private Long type3Count; private Long type4Count; } ``` 例如: ```json { "year": "2024", "quarter": "Q1", "dutyUnit": "单位A", "type1Count": 5, "type2Count": 3, "type3Count": 0, "type4Count": 2 } ``` 这样更便于展示为表格或插入宽表。 --- ### ✅ 修改后的 Java 代码 ```java import java.util.*; import java.util.stream.Collectors; // 结果类:每个责任单位在某个季度的四类统计汇总 class QuarterDutyTypeSummary { private String year; private String quarter; private String dutyUnit; private Long type1Count; private Long type2Count; private Long type3Count; private Long type4Count; public QuarterDutyTypeSummary(String year, String quarter, String dutyUnit) { this.year = year; this.quarter = quarter; this.dutyUnit = dutyUnit; this.type1Count = 0L; this.type2Count = 0L; this.type3Count = 0L; this.type4Count = 0L; } // Getter Setter public String getYear() { return year; } public void setYear(String year) { this.year = year; } public String getQuarter() { return quarter; } public void setQuarter(String quarter) { this.quarter = quarter; } public String getDutyUnit() { return dutyUnit; } public void setDutyUnit(String dutyUnit) { this.dutyUnit = dutyUnit; } public Long getType1Count() { return type1Count; } public void setType1Count(Long type1Count) { this.type1Count = type1Count; } public Long getType2Count() { return type2Count; } public void setType2Count(Long type2Count) { this.type2Count = type2Count; } public Long getType3Count() { return type3Count; } public void setType3Count(Long type3Count) { this.type3Count = type3Count; } public Long getType4Count() { return type4Count; } public void setType4Count(Long type4Count) { this.type4Count = type4Count; } } // 统计处理器 class StatSummaryCalculator { public static List<QuarterDutyTypeSummary> calculate(List<PersonFourthPatternDto> dataList) { String currentYear = String.valueOf(Calendar.getInstance().get(Calendar.YEAR)); return dataList.stream() .filter(dto -> currentYear.equals(dto.getYear())) .map(dto -> { try { int m = Integer.parseInt(dto.getMonth().trim()); if (m >= 1 && m <= 12) return dto; } catch (Exception e) { System.err.println("无效月份: " + dto.getMonth()); } return null; }) .filter(Objects::nonNull) // 按 quarter dutyUnit 分组 .collect(Collectors.groupingBy( dto -> { int month = Integer.parseInt(dto.getMonth()); return "Q" + ((month - 1) / 3 + 1); }, Collectors.groupingBy(PersonFourthPatternDto::getDutyUnit) )) .entrySet() .stream() .flatMap(quarterEntry -> quarterEntry.getValue().entrySet().stream() .map(dutyUnitEntry -> { QuarterDutyTypeSummary summary = new QuarterDutyTypeSummary( currentYear, quarterEntry.getKey(), dutyUnitEntry.getKey() ); // 初始化 counts long[] counts = new long[5]; // index 1~4 对应 type1~4 dutyUnitEntry.getValue().forEach(dto -> { switch (dto.getType()) { case "type1": counts[1]++; break; case "type2": counts[2]++; break; case "type3": counts[3]++; break; case "type4": counts[4]++; break; default: break; // 忽略非法类型 } }); summary.setType1Count(counts[1]); summary.setType2Count(counts[2]); summary.setType3Count(counts[3]); summary.setType4Count(counts[4]); return summary; }) ) .collect(Collectors.toList()); } } ``` --- ### ✅ 输出示例 输入数据: ```java List<PersonFourthPatternDto> data = Arrays.asList( new PersonFourthPatternDto("2024", "1", "单位A", "type1"), new PersonFourthPatternDto("2024", "2", "单位A", "type1"), new PersonFourthPatternDto("2024", "3", "单位A", "type2"), new PersonFourthPatternDto("2024", "4", "单位B", "type3"), new PersonFourthPatternDto("2024", "5", "单位B", "type4"), new PersonFourthPatternDto("2024", "6", "单位B", "type4") ); ``` 输出结果: ```json [ { "year": "2024", "quarter": "Q1", "dutyUnit": "单位A", "type1Count": 2, "type2Count": 1, "type3Count": 0, "type4Count": 0 }, { "year": "2024", "quarter": "Q2", "dutyUnit": "单位B", "type1Count": 0, "type2Count": 0, "type3Count": 1, "type4Count": 2 } ] ``` --- ### ✅ 对应数据库表设计(宽表) ```sql CREATE TABLE person_fourth_summary ( id BIGINT AUTO_INCREMENT PRIMARY KEY, year VARCHAR(4) NOT NULL, quarter VARCHAR(2) NOT NULL, duty_unit VARCHAR(100) NOT NULL, type1_count BIGINT DEFAULT 0, type2_count BIGINT DEFAULT 0, type3_count BIGINT DEFAULT 0, type4_count BIGINT DEFAULT 0, UNIQUE KEY uk_year_quarter_duty (year, quarter, duty_unit) ); ``` --- ### ✅ MyBatis 插入语句(批量 upsert) ```xml <insert id="batchUpsertSummary" parameterType="java.util.List"> INSERT INTO person_fourth_summary ( year, quarter, duty_unit, type1_count, type2_count, type3_count, type4_count ) VALUES <foreach collection="list" item="item" separator=","> ( #{item.year}, #{item.quarter}, #{item.dutyUnit}, #{item.type1Count}, #{item.type2Count}, #{item.type3Count}, #{item.type4Count} ) </foreach> ON DUPLICATE KEY UPDATE type1_count = VALUES(type1_count), type2_count = VALUES(type2_count), type3_count = VALUES(type3_count), type4_count = VALUES(type4_count) </insert> ``` --- ### ✅ Mapper 接口 ```java @Mapper public interface SummaryMapper { void batchUpsertSummary(@Param("list") List<QuarterDutyTypeSummary> summaries); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值