diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 6e7df1b..b4bf926 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -10,7 +10,7 @@ - + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 87d5efa..c80cdea 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,53 +1,108 @@ + + \ No newline at end of file diff --git a/.idea/libraries/Maven__antlr_antlr_2_7_7.xml b/.idea/libraries/Maven__antlr_antlr_2_7_7.xml index b8d93d8..f4a1b2e 100644 --- a/.idea/libraries/Maven__antlr_antlr_2_7_7.xml +++ b/.idea/libraries/Maven__antlr_antlr_2_7_7.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__asm_asm_3_1.xml b/.idea/libraries/Maven__asm_asm_3_1.xml index 3386f10..4ff2869 100644 --- a/.idea/libraries/Maven__asm_asm_3_1.xml +++ b/.idea/libraries/Maven__asm_asm_3_1.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_101tec_zkclient_0_3.xml b/.idea/libraries/Maven__com_101tec_zkclient_0_3.xml index f202d28..bd1d97c 100644 --- a/.idea/libraries/Maven__com_101tec_zkclient_0_3.xml +++ b/.idea/libraries/Maven__com_101tec_zkclient_0_3.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_alibaba_fastjson_1_1_41.xml b/.idea/libraries/Maven__com_alibaba_fastjson_1_1_41.xml index 08dbed5..21334fa 100644 --- a/.idea/libraries/Maven__com_alibaba_fastjson_1_1_41.xml +++ b/.idea/libraries/Maven__com_alibaba_fastjson_1_1_41.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_clearspring_analytics_stream_2_7_0.xml b/.idea/libraries/Maven__com_clearspring_analytics_stream_2_7_0.xml index 1980df6..ae849fa 100644 --- a/.idea/libraries/Maven__com_clearspring_analytics_stream_2_7_0.xml +++ b/.idea/libraries/Maven__com_clearspring_analytics_stream_2_7_0.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_esotericsoftware_kryo_kryo_2_21.xml b/.idea/libraries/Maven__com_esotericsoftware_kryo_kryo_2_21.xml index 517684f..88295a8 100644 --- a/.idea/libraries/Maven__com_esotericsoftware_kryo_kryo_2_21.xml +++ b/.idea/libraries/Maven__com_esotericsoftware_kryo_kryo_2_21.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_esotericsoftware_minlog_minlog_1_2.xml b/.idea/libraries/Maven__com_esotericsoftware_minlog_minlog_1_2.xml index f926eec..95904bc 100644 --- a/.idea/libraries/Maven__com_esotericsoftware_minlog_minlog_1_2.xml +++ b/.idea/libraries/Maven__com_esotericsoftware_minlog_minlog_1_2.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_esotericsoftware_reflectasm_reflectasm_shaded_1_07.xml b/.idea/libraries/Maven__com_esotericsoftware_reflectasm_reflectasm_shaded_1_07.xml index 39b43af..cd61a32 100644 --- a/.idea/libraries/Maven__com_esotericsoftware_reflectasm_reflectasm_shaded_1_07.xml +++ b/.idea/libraries/Maven__com_esotericsoftware_reflectasm_reflectasm_shaded_1_07.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_4_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_4_3.xml index 42a8d5b..9ecc9b1 100644 --- a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_4_3.xml +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_4_3.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_4_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_4_3.xml index fc3ea3f..61cfdeb 100644 --- a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_4_3.xml +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_4_3.xml @@ -1,13 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_math3_3_4_1.xml b/.idea/libraries/Maven__org_apache_commons_commons_math3_3_4_1.xml index 19bf20f..e91f94e 100644 --- a/.idea/libraries/Maven__org_apache_commons_commons_math3_3_4_1.xml +++ b/.idea/libraries/Maven__org_apache_commons_commons_math3_3_4_1.xml @@ -1,12 +1,27 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_curator_curator_client_2_1_0_incubating.xml b/.idea/libraries/Maven__org_apache_curator_curator_client_2_1_0_incubating.xml index f32bd7d..e3ea302 100644 --- a/.idea/libraries/Maven__org_apache_curator_curator_client_2_1_0_incubating.xml +++ b/.idea/libraries/Maven__org_apache_curator_curator_client_2_1_0_incubating.xml @@ -1,12 +1,27 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_curator_curator_framework_2_4_0.xml b/.idea/libraries/Maven__org_apache_curator_curator_framework_2_4_0.xml index 26704ed..c4518f4 100644 --- a/.idea/libraries/Maven__org_apache_curator_curator_framework_2_4_0.xml +++ b/.idea/libraries/Maven__org_apache_curator_curator_framework_2_4_0.xml @@ -1,12 +1,27 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_curator_curator_recipes_2_4_0.xml b/.idea/libraries/Maven__org_apache_curator_curator_recipes_2_4_0.xml index a2a0cb9..efacccd 100644 --- a/.idea/libraries/Maven__org_apache_curator_curator_recipes_2_4_0.xml +++ b/.idea/libraries/Maven__org_apache_curator_curator_recipes_2_4_0.xml @@ -1,12 +1,43 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_derby_derby_10_10_2_0.xml b/.idea/libraries/Maven__org_apache_derby_derby_10_10_2_0.xml index c317510..035bb3b 100644 --- a/.idea/libraries/Maven__org_apache_derby_derby_10_10_2_0.xml +++ b/.idea/libraries/Maven__org_apache_derby_derby_10_10_2_0.xml @@ -1,12 +1,47 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_directory_api_api_asn1_api_1_0_0_M20.xml b/.idea/libraries/Maven__org_apache_directory_api_api_asn1_api_1_0_0_M20.xml index bd5ac37..e1c723a 100644 --- a/.idea/libraries/Maven__org_apache_directory_api_api_asn1_api_1_0_0_M20.xml +++ b/.idea/libraries/Maven__org_apache_directory_api_api_asn1_api_1_0_0_M20.xml @@ -1,12 +1,48 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_directory_api_api_util_1_0_0_M20.xml b/.idea/libraries/Maven__org_apache_directory_api_api_util_1_0_0_M20.xml index b3d86af..5cc4802 100644 --- a/.idea/libraries/Maven__org_apache_directory_api_api_util_1_0_0_M20.xml +++ b/.idea/libraries/Maven__org_apache_directory_api_api_util_1_0_0_M20.xml @@ -1,12 +1,48 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_directory_server_apacheds_i18n_2_0_0_M15.xml b/.idea/libraries/Maven__org_apache_directory_server_apacheds_i18n_2_0_0_M15.xml deleted file mode 100644 index 7a73f45..0000000 --- a/.idea/libraries/Maven__org_apache_directory_server_apacheds_i18n_2_0_0_M15.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_directory_server_apacheds_kerberos_codec_2_0_0_M15.xml b/.idea/libraries/Maven__org_apache_directory_server_apacheds_kerberos_codec_2_0_0_M15.xml index 5378216..5ddee77 100644 --- a/.idea/libraries/Maven__org_apache_directory_server_apacheds_kerberos_codec_2_0_0_M15.xml +++ b/.idea/libraries/Maven__org_apache_directory_server_apacheds_kerberos_codec_2_0_0_M15.xml @@ -1,13 +1,49 @@ + - + + + - + + + - + + + - + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_hadoop_hadoop_annotations_2_6_4.xml b/.idea/libraries/Maven__org_apache_hadoop_hadoop_annotations_2_6_4.xml index 1c70866..55605d7 100644 --- a/.idea/libraries/Maven__org_apache_hadoop_hadoop_annotations_2_6_4.xml +++ b/.idea/libraries/Maven__org_apache_hadoop_hadoop_annotations_2_6_4.xml @@ -1,12 +1,47 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_hadoop_hadoop_auth_2_6_4.xml b/.idea/libraries/Maven__org_apache_hadoop_hadoop_auth_2_6_4.xml index bd259f5..c386086 100644 --- a/.idea/libraries/Maven__org_apache_hadoop_hadoop_auth_2_6_4.xml +++ b/.idea/libraries/Maven__org_apache_hadoop_hadoop_auth_2_6_4.xml @@ -1,12 +1,47 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_hadoop_hadoop_client_2_6_4.xml b/.idea/libraries/Maven__org_apache_hadoop_hadoop_client_2_6_4.xml index d878f24..af782d6 100644 --- a/.idea/libraries/Maven__org_apache_hadoop_hadoop_client_2_6_4.xml +++ b/.idea/libraries/Maven__org_apache_hadoop_hadoop_client_2_6_4.xml @@ -1,12 +1,47 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_hadoop_hadoop_common_2_6_4.xml b/.idea/libraries/Maven__org_apache_hadoop_hadoop_common_2_6_4.xml index 7fc38ff..3081dc0 100644 --- a/.idea/libraries/Maven__org_apache_hadoop_hadoop_common_2_6_4.xml +++ b/.idea/libraries/Maven__org_apache_hadoop_hadoop_common_2_6_4.xml @@ -1,12 +1,47 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_hadoop_hadoop_hdfs_2_6_4.xml b/.idea/libraries/Maven__org_apache_hadoop_hadoop_hdfs_2_6_4.xml index 7e8e8d4..fd77afb 100644 --- a/.idea/libraries/Maven__org_apache_hadoop_hadoop_hdfs_2_6_4.xml +++ b/.idea/libraries/Maven__org_apache_hadoop_hadoop_hdfs_2_6_4.xml @@ -1,12 +1,46 @@ + + + + + + + + diff --git a/.idea/libraries/Maven__org_apache_hadoop_hadoop_mapreduce_client_app_2_6_4.xml b/.idea/libraries/Maven__org_apache_hadoop_hadoop_mapreduce_client_app_2_6_4.xml index f76a61b..6c5a209 100644 --- a/.idea/libraries/Maven__org_apache_hadoop_hadoop_mapreduce_client_app_2_6_4.xml +++ b/.idea/libraries/Maven__org_apache_hadoop_hadoop_mapreduce_client_app_2_6_4.xml @@ -1,12 +1,48 @@ + + + + + + + + diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml index e96534f..81bdfc1 100644 --- a/.idea/uiDesigner.xml +++ b/.idea/uiDesigner.xml @@ -1,123 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 6157b54..c2aaf03 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,54 +4,12 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - diff --git a/UserActionAnalyzePlatform.iml b/UserActionAnalyzePlatform.iml index 65c4040..fd179b6 100644 --- a/UserActionAnalyzePlatform.iml +++ b/UserActionAnalyzePlatform.iml @@ -1,6 +1,6 @@ - + diff --git a/pom.xml b/pom.xml index e10085e..89c17f0 100644 --- a/pom.xml +++ b/pom.xml @@ -144,6 +144,14 @@ 1.6 + + org.apache.maven.plugins + maven-compiler-plugin + + 7 + 7 + + diff --git a/src/main/java/cn/edu/hust/domain/SessionAggrStat.java b/src/main/java/cn/edu/hust/domain/SessionAggrStat.java index b5d4521..9188f00 100644 --- a/src/main/java/cn/edu/hust/domain/SessionAggrStat.java +++ b/src/main/java/cn/edu/hust/domain/SessionAggrStat.java @@ -2,28 +2,52 @@ package cn.edu.hust.domain; import java.io.Serializable; +// SessionAggrStat类定义,位于cn.edu.hust.domain包下,实现了Serializable接口,意味着该类的对象可以被序列化,方便进行存储、网络传输等操作 public class SessionAggrStat implements Serializable { + + // 以下是类的成员变量声明 + + // 任务ID,用于标识某个具体的任务,类型为Long private Long taskId; + // 会话数量,用于记录相关的会话统计数量,类型为Long private Long SessionCount; + // 访问时长在1秒 - 3秒区间的相关统计数据,类型为double,可能用于存储该时间段内访问情况的某种聚合统计值(具体含义需结合业务场景确定) private double visit_Length_1s_3s; + // 访问时长在4秒 - 6秒区间的相关统计数据,类型为double private double visit_Length_4s_6s; + // 访问时长在7秒 - 9秒区间的相关统计数据,类型为double private double visit_Length_7s_9s; + // 访问时长在10秒 - 30秒区间的相关统计数据,类型为double private double visit_Length_10s_30s; + // 访问时长在30秒 - 60秒区间的相关统计数据,类型为double private double visit_Length_30s_60s; + // 访问时长在1分钟 - 3分钟区间的相关统计数据,类型为double private double visit_Length_1m_3m; + // 访问时长在3分钟 - 10分钟区间的相关统计数据,类型为double private double visit_Length_3m_10m; + // 访问时长在10分钟 - 30分钟区间的相关统计数据,类型为double private double visit_Length_10m_30m; + // 访问时长大于30分钟的相关统计数据,类型为double private double visit_Length_30m; + // 步骤长度在1 - 3(具体单位需结合业务确定,可能是步长之类的概念)区间的相关统计数据,类型为double private double step_Length_1_3; + // 步骤长度在4 - 6区间的相关统计数据,类型为double private double step_Length_4_6; + // 步骤长度在7 - 9区间的相关统计数据,类型为double private double step_Length_7_9; + // 步骤长度在10 - 30区间的相关统计数据,类型为double private double step_Length_10_30; + // 步骤长度在30 - 60区间的相关统计数据,类型为double private double step_Length_30_60; + // 步骤长度大于60(同样单位需结合业务确定)的相关统计数据,类型为double private double step_Length_60; + // 默认构造函数,用于创建SessionAggrStat类的对象实例,当通过无参方式创建对象时会调用此构造函数,目前构造函数内没有执行额外的初始化逻辑 public SessionAggrStat() { } + // 设置方法,用于一次性设置SessionAggrStat类对象的多个属性值 + // 参数依次对应各个成员变量,通过此方法可以方便地对对象的所有相关属性进行赋值操作 public void set(Long taskId, Long sessionCount, double visit_Length_1s_3s, double visit_Length_4s_6s, double visit_Length_7s_9s, double visit_Length_10s_30s, double visit_Length_30s_60s, double visit_Length_1m_3m, double visit_Length_3m_10m, double visit_Length_10m_30m, double visit_Length_30m, double step_Length_1_3, double step_Length_4_6, double step_Length_7_9, double step_Length_10_30, double step_Length_30_60, double step_Length_60) { this.taskId = taskId; SessionCount = sessionCount; @@ -44,139 +68,173 @@ public class SessionAggrStat implements Serializable { this.step_Length_60 = step_Length_60; } + // 获取任务ID的方法,返回类型为Long,外部代码可以通过调用此方法获取当前对象的taskId属性值 public Long getTaskId() { return taskId; } + // 设置任务ID的方法,用于更新当前对象的taskId属性值,外部代码可以通过调用此方法传入新的任务ID来修改对应属性 public void setTaskId(Long taskId) { this.taskId = taskId; } + // 获取会话数量的方法,返回类型为Long,用于获取当前对象的SessionCount属性值 public Long getSessionCount() { return SessionCount; } + // 设置会话数量的方法,通过传入参数来更新当前对象的SessionCount属性值 public void setSessionCount(Long sessionCount) { SessionCount = sessionCount; } + // 获取访问时长在1秒 - 3秒区间统计数据的方法,返回类型为double,用于获取visit_Length_1s_3s属性值 public double getVisit_Length_1s_3s() { return visit_Length_1s_3s; } + // 设置访问时长在1秒 - 3秒区间统计数据的方法,通过传入参数来更新visit_Length_1s_3s属性值 public void setVisit_Length_1s_3s(double visit_Length_1s_3s) { this.visit_Length_1s_3s = visit_Length_1s_3s; } + // 获取访问时长在4秒 - 6秒区间统计数据的方法,返回类型为double,用于获取visit_Length_4s_6s属性值 public double getVisit_Length_4s_6s() { return visit_Length_4s_6s; } + // 设置访问时长在4秒 - 6秒区间统计数据的方法,通过传入参数来更新visit_Length_4s_6s属性值 public void setVisit_Length_4s_6s(double visit_Length_4s_6s) { this.visit_Length_4s_6s = visit_Length_4s_6s; } + // 获取访问时长在7秒 - 9秒区间统计数据的方法,返回类型为double,用于获取visit_Length_7s_9s属性值 public double getVisit_Length_7s_9s() { return visit_Length_7s_9s; } + // 设置访问时长在7秒 - 9秒区间统计数据的方法,通过传入参数来更新visit_Length_7s_9s属性值 public void setVisit_Length_7s_9s(double visit_Length_7s_9s) { this.visit_Length_7s_9s = visit_Length_7s_9s; } + // 获取访问时长在10秒 - 30秒区间统计数据的方法,返回类型为double,用于获取visit_Length_10s_30s属性值 public double getVisit_Length_10s_30s() { return visit_Length_10s_30s; } + // 设置访问时长在10秒 - 30秒区间统计数据的方法,通过传入参数来更新visit_Length_10s_30s属性值 public void setVisit_Length_10s_30s(double visit_Length_10s_30s) { this.visit_Length_10s_30s = visit_Length_10s_30s; } + // 获取访问时长在30秒 - 60秒区间统计数据的方法,返回类型为double,用于获取visit_Length_30s_60s属性值 public double getVisit_Length_30s_60s() { return visit_Length_30s_60s; } + // 设置访问时长在30秒 - 60秒区间统计数据的方法,通过传入参数来更新visit_Length_30s_60s属性值 public void setVisit_Length_30s_60s(double visit_Length_30s_60s) { this.visit_Length_30s_60s = visit_Length_30s_60s; } + // 获取访问时长在1分钟 - 3分钟区间统计数据的方法,返回类型为double,用于获取visit_Length_1m_3m属性值 public double getVisit_Length_1m_3m() { return visit_Length_1m_3m; } + // 设置访问时长在1分钟 - 3分钟区间统计数据的方法,通过传入参数来更新visit_Length_1m_3m属性值 public void setVisit_Length_1m_3m(double visit_Length_1m_3m) { this.visit_Length_1m_3m = visit_Length_1m_3m; } + // 获取访问时长在3分钟 - 10分钟区间统计数据的方法,返回类型为double,用于获取visit_Length_3m_10m属性值 public double getVisit_Length_3m_10m() { return visit_Length_3m_10m; } + // 设置访问时长在3分钟 - 10分钟区间统计数据的方法,通过传入参数来更新visit_Length_3m_10m属性值 public void setVisit_Legth_3m_10m(double visit_Legth_3m_10m) { this.visit_Length_3m_10m = visit_Legth_3m_10m; } + // 获取访问时长在10分钟 - 30分钟区间统计数据的方法,返回类型为double,用于获取visit_Length_10m_30m属性值 public double getVisit_Length_10m_30m() { return visit_Length_10m_30m; } + // 设置访问时长在10分钟 - 30分钟区间统计数据的方法,通过传入参数来更新visit_Length_10m_30m属性值 public void setVisit_Length_10m_30m(double visit_Length_10m_30m) { this.visit_Length_10m_30m = visit_Length_10m_30m; } + // 获取访问时长大于30分钟统计数据的方法,返回类型为double,用于获取visit_Length_30m属性值 public double getVisit_Length_30m() { return visit_Length_30m; } + // 设置访问时长大于30分钟统计数据的方法,通过传入参数来更新visit_Length_30m属性值 public void setVisit_Length_30m(double visit_Length_30m) { this.visit_Length_30m = visit_Length_30m; } + // 获取步骤长度在1 - 3区间统计数据的方法,返回类型为double,用于获取step_Length_1_3属性值 public double getStep_Length_1_3() { return step_Length_1_3; } + // 设置步骤长度在1 - 3区间统计数据的方法,通过传入参数来更新step_Length_1_3属性值 public void setStep_Length_1_3(double step_Length_1_3) { this.step_Length_1_3 = step_Length_1_3; } + // 获取步骤长度在4 - 6区间统计数据的方法,返回类型为double,用于获取step_Length_4_6属性值 public double getStep_Length_4_6() { return step_Length_4_6; } + // 设置步骤长度在4 - 6区间统计数据的方法,通过传入参数来更新step_Length_4_6属性值 public void setStep_Length_4_6(double step_Length_4_6) { this.step_Length_4_6 = step_Length_4_6; } + // 获取步骤长度在7 - 9区间统计数据的方法,返回类型为double,用于获取step_Length_7_9属性值 public double getStep_Length_7_9() { return step_Length_7_9; } + // 设置步骤长度在7 - 9区间统计数据的方法,通过传入参数来更新step_Length_7_9属性值 public void setStep_Length_7_9(double step_Length_7_9) { this.step_Length_7_9 = step_Length_7_9; } + // 获取步骤长度在10 - 30区间统计数据的方法,返回类型为double,用于获取step_Length_10_30属性值 public double getStep_Length_10_30() { return step_Length_10_30; } + // 设置步骤长度在10 - 30区间统计数据的方法,通过传入参数来更新step_Length_10_30属性值 public void setStep_Length_10_30(double step_Length_10_30) { this.step_Length_10_30 = step_Length_10_30; } + // 获取步骤长度在30 - 60区间统计数据的方法,返回类型为double,用于获取step_Length_30_60属性值 public double getStep_Length_30_60() { return step_Length_30_60; } + // 设置步骤长度在30 - 60区间统计数据的方法,通过传入参数来更新step_Length_30_60属性值 public void setStep_Length_30_60(double step_Length_30_60) { this.step_Length_30_60 = step_Length_30_60; } + // 获取步骤长度大于60统计数据的方法,返回类型为double,用于获取step_Length_60属性值 public double getStep_Length_60() { return step_Length_60; } + // 设置步骤长度大于60统计数据的方法,通过传入参数来更新step_Length_60属性值 public void setStep_Length_60(double step_Length_60) { this.step_Length_60 = step_Length_60; } -} +} \ No newline at end of file diff --git a/src/main/java/cn/edu/hust/domain/SessionDetail.java b/src/main/java/cn/edu/hust/domain/SessionDetail.java index e438d25..c2bf387 100644 --- a/src/main/java/cn/edu/hust/domain/SessionDetail.java +++ b/src/main/java/cn/edu/hust/domain/SessionDetail.java @@ -2,23 +2,54 @@ package cn.edu.hust.domain; import java.io.Serializable; -public class SessionDetail implements Serializable{ +// SessionDetail类,实现了Serializable接口,这意味着该类的对象可以进行序列化与反序列化操作, +// 常用于在诸如网络传输、将对象持久化存储到文件等场景下,方便对象的保存和后续恢复使用。 +public class SessionDetail implements Serializable { + + // 任务ID,用于唯一标识某个相关任务,在涉及多任务处理的系统中,通过它可以区分不同任务所对应的会话详情信息。 private Long taskId; + + // 用户ID,用于唯一标识系统中的用户,通过它可以关联到具体是哪个用户产生的该会话相关操作记录。 private Long userId; + + // 会话ID,用于唯一标识一次会话,在整个系统中不同的会话具有不同的该ID值,通过它可以区分不同的会话实例。 + // (此处变量名拼写有误,应为sessionId,以下按正确语义进行注释说明) private String sessinId; + + // 页面ID,可能用于标识用户在会话期间访问的具体页面,不同页面具有不同的ID,方便记录用户的页面访问轨迹等情况。 private Long pageid; + + // 操作时间,用于记录用户在会话中执行某个操作(如点击、搜索等)的具体时间点,格式应该遵循一定的时间表示规范(具体取决于业务实现)。 private String actionTime; + + // 搜索关键词,当用户在会话过程中进行搜索操作时,记录用户输入的搜索关键词内容,可用于分析用户的搜索偏好等。 private String searchKeyWord; + + // 点击的商品分类ID,当用户在会话中点击了某个商品分类时,记录该分类对应的唯一标识ID,便于后续统计分析各分类的点击情况。 private Long clickCategoryId; + + // 点击的商品ID,当用户在会话中点击了某个具体商品时,记录该商品对应的唯一标识ID,有助于跟踪用户对具体商品的关注情况。 private Long clickProductId; + + // 下单的商品分类IDs,以某种特定格式(如逗号分隔的字符串等)记录用户在本次会话中下单的所有商品所属分类的ID集合,方便分析不同分类商品的下单情况。 private String orderCategoryIds; + + // 下单的商品IDs,以某种特定格式(如逗号分隔的字符串等)记录用户在本次会话中下单的所有商品的ID集合,用于追踪具体哪些商品被用户下单购买了。 private String orderProductIds; + + // 支付的商品分类IDs,以某种特定格式(如逗号分隔的字符串等)记录用户在本次会话中完成支付的所有商品所属分类的ID集合,可用于统计各分类商品的支付情况。 private String payCategoryIds; + + // 支付的商品IDs,以某种特定格式(如逗号分隔的字符串等)记录用户在本次会话中完成支付的所有商品的ID集合,用于明确具体哪些商品最终被用户成功支付购买了。 private String payProductIds; + // 无参构造函数,用于创建SessionDetail类的实例对象, + // 当通过默认方式(如:SessionDetail obj = new SessionDetail();)实例化该类对象时会调用此构造函数。 public SessionDetail() { } + // 设置方法,用于一次性设置SessionDetail类对象的所有属性值, + // 参数按照顺序依次对应各个属性的值,调用此方法并传入相应数据可对对象的各个属性进行初始化赋值。 public void set(Long taskId, Long userId, String sessinId, Long pageid, String actionTime, String searchKeyWord, Long clickCategoryId, Long clickProductId, String orderCategoryIds, String orderProductIds, String payCategoryIds, String payProductIds) { this.taskId = taskId; this.userId = userId; @@ -34,99 +65,123 @@ public class SessionDetail implements Serializable{ this.payProductIds = payProductIds; } + // 获取任务ID的方法,返回当前SessionDetail对象的任务ID属性值,外部代码可以通过调用此方法获取该对象关联的任务ID信息。 public Long getTaskId() { return taskId; } + // 设置任务ID的方法,用于给当前SessionDetail对象的任务ID属性赋值,外部代码可以通过调用此方法来更新该对象关联的任务ID信息。 public void setTaskId(Long taskId) { this.taskId = taskId; } + // 获取用户ID的方法,返回当前SessionDetail对象的用户ID属性值,方便外部代码获取该会话相关操作对应的用户标识。 public Long getUserId() { return userId; } + // 设置用户ID的方法,用于给当前SessionDetail对象的用户ID属性赋值,可用于更新该会话相关操作对应的用户标识信息。 public void setUserId(Long userId) { this.userId = userId; } + // 获取会话ID的方法,返回当前SessionDetail对象的会话ID属性值(尽管变量名拼写有误,但此处按功能注释),外部代码可通过此方法获取该会话的唯一标识。 public String getSessinId() { return sessinId; } + // 设置会话ID的方法,用于给当前SessionDetail对象的会话ID属性赋值(尽管变量名拼写有误,但此处按功能注释),可用于更新该会话的唯一标识信息。 public void setSessinId(String sessinId) { this.sessinId = sessinId; } + // 获取页面ID的方法,返回当前SessionDetail对象的页面ID属性值,外部代码可以调用此方法获取用户在会话中访问的页面标识信息。 public Long getPageid() { return pageid; } + // 设置页面ID的方法,用于给当前SessionDetail对象的页面ID属性赋值,外部代码可通过调用此方法来更新用户在会话中访问的页面标识信息。 public void setPageid(Long pageid) { this.pageid = pageid; } + // 获取操作时间的方法,返回当前SessionDetail对象的操作时间属性值,外部代码通过调用此方法可以获取用户执行操作的具体时间信息。 public String getActionTime() { return actionTime; } + // 设置操作时间的方法,用于给当前SessionDetail对象的操作时间属性赋值,外部代码可以调用此方法来更新用户执行操作的具体时间信息。 public void setActionTime(String actionTime) { this.actionTime = actionTime; } + // 获取搜索关键词的方法,返回当前SessionDetail对象的搜索关键词属性值,外部代码调用此方法可获取用户在会话中输入的搜索内容信息。 public String getSearchKeyWord() { return searchKeyWord; } + // 设置搜索关键词的方法,用于给当前SessionDetail对象的搜索关键词属性赋值,外部代码可通过调用此方法来更新用户在会话中输入的搜索内容信息。 public void setSearchKeyWord(String searchKeyWord) { this.searchKeyWord = searchKeyWord; } + // 获取点击的商品分类ID的方法,返回当前SessionDetail对象的点击商品分类ID属性值,外部代码通过调用此方法可以获取用户点击商品分类的相关标识信息。 public Long getClickCategoryId() { return clickCategoryId; } + // 设置点击的商品分类ID的方法,用于给当前SessionDetail对象的点击商品分类ID属性赋值,外部代码可通过调用此方法来更新用户点击商品分类的相关标识信息。 public void setClickCategoryId(Long clickCategoryId) { this.clickCategoryId = clickCategoryId; } + // 获取点击的商品ID的方法,返回当前SessionDetail对象的点击商品ID属性值,外部代码调用此方法可获取用户点击具体商品的相关标识信息。 public Long getClickProductId() { return clickProductId; } + // 设置点击的商品ID的方法,用于给当前SessionDetail对象的点击商品ID属性赋值,外部代码可通过调用此方法来更新用户点击具体商品的相关标识信息。 public void setClickProductId(Long clickProductId) { this.clickProductId = clickProductId; } + // 获取下单的商品分类IDs的方法,返回当前SessionDetail对象的下单商品分类IDs属性值,外部代码调用此方法可获取用户下单商品所属分类的相关标识集合信息。 public String getOrderCategoryIds() { return orderCategoryIds; } + // 设置下单的商品分类IDs的方法,用于给当前SessionDetail对象的下单商品分类IDs属性赋值,外部代码可通过调用此方法来更新用户下单商品所属分类的相关标识集合信息。 public void setOrderCategoryIds(String orderCategoryIds) { this.orderCategoryIds = orderCategoryIds; } + // 获取下单的商品IDs的方法,返回当前SessionDetail对象的下单商品IDs属性值,外部代码调用此方法可获取用户下单的具体商品的相关标识集合信息。 public String getOrderProductIds() { return orderProductIds; } + // 设置下单的商品IDs的方法,用于给当前SessionDetail对象的下单商品IDs属性赋值,外部代码可通过调用此方法来更新用户下单的具体商品的相关标识集合信息。 public void setOrderProductIds(String orderProductIds) { this.orderProductIds = orderProductIds; } + // 获取支付的商品分类IDs的方法,返回当前SessionDetail对象的支付商品分类IDs属性值,外部代码调用此方法可获取用户支付商品所属分类的相关标识集合信息。 public String getPayCategoryIds() { return payCategoryIds; } + // 设置支付的商品分类IDs的方法,用于给当前SessionDetail对象的支付商品分类IDs属性赋值,外部代码可通过调用此方法来更新用户支付商品所属分类的相关标识集合信息。 public void setPayCategoryIds(String payCategoryIds) { this.payCategoryIds = payCategoryIds; } + // 获取支付的商品IDs的方法,返回当前SessionDetail对象的支付商品IDs属性值,外部代码调用此方法可获取用户支付的具体商品的相关标识集合信息。 public String getPayProductIds() { return payProductIds; } + // 设置支付的商品IDs的方法,用于给当前SessionDetail对象的支付商品IDs属性赋值,外部代码可通过调用此方法来更新用户支付的具体商品的相关标识集合信息。 public void setPayProductIds(String payProductIds) { this.payProductIds = payProductIds; } -} +} \ No newline at end of file diff --git a/src/main/java/cn/edu/hust/domain/SessionRandomExtract.java b/src/main/java/cn/edu/hust/domain/SessionRandomExtract.java index 17b51a4..8311162 100644 --- a/src/main/java/cn/edu/hust/domain/SessionRandomExtract.java +++ b/src/main/java/cn/edu/hust/domain/SessionRandomExtract.java @@ -1,62 +1,183 @@ -package cn.edu.hust.domain; +package cn.edu.hust.domain; // 定义该类所在的包,包在Java中用于对类进行合理的组织分类,方便在项目里管理不同功能的模块,使得代码结构更加清晰有条理,不同业务相关的类可以放在对应的包下。 -import java.io.Serializable; +import java.io.Serializable; // 导入Serializable接口,表示该类的实例可以被序列化,序列化后的对象能够方便地进行存储,例如保存到文件中,或者在网络间进行传输,以满足不同的应用场景需求。 +/** + * SessionRandomExtract类用于表示从session数据中随机提取的用户行为信息。 + * 此类实现了Serializable接口,意味着它的对象能够进行序列化操作,这一特性使其在需要持久化存储或者在分布式系统中进行数据传输时非常有用, + * 可以方便地将对象状态转换为字节流形式,后续再进行反序列化还原对象状态,便于数据的共享与交互。 + */ public class SessionRandomExtract implements Serializable { + + // 类中的成员变量,用于存储相关的session信息,以下分别对各个成员变量进行详细说明。 + + // 任务ID,用于标识该session提取操作所属的任务,通常与数据处理的任务相关联。 + // 在存在多个不同的数据处理任务场景下,通过这个任务ID能够明确该条session相关信息是属于哪一个具体任务的,方便后续进行任务相关的统计、分析等操作。 private Long taskId; + + // 用户session的唯一标识符,通常用来表示一次用户访问的会话。 + // 它能够唯一区分不同的用户访问会话,在分析用户在单次访问过程中的行为、操作顺序以及时间跨度等方面起到关键作用,不同的访问会话具有不同的该标识符。 private String sessionId; + + // session开始时间,记录用户开始浏览的时间。 + // 这个时间信息对于分析用户的访问习惯、活跃时间段以及不同时间段的行为模式差异等有重要意义,例如可以统计某个时间段内的用户访问量等情况。 private String startTime; + + // 用户在session中使用的搜索关键词,用于分析用户的兴趣。 + // 通过收集和分析用户输入的搜索关键词,能够了解用户在此次访问过程中关注的内容、想要查找的信息,进而为个性化推荐、搜索引擎优化等业务提供数据支持。 private String searchKeyWords; + + // 用户在该session中点击的类别ID列表,通常用来分析用户的点击行为。 + // 可以根据这些点击的类别ID了解用户在浏览过程中对哪些类型的内容更感兴趣,比如商品类别、文章分类等,有助于进行用户行为画像、精准营销等相关业务操作。 private String click_category_ids; + /** + * 默认构造方法。 + * 其作用是在创建该类的实例时,初始化所有成员变量。 + * 虽然在这个方法里没有显式地给成员变量赋值初始化操作,但Java会为基本数据类型的成员变量赋予默认值(例如,Long类型默认值为null), + * 为对象类型成员变量创建一个初始的空对象引用,以此完成对象的初步构建,方便后续根据具体需求再通过setter方法等设置具体的值。 + */ public SessionRandomExtract() { } + /** + * 通过该构造方法,可以快速地为一个SessionRandomExtract对象设置所有字段的值。 + * 该方法提供了一种便捷的方式,在实例化对象后能一次性地传入各个属性对应的参数值,完成对象各成员变量的赋值操作, + * 避免了逐个调用setter方法来设置值的繁琐过程,提高了对象初始化的效率,尤其在批量创建和初始化对象时很有用。 + * + * @param taskId 任务ID,对应要设置的任务的唯一标识值,用于关联具体的数据处理任务。 + * @param sessionId 用户session ID,对应要设置的本次用户访问会话的唯一标识符。 + * @param startTime session开始时间,要设置的用户开始浏览的具体时间值,应符合相应的时间格式要求。 + * @param searchKeyWords 用户搜索的关键词,要设置的用户在此次会话中输入的用于搜索的关键词内容。 + * @param click_category_ids 用户点击的类别ID,要设置的用户在本次会话中点击的各类别对应的唯一标识符组成的列表内容,格式应符合业务约定。 + */ public void set(Long taskId, String sessionId, String startTime, String searchKeyWords, String click_category_ids) { + // 将任务ID赋值给类成员变量taskId,使得当前对象的任务ID属性存储传入的对应任务标识值,方便后续通过该属性获取任务相关信息。 this.taskId = taskId; + + // 将sessionId赋值给类成员变量sessionId,完成对当前对象的用户会话标识符的设置,用于唯一确定该次用户访问会话。 this.sessionId = sessionId; + + // 将session的开始时间赋值给startTime,以此确定该对象所代表的用户访问会话的起始时间信息,便于时间相关的业务分析。 this.startTime = startTime; + + // 将搜索的关键词赋值给searchKeyWords,用于记录用户在此次会话中输入的搜索内容,后续可用于分析用户兴趣点。 this.searchKeyWords = searchKeyWords; + + // 将点击的类别ID列表赋值给click_category_ids,方便后续分析用户在该会话中对不同类别内容的点击偏好情况。 this.click_category_ids = click_category_ids; } + // 以下是每个字段的getter和setter方法,用于获取和设置类的成员变量值,它们遵循Java的面向对象编程规范,方便对类的属性进行访问控制和修改操作。 + + /** + * 获取任务ID。 + * 外部代码可以通过调用此方法获取当前SessionRandomExtract对象所关联的任务ID, + * 以便在业务逻辑处理中,根据任务ID进行进一步的查询、统计或者关联其他相关数据等操作。 + * + * @return 当前对象的任务ID,返回类型为Long,返回的值就是该对象中存储的任务ID的具体数值。 + */ public Long getTaskId() { - return taskId; + return taskId; // 返回任务ID的值,即将当前对象的taskId成员变量的值返回给调用者。 } + /** + * 设置任务ID。 + * 外部代码可以调用此方法来更新当前SessionRandomExtract对象所关联的任务ID, + * 例如在数据更新、任务重新分配等业务场景下,需要改变对象对应的任务标识时,就可以使用这个方法进行赋值操作。 + * + * @param taskId 任务ID,参数类型为Long,传入的就是要设置给当前对象的新的任务ID值。 + */ public void setTaskId(Long taskId) { - this.taskId = taskId; + this.taskId = taskId; // 设置任务ID的值,将传入的taskId参数赋值给当前对象的taskId成员变量。 } + /** + * 获取session ID。 + * 调用此方法能够获取当前SessionRandomExtract对象所代表的用户访问会话的唯一标识符, + * 便于在诸如查询该会话的详细信息、关联其他相关会话数据等操作中使用这个ID值。 + * + * @return 当前对象的session ID,返回类型为String,返回的是存储在该对象中的session ID的具体内容。 + */ public String getSessionId() { - return sessionId; + return sessionId; // 返回session ID的值,也就是将当前对象的sessionId成员变量的值返回给调用者。 } + /** + * 设置session ID。 + * 该方法可用于外部代码对当前SessionRandomExtract对象所代表的用户访问会话标识符进行更新操作, + * 比如在会话标识规则变更、数据整合等情况下,需要改变对象对应的session ID时,可通过此方法来实现。 + * + * @param sessionId session ID,参数类型为String,传入的是要设置给当前对象的新的session ID值。 + */ public void setSessionId(String sessionId) { - this.sessionId = sessionId; + this.sessionId = sessionId; // 设置session ID的值,将传入的sessionId参数赋值给当前对象的sessionId成员变量。 } + /** + * 获取session开始时间。 + * 外部代码调用此方法可以获取当前SessionRandomExtract对象所代表的用户访问会话的开始时间, + * 这个数据可以用于分析用户的访问习惯、不同时间段的活跃度等情况,为业务决策提供参考依据,比如是否在特定时间段加大推广力度等。 + * + * @return 当前对象的session开始时间,返回类型为String,返回的值就是该对象中存储的session开始时间的具体内容。 + */ public String getStartTime() { - return startTime; + return startTime; // 返回session开始时间的值,即将当前对象的startTime成员变量的值返回给调用者。 } + /** + * 设置session开始时间。 + * 通过调用此方法,外部代码可以更新当前SessionRandomExtract对象所代表的用户访问会话的开始时间数据, + * 例如在时间数据校准、数据录入错误修正等业务场景下,需要修改开始时间的具体内容时,就可以使用这个方法进行赋值操作。 + * + * @param startTime session开始时间,参数类型为String,传入的是要设置给当前对象的新的session开始时间值。 + */ public void setStartTime(String startTime) { - this.startTime = startTime; + this.startTime = startTime; // 设置session开始时间的值,将传入的startTime参数赋值给当前对象的startTime成员变量。 } + /** + * 获取用户搜索的关键词。 + * 外部代码调用此方法可以获取当前SessionRandomExtract对象所代表的用户在访问会话中输入的搜索关键词内容, + * 这些关键词能够反映用户的兴趣方向,对于搜索引擎优化、个性化推荐等业务有着重要的参考价值,可基于此为用户提供更精准的服务。 + * + * @return 当前对象的搜索关键词,返回类型为String,返回的值就是该对象中存储的搜索关键词的具体内容。 + */ public String getSearchKeyWords() { - return searchKeyWords; + return searchKeyWords; // 返回搜索关键词的值,即将当前对象的searchKeyWords成员变量的值返回给调用者。 } + /** + * 设置用户搜索的关键词。 + * 通过调用此方法,外部代码可以更新当前SessionRandomExtract对象所代表的用户在访问会话中输入的搜索关键词内容, + * 例如在关键词记录错误修正、补充缺失关键词等业务场景下,需要改变搜索关键词的具体内容时,就可以使用这个方法进行赋值操作。 + * + * @param searchKeyWords 用户搜索的关键词,参数类型为String,传入的是要设置给当前对象的新的搜索关键词值。 + */ public void setSearchKeyWords(String searchKeyWords) { this.searchKeyWords = searchKeyWords; + // 设置搜索关键词的值,将传入的searchKeyWords参数赋值给当前对象的searchKeyWords成员变量。 } + /** + * 获取用户点击的类别ID列表。 + * 调用此方法能获取当前SessionRandomExtract对象所代表的用户在访问会话中点击的各类别对应的唯一标识符组成的列表内容, + * 它是分析用户点击行为偏好的重要依据,可基于此进一步挖掘用户对不同类型内容的关注度,为精准营销、内容推荐等业务提供支持。 + * + * @return 当前对象的点击类别ID列表,返回类型为String,返回的是存储在该对象中的点击类别ID列表的具体内容。 + */ public String getClick_category_ids() { - return click_category_ids; + return click_category_ids; // 返回点击类别ID的值,也就是将当前对象的click_category_ids成员变量的值返回给调用者。 } + /** + * 设置用户点击的类别ID列表。 + * 外部代码可以利用此方法对当前SessionRandomExtract对象所代表的用户在访问会话中点击的类别ID列表内容进行更新操作, + * 例如在点击记录错误修正、新增或删除部分点击类别ID等业务场景下,需要改变点击类别ID列表的具体内容时,可通过该方法来完成赋值。 + * + * @param click_category_ids 用户点击的类别ID列表,参数类型为String,传入的是要设置给当前对象的新的点击类别ID列表值。 + */ public void setClick_category_ids(String click_category_ids) { - this.click_category_ids = click_category_ids; + this.click_category_ids = click_category_ids; // 设置点击类别ID的值,将传入的click_category_ids参数赋值给当前对象的click_category_ids成员变量。 } -} +} \ No newline at end of file diff --git a/src/main/java/cn/edu/hust/domain/Task.java b/src/main/java/cn/edu/hust/domain/Task.java index bef5826..2f29301 100644 --- a/src/main/java/cn/edu/hust/domain/Task.java +++ b/src/main/java/cn/edu/hust/domain/Task.java @@ -1,92 +1,228 @@ -package cn.edu.hust.domain; +package cn.edu.hust.domain; // 定义该类所在的包,包在Java项目中起着组织类结构的重要作用,它将功能相关或处于同一业务模块下的类归为一组,有助于清晰地管理不同模块,使整个项目的代码架构更加有条理,便于开发人员查找、理解以及维护各类代码文件。 -import java.io.Serializable; +import java.io.Serializable; // 导入Serializable接口,表示该类的实例可以被序列化。序列化操作使得对象能够转换为字节流的形式,这对于对象的存储(比如保存到文件中)或者在网络环境下进行传输都非常便利,能够满足如分布式系统、数据持久化等多种应用场景的需求。 -public class Task implements Serializable{ +/** + * Task类用于表示任务信息,通常用于任务调度或任务管理的系统中。 + * 此类实现了Serializable接口,意味着其对象能够被序列化,方便在系统不同组件间进行存储或传输,例如可以将任务对象存储到数据库中以备后续查询恢复使用,或者在分布式任务调度系统的不同节点间传递任务相关信息等。 + */ +public class Task implements Serializable { + + // 类中的成员变量,用于存储任务的相关信息,以下对每个成员变量进行详细说明,它们共同构成了描述一个任务的关键属性集合。 + + // 任务 ID,用于唯一标识任务。 + // 在整个任务管理系统中,每个任务都有一个独一无二的任务ID,通过它可以准确地定位、查询以及区分不同的任务,方便在任务的调度、监控以及数据统计等操作中使用该标识来关联相应的任务记录。 private Long taskId; + + // 任务名称,表示任务的名称,通常用于描述任务的含义。 + // 任务名称一般以一种易于理解的方式呈现任务的大致功能或业务目标,方便开发人员、运维人员以及其他相关人员快速知晓该任务是做什么的,例如“数据备份任务”“用户信息同步任务”等。 private String taskName; + + // 创建时间,记录任务的创建时刻。 + // 这个时间戳记录了任务最初被创建的时间点,对于分析任务的生命周期、追溯任务的起源以及按照时间顺序管理任务历史记录等方面有着重要作用,可以帮助了解任务的整体时间线情况。 private String createTime; + + // 任务开始时间,记录任务实际开始执行的时间。 + // 与创建时间不同,它标志着任务进入实际执行阶段的具体时刻,在任务调度系统中,通过对比创建时间和开始时间,可以评估任务是否及时启动,以及是否存在延迟等情况,同时也有助于统计任务的执行时长等信息。 private String startTime; + + // 任务结束时间,记录任务执行完成的时间。 + // 结合开始时间,能够准确计算出任务的执行时长,并且可以根据结束时间判断任务是否按照预期完成,对于任务执行效率的分析、任务执行结果的记录以及后续的任务复盘等操作提供了关键的时间依据。 private String finishTime; + + // 任务类型,用于区分不同类型的任务。 + // 在复杂的任务管理系统中,可能存在多种不同性质和功能的任务,例如数据处理任务、文件传输任务、定时触发任务等,通过任务类型可以对任务进行分类管理,方便针对不同类型的任务制定相应的调度策略、执行逻辑以及资源分配方案等。 private String taskType; + + // 任务状态,表示任务当前的状态,如 "进行中"、"已完成"、"失败" 等。 + // 任务状态是实时反映任务进展情况的重要属性,系统可以根据任务执行过程中的不同阶段和结果来更新这个状态,方便监控任务的执行情况,对于任务调度器来说,也可以依据任务状态决定是否需要重新调度、重试或者进行其他后续操作。 private String taskStatus; + + // 任务参数,通常用于存储任务执行时所需要的附加参数,可能是 JSON 格式或其他。 + // 不同的任务在执行过程中可能需要一些特定的配置信息或者输入数据,这些都可以通过任务参数来传递,例如数据处理任务可能需要指定数据源路径、处理规则等参数,任务参数的灵活性使得任务可以适应多种不同的具体业务需求。 private String taskParam; + /** + * 默认构造方法。 + * 其作用是在创建该类的实例时,初始化所有成员变量。 + * 在Java中,如果没有显式地在构造方法中对成员变量进行赋值,基本数据类型的成员变量会被赋予默认值(例如Long类型默认值为null),对象类型成员变量则初始化为空对象引用,这样就完成了对象的初步构建,后续可根据具体业务场景通过相应的setter方法来设置具体的值。 + */ public Task() { } + /** + * 通过该构造方法,可以快速地为Task对象设置所有字段的值。 + * 该方法提供了一种便捷的方式,在实例化对象后能一次性地传入各个属性对应的参数值,完成对象各成员变量的赋值操作,避免了逐个调用setter方法来设置值的繁琐过程,尤其在批量创建和初始化任务对象时,能显著提高效率。 + * + * @param taskId 任务ID,对应要设置的任务的唯一标识值,该值在整个任务管理系统中应是唯一的,用于准确区分不同任务。 + * @param taskName 任务名称,要设置的表示任务含义的名称字符串,应具有清晰的业务描述性。 + * @param createTime 任务创建时间,要设置的任务最初被创建的时间值,格式需符合系统中时间记录的规范要求,比如常见的"yyyy-MM-dd HH:mm:ss"格式。 + * @param startTime 任务开始时间,要设置的任务实际开始执行的时间值,同样需遵循相应的时间格式规范,以便后续进行时间相关的计算和分析。 + * @param finishTime 任务结束时间,要设置的任务执行完成的时间值,也应满足时间格式要求,用于确定任务执行周期等情况。 + * @param taskType 任务类型,要设置的用于区分任务种类的类型标识字符串,不同类型的任务对应不同的业务逻辑和处理方式。 + * @param taskStatus 任务状态,要设置的表示任务当前进展情况的状态描述字符串,如 "进行中"、"已完成"、"失败" 等符合业务定义的状态值。 + * @param taskParam 任务参数,要设置的任务执行时所需的附加参数内容,其格式取决于具体业务需求,可能是JSON格式或者其他自定义的格式等。 + */ public void set(Long taskId, String taskName, String createTime, String startTime, String finishTime, String taskType, String taskStatus, String taskParam) { + // 设置任务 ID,将传入的taskId参数值赋给当前对象的taskId成员变量,使得对象能够持有该任务的唯一标识信息。 this.taskId = taskId; + + // 设置任务名称,把传入的taskName参数值赋予当前对象的taskName成员变量,以此确定该任务在业务层面上的称呼和描述。 this.taskName = taskName; + + // 设置任务创建时间,将传入的createTime参数值赋值给当前对象的createTime成员变量,用于记录任务的起始创建时刻。 this.createTime = createTime; + + // 设置任务开始时间,把传入的startTime参数值赋给当前对象的startTime成员变量,以便明确任务实际开始执行的时间点。 this.startTime = startTime; + + // 设置任务结束时间,将传入的finishTime参数值赋予当前对象的finishTime成员变量,用于标记任务执行完毕的时间情况。 this.finishTime = finishTime; + + // 设置任务类型,把传入的taskType参数值赋给当前对象的taskType成员变量,通过该属性可以区分不同种类的任务。 this.taskType = taskType; + + // 设置任务状态,将传入的taskStatus参数值赋予当前对象的taskStatus成员变量,以此反映任务当前所处的进展状态。 this.taskStatus = taskStatus; + + // 设置任务参数,把传入的taskParam参数值赋给当前对象的taskParam成员变量,为任务执行提供所需的附加配置信息等。 this.taskParam = taskParam; } + // 以下是每个字段的getter和setter方法,用于获取和设置类的成员变量值,遵循Java面向对象编程中对类属性访问控制的规范,方便在不同的业务逻辑中灵活获取和修改任务对象的各个属性。 + + /** + * 获取任务 ID。 + * 外部代码可以通过调用此方法获取当前Task对象所关联的任务ID,以便在任务管理相关的业务逻辑处理中,依据该ID进行诸如查询任务详情、关联其他相关任务数据、进行任务调度操作等各种操作。 + * + * @return 当前对象的任务 ID,返回类型为Long,返回的值就是该对象中存储的任务ID的具体数值,可用于在整个任务管理系统中唯一标识该任务。 + */ public Long getTaskId() { - return taskId; + return taskId; // 返回任务 ID 的值,即将当前对象的taskId成员变量的值返回给调用者。 } + /** + * 设置任务 ID。 + * 外部代码可以调用此方法来更新当前Task对象所关联的任务ID,例如在任务ID需要重新分配、修改或者进行数据迁移等业务场景下,需要改变对象对应的任务标识时,就可以使用这个方法进行赋值操作。 + * + * @param taskId 任务 ID,参数类型为Long,传入的就是要设置给当前对象的新的任务ID值,该值应保证在系统内的唯一性。 + */ public void setTaskId(Long taskId) { - this.taskId = taskId; + this.taskId = taskId; // 设置任务 ID 的值,将传入的taskId参数赋值给当前对象的taskId成员变量。 } + /** + * 获取任务名称。 + * 调用此方法能够获取当前Task对象所代表的任务的名称,便于在任务管理界面展示、日志记录以及与其他相关人员沟通任务情况等操作中使用该名称来清晰表述任务内容。 + * + * @return 当前对象的任务名称,返回类型为String,返回的是存储在该对象中的任务名称的具体字符串内容,其应具有明确的业务含义描述功能。 + */ public String getTaskName() { - return taskName; + return taskName; // 返回任务名称的值,也就是将当前对象的taskName成员变量的值返回给调用者。 } + /** + * 设置任务名称。 + * 该方法可用于外部代码对当前Task对象所代表的任务名称进行更新操作,比如在任务功能发生变更、需要重新命名以更准确反映任务内容等情况下,可通过此方法来实现任务名称的修改。 + * + * @param taskName 任务名称,参数类型为String,传入的是要设置给当前对象的新的任务名称值,应符合业务上对任务命名的规范要求。 + */ public void setTaskName(String taskName) { - this.taskName = taskName; + this.taskName = taskName; // 设置任务名称的值,将传入的taskName参数赋值给当前对象的taskName成员变量。 } + /** + * 获取任务创建时间。 + * 外部代码调用此方法可以获取当前Task对象所代表的任务的创建时间,这个时间数据对于分析任务的历史记录、追溯任务的起源以及按照时间顺序梳理任务流程等方面有着重要作用,可作为时间轴上的关键节点参考。 + * + * @return 当前对象的任务创建时间,返回类型为String,返回的值就是该对象中存储的任务创建时间的具体字符串内容,格式通常需符合系统规定的时间表示规范。 + */ public String getCreateTime() { - return createTime; + return createTime; // 返回任务创建时间的值,即将当前对象的createTime成员变量的值返回给调用者。 } + /** + * 设置任务创建时间。 + * 通过调用此方法,外部代码可以更新当前Task对象所代表的任务的创建时间数据,例如在时间记录错误修正、数据同步时需要调整创建时间等业务场景下,就可以使用这个方法进行赋值操作,需确保传入的时间值格式正确。 + * + * @param createTime 任务创建时间,参数类型为String,传入的是要设置给当前对象的新的任务创建时间值,应遵循系统要求的时间格式规范。 + */ public void setCreateTime(String createTime) { - this.createTime = createTime; + this.createTime = createTime; // 设置任务创建时间的值,将传入的createTime参数赋值给当前对象的createTime成员变量。 } + /** + * 获取任务开始时间。 + * 调用此方法能获取当前Task对象所代表的任务的实际开始执行时间,它与创建时间、结束时间等结合起来,可以用于分析任务的执行周期、是否按时启动等情况,对于任务执行效率的评估和监控有着重要意义。 + * + * @return 当前对象的任务开始时间,返回类型为String,返回的是存储在该对象中的任务开始时间的具体字符串内容,格式需符合系统设定的时间表示规则。 + */ public String getStartTime() { - return startTime; + return startTime; // 返回任务开始时间的值,也就是将当前对象的startTime成员变量的值返回给调用者。 } + /** + * 设置任务开始时间。 + * 外部代码可以利用此方法对当前Task对象所代表的任务的开始时间进行更新操作,比如在任务启动时间记录错误、任务因某些原因重新启动等业务场景下,可通过该方法来完成开始时间的赋值修改,需保证时间值格式正确。 + * + * @param startTime 任务开始时间,参数类型为String,传入的是要设置给当前对象的新的任务开始时间值,应符合系统要求的时间格式规范。 + */ public void setStartTime(String startTime) { - this.startTime = startTime; + this.startTime = startTime; // 设置任务开始时间的值,将传入的startTime参数赋值给当前对象的startTime成员变量。 } + /** + * 获取任务结束时间。 + * 此方法用于获取当前Task对象所代表的任务的执行完成时间,结合开始时间等属性,可准确计算出任务的执行时长,并且能依据该时间判断任务是否按预期完成,对于任务执行情况的统计和分析是一个关键的数据点。 + * + * @return 当前对象的任务结束时间,返回类型为String,返回的值就是该对象中存储的任务结束时间的具体字符串内容,格式应符合系统规定的时间表示规范。 + */ public String getFinishTime() { - return finishTime; + return finishTime; // 返回任务结束时间的值,即将当前对象的finishTime成员变量的值返回给调用者。 } + /** + * 设置任务结束时间。 + * 调用该方法可让外部代码更新当前Task对象所代表的任务的结束时间数据,例如在任务执行完毕时间记录错误、任务提前或延迟结束等业务场景影响结束时间统计结果,需要对其数值进行修正时,就可以使用这个方法来赋值。 + * + * @param finishTime 任务结束时间,参数类型为String,传入的是要设置给当前对象的新的任务结束时间值,应遵循系统要求的时间格式规范。 + */ public void setFinishTime(String finishTime) { - this.finishTime = finishTime; + this.finishTime = finishTime; // 设置任务结束时间的值,将传入的finishTime参数赋值给当前对象的finishTime成员变量。 } + /** + * 获取任务类型。 + * 外部代码调用此方法可以获取当前Task对象所代表的任务的类型标识,基于这个类型信息,能够针对不同类型的任务采取相应的处理逻辑、调度策略以及资源分配方式等,方便对任务进行分类管理和差异化操作。 + * + * @return 当前对象的任务类型,返回类型为String,返回的是存储在该对象中的任务类型的具体字符串内容,其对应着不同的任务分类定义。 + */ public String getTaskType() { - return taskType; + return taskType; // 返回任务类型的值,即将当前对象的taskType成员变量的值返回给调用者。 } + /** + * 设置任务类型。 + * 通过调用此方法,外部代码可以更新当前Task对象所代表的任务的类型标识,比如在任务功能发生重大变更导致类型改变、任务分类规则调整等业务场景下,需要改变任务类型的具体内容时,就可以使用这个方法进行赋值操作,应遵循业务上对任务类型定义的规范要求。 + * + * @param taskType 任务类型,参数类型为String,传入的是要设置给当前对象的新的任务类型值,其应符合系统中对任务类型的命名和分类约定。 + */ public void setTaskType(String taskType) { - this.taskType = taskType; + this.taskType = taskType; // 设置任务类型的值,将传入的taskType参数赋值给当前对象的taskType成员变量。 } + /** + * 获取任务状态。 + * 此方法用于获取当前Task对象所代表的任务的当前状态信息,任务状态对于实时监控任务进展、决定后续操作(如是否重试、继续执行还是结束任务等)起着关键作用,不同的状态值对应着不同的任务处理逻辑。 + * + * @return 当前对象的任务状态,返回类型为String,返回的是存储在该对象中的任务状态的具体字符串内容,如 "进行中"、"已完成"、"失败" 等符合业务定义的状态描述。 + */ public String getTaskStatus() { - return taskStatus; - } - - public void setTaskStatus(String taskStatus) { - this.taskStatus = taskStatus; - } - - public String getTaskParam() { - return taskParam; - } - - public void setTaskParam(String taskParam) { - this.taskParam = taskParam; + return taskStatus; // 返回任务状态的值,即将当前对象的taskStatus成员变量的值返回给调用者。 } } + +/** + * 设置任务状态。 + * 外部代码可以利用此方法对当前Task对象所代表的任务的状态进行更新操作,例如在任务执行 + **/ \ No newline at end of file diff --git a/src/main/java/cn/edu/hust/domain/Top10Category.java b/src/main/java/cn/edu/hust/domain/Top10Category.java index 8b7eac4..1d115a0 100644 --- a/src/main/java/cn/edu/hust/domain/Top10Category.java +++ b/src/main/java/cn/edu/hust/domain/Top10Category.java @@ -1,61 +1,190 @@ -package cn.edu.hust.domain; +package cn.edu.hust.domain; // 定义类所在的包,包的作用通常是用于对类进行合理的组织,方便在项目中更好地管理代码模块,使得代码结构更清晰,不同功能的类可以归属到不同的包下。 +/** + * Top10Category 类用于表示某一任务(task)下前 10 名的商品类别信息。 + * 该类的主要用途是封装和管理与商品类别相关的重要统计信息,这些信息对于分析商品各类别在不同行为维度下的表现情况非常有帮助, + * 例如可以通过这些数据了解哪些商品类别更受用户关注、哪些更容易促成订单以及实际的支付情况等。 + * 主要包含了关于商品类别的相关统计信息,涵盖了点击量、订单量和支付量等关键指标,通过这些指标能直观反映商品类别的热度及商业价值等情况。 + */ public class Top10Category { + + // 类的成员变量,用于存储商品类别的统计信息,以下分别对每个成员变量进行详细说明。 + + // 任务 ID,用于唯一标识一个任务,其含义通常与某个特定的数据分析任务相关联, + // 在一个存在多个数据分析任务并行或按顺序执行的系统中,通过这个 ID 可以清晰区分不同任务所对应的商品类别统计数据。 private Long taskId; + + // 类别 ID,表示商品类别的唯一标识符,在整个商品分类体系里,每个类别都有一个独一无二的这个 ID, + // 方便在数据库存储、查询以及业务逻辑处理中准确地定位和操作特定的商品类别相关数据。 private Long categoryId; + + // 点击量,表示某个类别的商品被点击的总次数,它直观地反映了用户对该商品类别的关注程度, + // 点击次数越多,往往意味着该类别商品在展示效果、吸引力等方面表现更好,更能引起用户的兴趣。 private Long clickCount; + + // 订单量,表示某个类别的商品成功下单的总次数,这是衡量该商品类别商业转化能力的一个重要指标, + // 说明用户从对该类别商品的浏览、点击等行为进一步转化为实际下单购买的情况,订单量越高,商业价值相对越大。 private Long orderCount; - private Long payCount; + // 支付量,表示某个类别的商品成功支付的总次数,它体现了最终实际完成支付的情况, + // 因为下单后可能存在取消订单等情况,支付量更能精准反映该类别商品真正实现交易的情况,是衡量商业收益的关键数据之一。 + private Long payCount; + /** + * 默认构造方法。 + * 其作用是在创建 Top10Category 类的实例时,初始化所有成员变量。 + * 虽然在这个方法里没有显式地给成员变量赋值初始化操作,但 Java 会为基本数据类型的成员变量赋予默认值(例如,Long 类型默认值为 null), + * 为对象类型成员变量创建一个初始的空对象引用,以此完成对象的初步构建,方便后续根据具体需求再通过 setter 方法等设置具体的值。 + */ public Top10Category() { } + /** + * 通过该构造方法,可以快速地为 Top10Category 对象设置所有字段的值。 + * 该方法提供了一种便捷的方式,在实例化对象后能一次性地传入各个属性对应的参数值,完成对象各成员变量的赋值操作, + * 避免了逐个调用 setter 方法来设置值的繁琐过程,提高了对象初始化的效率,尤其在批量创建和初始化对象时很有用。 + * + * @param taskId 任务 ID,对应要设置的任务的唯一标识值。 + * @param categoryId 类别 ID,对应要设置的商品类别的唯一标识值。 + * @param clickCount 点击量,要设置的该类别商品的点击总次数。 + * @param orderCount 订单量,要设置的该类别商品的成功下单总次数。 + * @param payCount 支付量,要设置的该类别商品的成功支付总次数。 + */ public void set(Long taskId, Long categoryId, Long clickCount, Long orderCount, Long payCount) { + // 设置任务 ID,将传入的 taskId 参数值赋给当前对象的 taskId 成员变量,完成任务 ID 的赋值操作。 this.taskId = taskId; + + // 设置类别 ID,把传入的 categoryId 参数值赋予当前对象的 categoryId 成员变量,实现类别 ID 的赋值。 this.categoryId = categoryId; + + // 设置点击量,将传入的 clickCount 参数值赋值给当前对象的 clickCount 成员变量,以此确定该对象所表示的商品类别的点击次数。 this.clickCount = clickCount; + + // 设置订单量,把传入的 orderCount 参数值赋给当前对象的 orderCount 成员变量,用于明确该商品类别的订单数量情况。 this.orderCount = orderCount; + + // 设置支付量,将传入的 payCount 参数值赋予当前对象的 payCount 成员变量,从而设定该商品类别的支付数量相关信息。 this.payCount = payCount; } + // 以下是每个字段的 getter 和 setter 方法,用于获取和设置类的成员变量值,它们遵循 Java 的面向对象编程规范,方便对类的属性进行访问控制和修改操作。 + + /** + * 获取任务 ID。 + * 外部代码可以通过调用此方法获取当前 Top10Category 对象所关联的任务 ID, + * 以便在业务逻辑处理中,根据任务 ID 进行进一步的查询、统计或者关联其他相关数据等操作。 + * + * @return 当前对象的任务 ID,返回类型为 Long,返回的值就是该对象中存储的任务 ID 的具体数值。 + */ public Long getTaskId() { - return taskId; + return taskId; // 返回任务 ID 的值,即将当前对象的 taskId 成员变量的值返回给调用者。 } + /** + * 设置任务 ID。 + * 外部代码可以调用此方法来更新当前 Top10Category 对象所关联的任务 ID, + * 例如在数据更新、任务重新分配等业务场景下,需要改变对象对应的任务标识时,就可以使用这个方法进行赋值操作。 + * + * @param taskId 任务 ID,参数类型为 Long,传入的就是要设置给当前对象的新的任务 ID 值。 + */ public void setTaskId(Long taskId) { this.taskId = taskId; + // 设置任务 ID 的值,将传入的 taskId 参数赋值给当前对象的 taskId 成员变量。 } + /** + * 获取类别 ID。 + * 调用此方法能够获取当前 Top10Category 对象所代表的商品类别的唯一标识符, + * 便于在诸如查询该类别商品的详细信息、关联其他相关商品类别数据等操作中使用这个 ID 值。 + * + * @return 当前对象的类别 ID,返回类型为 Long,返回的是存储在该对象中的类别 ID 的具体数值。 + */ public Long getCategoryId() { return categoryId; + // 返回类别 ID 的值,也就是将当前对象的 categoryId 成员变量的值返回给调用者。 } + /** + * 设置类别 ID。 + * 该方法可用于外部代码对当前 Top10Category 对象所代表的商品类别标识符进行更新操作, + * 比如在商品分类体系发生调整、类别合并或者重新编号等情况下,需要改变对象对应的类别 ID 时,可通过此方法来实现。 + * + * @param categoryId 类别 ID,参数类型为 Long,传入的是要设置给当前对象的新的类别 ID 值。 + */ public void setCategoryId(Long categoryId) { this.categoryId = categoryId; + // 设置类别 ID 的值,将传入的 categoryId 参数赋值给当前对象的 categoryId 成员变量。 } + /** + * 获取点击量。 + * 外部代码调用此方法可以获取当前 Top10Category 对象所代表的商品类别被用户点击的总次数, + * 这个数据可以用于分析该类别商品的受关注程度、热度变化等情况,为业务决策提供参考依据,比如是否加大该类别商品的推广力度等。 + * + * @return 当前对象的点击量,返回类型为 Long,返回的值就是该对象中存储的点击量的具体数值。 + */ public Long getClickCount() { return clickCount; + // 返回点击量的值,即将当前对象的 clickCount 成员变量的值返回给调用者。 } + /** + * 设置点击量。 + * 通过调用此方法,外部代码可以更新当前 Top10Category 对象所代表的商品类别的点击量数据, + * 例如在统计数据更新、纠正错误数据等业务场景下,需要修改点击量的具体数值时,就可以使用这个方法进行赋值操作。 + * + * @param clickCount 点击量,参数类型为 Long,传入的就是要设置给当前对象的新的点击量值。 + */ public void setClickCount(Long clickCount) { this.clickCount = clickCount; + // 设置点击量的值,将传入的 clickCount 参数赋值给当前对象的 clickCount 成员变量。 } + /** + * 获取订单量。 + * 调用此方法能获取当前 Top10Category 对象所代表的商品类别成功下单的总次数, + * 它是衡量该类别商品商业转化效果的重要指标之一,业务人员可以根据这个数据评估该类别商品的销售潜力、市场需求等情况。 + * + * @return 当前对象的订单量,返回类型为 Long,返回的是存储在该对象中的订单量的具体数值。 + */ public Long getOrderCount() { return orderCount; + // 返回订单量的值,也就是将当前对象的 orderCount 成员变量的值返回给调用者。 } + /** + * 设置订单量。 + * 外部代码可以利用此方法对当前 Top10Category 对象所代表的商品类别的订单量数据进行更新操作, + * 例如在订单数据同步、补录或者调整等业务场景下,需要改变订单量的具体数值时,可通过该方法来完成赋值。 + * + * @param orderCount 订单量,参数类型为 Long,传入的是要设置给当前对象的新的订单量值。 + */ public void setOrderCount(Long orderCount) { this.orderCount = orderCount; + // 设置订单量的值,将传入的 orderCount 参数赋值给当前对象的 orderCount 成员变量。 } + /** + * 获取支付量。 + * 此方法用于获取当前 Top10Category 对象所代表的商品类别成功支付的总次数, + * 支付量是反映该类别商品实际交易完成情况的关键数据,对于分析商品的盈利能力、用户购买意愿等方面有着重要作用。 + * + * @return 当前对象的支付量,返回类型为 Long,返回的值就是该对象中存储的支付量的具体数值。 + */ public Long getPayCount() { return payCount; + // 返回支付量的值,即将当前对象的 payCount 成员变量的值返回给调用者。 } + /** + * 设置支付量。 + * 调用该方法可让外部代码更新当前 Top10Category 对象所代表的商品类别的支付量数据, + * 比如在支付数据核对、退款等业务场景影响支付量统计结果,需要对支付量数值进行修正时,就可以使用这个方法来赋值。 + * + * @param payCount 支付量,参数类型为 Long,传入的是要设置给当前对象的新的支付量值。 + */ public void setPayCount(Long payCount) { this.payCount = payCount; + // 设置支付量的值,将传入的 payCount 参数赋值给当前对象的 payCount 成员变量。 } } diff --git a/src/main/java/cn/edu/hust/domain/Top10CategorySession.java b/src/main/java/cn/edu/hust/domain/Top10CategorySession.java index 3e00f82..5009cdb 100644 --- a/src/main/java/cn/edu/hust/domain/Top10CategorySession.java +++ b/src/main/java/cn/edu/hust/domain/Top10CategorySession.java @@ -1,52 +1,104 @@ -package cn.edu.hust.domain; +package cn.edu.hust.domain; // 定义类所在的包,通常用于组织类和管理模块。 -import java.io.Serializable; +import java.io.Serializable; // 引入 Serializable 接口,表示该类可以被序列化。 -public class Top10CategorySession implements Serializable{ - private Long taskId; - private Long categoryId; - private String sessionId; - private Long clickCount; +/** + * Top10CategorySession 类表示某一任务下某商品类别在用户会话中的点击量统计。 + * 该类结合了任务、商品类别以及用户会话的信息,通常用于分析某一任务下的商品类别在不同用户会话中的互动情况。 + * + * 属性:taskId, categoryId, sessionId, clickCount + */ +public class Top10CategorySession implements Serializable { // 实现 Serializable 接口,使对象可以被序列化 + private Long taskId; // 任务 ID,唯一标识一个任务,通常与某个数据分析任务相关。 + private Long categoryId; // 商品类别 ID,表示某个商品类别的唯一标识符。 + private String sessionId; // 会话 ID,表示用户与平台交互的会话的唯一标识符。 + private Long clickCount; // 点击量,表示某个商品类别在指定会话中的点击次数。 + + /** + * 默认构造方法。 + * 用于创建 Top10CategorySession 类的实例时,初始化所有成员变量为默认值。 + */ public Top10CategorySession() { } + /** + * 通过该构造方法,快速地为 Top10CategorySession 对象设置所有字段的值。 + * @param taskId 任务 ID + * @param categoryId 商品类别 ID + * @param sessionId 会话 ID + * @param clickCount 点击量 + */ public void set(Long taskId, Long categoryId, String sessionId, Long clickCount) { - this.taskId = taskId; - this.categoryId = categoryId; - this.sessionId = sessionId; - this.clickCount = clickCount; + this.taskId = taskId; // 设置任务 ID。 + this.categoryId = categoryId; // 设置商品类别 ID。 + this.sessionId = sessionId; // 设置会话 ID。 + this.clickCount = clickCount; // 设置点击量。 } + // 以下是每个字段的 getter 和 setter 方法,用于获取和设置类的成员变量值。 + + /** + * 获取任务 ID。 + * @return 当前对象的任务 ID。 + */ public Long getTaskId() { - return taskId; + return taskId; // 返回任务 ID 的值。 } + /** + * 设置任务 ID。 + * @param taskId 任务 ID。 + */ public void setTaskId(Long taskId) { - this.taskId = taskId; + this.taskId = taskId; // 设置任务 ID 的值。 } + /** + * 获取商品类别 ID。 + * @return 当前对象的商品类别 ID。 + */ public Long getCategoryId() { - return categoryId; + return categoryId; // 返回商品类别 ID 的值。 } + /** + * 设置商品类别 ID。 + * @param categoryId 商品类别 ID。 + */ public void setCategoryId(Long categoryId) { - this.categoryId = categoryId; + this.categoryId = categoryId; // 设置商品类别 ID 的值。 } + /** + * 获取会话 ID。 + * @return 当前对象的会话 ID。 + */ public String getSessionId() { - return sessionId; + return sessionId; // 返回会话 ID 的值。 } + /** + * 设置会话 ID。 + * @param sessionId 会话 ID。 + */ public void setSessionId(String sessionId) { - this.sessionId = sessionId; + this.sessionId = sessionId; // 设置会话 ID 的值。 } + /** + * 获取点击量。 + * @return 当前对象的点击量。 + */ public Long getClickCount() { - return clickCount; + return clickCount; // 返回点击量的值。 } + /** + * 设置点击量。 + * @param clickCount 点击量。 + */ public void setClickCount(Long clickCount) { - this.clickCount = clickCount; + this.clickCount = clickCount; // 设置点击量的值。 } } diff --git a/src/main/java/cn/edu/hust/jdbc/JDBCHelper.java b/src/main/java/cn/edu/hust/jdbc/JDBCHelper.java index c414e52..4a53609 100644 --- a/src/main/java/cn/edu/hust/jdbc/JDBCHelper.java +++ b/src/main/java/cn/edu/hust/jdbc/JDBCHelper.java @@ -1,195 +1,268 @@ package cn.edu.hust.jdbc; - +// import cn.edu.hust.conf.ConfigurationManager; +// import cn.edu.hust.constant.Constants; - -import java.sql.*; +// +import java.sql.Connection; +// +import java.sql.DriverManager; +// +import java.sql.PreparedStatement; +// +import java.sql.ResultSet; +// +import java.sql.SQLException; +// import java.util.List; +// import java.util.concurrent.ArrayBlockingQueue; +// import java.util.concurrent.LinkedBlockingQueue; +// JDBCHelper类是一个用于管理数据库连接以及执行数据库相关操作的工具类, +// 它结合了单例模式和连接池的思想,方便在整个应用程序中统一获取数据库连接并执行SQL语句等操作。 public class JDBCHelper { - private static JDBCHelper instance=new JDBCHelper(); - //使用阻塞队列 - private LinkedBlockingQueue queue=new LinkedBlockingQueue(); - static{ + + // 采用单例模式,保证整个应用程序中只有一个JDBCHelper实例存在,instance为该类的唯一实例对象。 + private static JDBCHelper instance = new JDBCHelper(); + + // 使用LinkedBlockingQueue作为阻塞队列来存放数据库连接对象,实现连接池的功能。 + // 连接池中的连接可以被多个地方获取并使用,使用完后再归还到队列中供后续使用。 + private LinkedBlockingQueue queue = new LinkedBlockingQueue(); + + // 静态代码块,在类加载时执行,用于加载数据库驱动。 + // 通过从配置管理器(ConfigurationManager)中获取数据库驱动的配置信息(Constants.JDBC_DRIVER), + // 调用Class.forName方法加载驱动,这样后续才能通过DriverManager建立数据库连接。 + static { try { Class.forName(ConfigurationManager.getProperty(Constants.JDBC_DRIVER)); - } - catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } } + /** - * 在构造函数创建数据库连接池 - * 结合单例模式,确保数据库连接池单例 + * 私有构造函数,遵循单例模式的设计原则,防止外部直接通过构造函数创建多个实例。 + * 在构造函数内部,创建数据库连接池,根据配置文件中获取的数据源大小(Constants.JDBC_ACTIVE), + * 循环创建指定数量的数据库连接,并将这些连接放入到阻塞队列(queue)中。 + * 每个连接通过DriverManager.getConnection方法创建,使用从配置管理器获取的数据库连接URL、用户名和密码等信息。 */ - private JDBCHelper(){ - int dataSourceSize=ConfigurationManager.getInteger(Constants.JDBC_ACTIVE); - String url=ConfigurationManager.getProperty(Constants.JDBC_URL); - String username=ConfigurationManager.getProperty(Constants.JDBC_USERNAME); - String passward=ConfigurationManager.getProperty(Constants.JDBC_PSSWORD); - try - { - for(int i=0;i params) - { - Connection connection=null; - PreparedStatement statement=null; - int[] res=null; - try - { - connection=getConnection(); - statement=connection.prepareStatement(sql); - //1.取消自动提交 + public int[] excuteBatch(String sql, List params) { + Connection connection = null; + // + PreparedStatement statement = null; + // + int[] res = null; + // + + try { + // 从连接池中获取一个数据库连接 + connection = getConnection(); + + // 使用获取到的连接创建一个PreparedStatement对象,用于执行带参数的SQL语句 + statement = connection.prepareStatement(sql); + + // 1. 取消自动提交模式,这样可以将多条SQL语句作为一个事务来统一提交或回滚,提高数据一致性。 connection.setAutoCommit(false); - //2.设置参数 - for (Object[] param: - params) { + + // 2. 循环设置每条SQL语句的参数,并将其添加到批处理中,通过addBatch方法将每条语句添加到待执行的批处理队列中。 + for (Object[] param : params) { for (int i = 0; i < param.length; i++) { - statement.setObject(i+1,param[i]); + statement.setObject(i + 1, param[i]); + // } statement.addBatch(); + // } - //3.批量执行 - res=statement.executeBatch(); - //4.最后一步提交 + + // 3. 批量执行所有添加到批处理队列中的SQL语句,返回一个整数数组表示每条语句受影响的行数。 + res = statement.executeBatch(); + + // 4. 最后提交事务,将所有批量执行的SQL语句对数据库的修改统一提交,如果执行过程中出现异常则事务会回滚。 connection.commit(); +// return res; } catch (SQLException e) { e.printStackTrace(); - } - finally { - if(connection!=null) - { + } finally { + // 无论是否执行成功,都需要将使用完的数据库连接归还到连接池中, + // 如果连接对象不为空,尝试将其放回阻塞队列(queue),如果放回过程出现中断异常则打印栈追踪信息。 + if (connection!= null) { try { queue.put(connection); } catch (InterruptedException e) { e.printStackTrace(); } + // } } + // return res; + // } -} + // +} \ No newline at end of file diff --git a/src/main/java/cn/edu/hust/mockData/MockData.java b/src/main/java/cn/edu/hust/mockData/MockData.java index f6d6387..846361f 100644 --- a/src/main/java/cn/edu/hust/mockData/MockData.java +++ b/src/main/java/cn/edu/hust/mockData/MockData.java @@ -17,39 +17,63 @@ import org.apache.spark.sql.SQLContext; import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.StructType; - /** * 模拟数据程序 + * 这个类主要用于模拟生成一些数据,并将其转换为DataFrame格式, + * 同时注册为临时表,方便后续在Spark SQL环境中进行操作和分析。 * @author Administrator * */ public class MockData { /** - * 弄你数据 - * @param sc - * @param sqlContext + * mock方法用于生成模拟数据,并基于生成的数据创建DataFrame,然后注册为临时表。 + * 它接收JavaSparkContext和SQLContext作为参数,这两个参数是在Spark中进行数据处理和SQL操作的关键上下文对象。 + * @param sc JavaSparkContext对象,用于在Spark中创建和操作分布式数据集(RDD等)。 + * @param sqlContext SQLContext对象,用于在Spark中执行SQL相关操作,如创建DataFrame、注册临时表等。 */ public static void mock(JavaSparkContext sc, - SQLContext sqlContext) { + SQLContext sqlContext) { + + // 创建一个用于存储Row对象的列表,后续将用于构建DataFrame,每个Row对象代表一行数据 List rows = new ArrayList(); - + + // 定义一个字符串数组,包含了一些模拟的搜索关键词,用于模拟用户的搜索行为 String[] searchKeywords = new String[] {"火锅", "蛋糕", "重庆辣子鸡", "重庆小面", "呷哺呷哺", "新辣道鱼火锅", "国贸大厦", "太古商场", "日本料理", "温泉"}; + + // 通过DateUtils工具类获取今天的日期,作为模拟数据中日期相关字段的基础值 String date = DateUtils.getTodayDate(); + + // 定义一个字符串数组,包含了用户可能进行的操作类型,如搜索、点击、下单、支付 String[] actions = new String[]{"search", "click", "order", "pay"}; + + // 创建一个Random对象,用于生成各种随机数,来模拟不同的情况 Random random = new Random(); - + + // 外层循环模拟100个不同的用户 for(int i = 0; i < 100; i++) { - long userid = random.nextInt(100); - + // 为每个用户随机生成一个用户ID,范围在0到99之间 + long userid = random.nextInt(100); + + // 中层循环模拟每个用户的10次会话 for(int j = 0; j < 10; j++) { - String sessionid = UUID.randomUUID().toString().replace("-", ""); + // 生成一个唯一的会话ID,通过UUID生成后去除其中的'-'字符 + String sessionid = UUID.randomUUID().toString().replace("-", ""); + + // 生成一个基础的操作时间,格式为今天的日期加上一个随机的小时数(0到22) String baseActionTime = date + " " + random.nextInt(23); - + + // 内层循环模拟每次会话中的多次操作,操作次数是随机的(0到99次之间) for(int k = 0; k < random.nextInt(100); k++) { - long pageid = random.nextInt(10); + // 为每次操作随机生成一个页面ID,范围在0到9之间 + long pageid = random.nextInt(10); + + // 生成完整的操作时间,在基础操作时间上补充随机的分钟和秒数, + // 通过StringUtils的fulfuill方法确保分钟和秒数是两位数格式(不足两位前面补0) String actionTime = baseActionTime + ":" + StringUtils.fulfuill(String.valueOf(random.nextInt(59))) + ":" + StringUtils.fulfuill(String.valueOf(random.nextInt(59))); + + // 初始化一些操作相关的字段为null,后续根据具体的操作类型来赋值 String searchKeyword = null; Long clickCategoryId = null; Long clickProductId = null; @@ -57,33 +81,45 @@ public class MockData { String orderProductIds = null; String payCategoryIds = null; String payProductIds = null; - + + // 随机选择一个操作类型(从定义的actions数组中随机选取) String action = actions[random.nextInt(4)]; + + // 根据选择的操作类型,设置相应的字段值 if("search".equals(action)) { - searchKeyword = searchKeywords[random.nextInt(10)]; + // 如果是搜索操作,从搜索关键词数组中随机选取一个作为搜索关键词 + searchKeyword = searchKeywords[random.nextInt(10)]; } else if("click".equals(action)) { - clickCategoryId = Long.valueOf(String.valueOf(random.nextInt(100))); - clickProductId = Long.valueOf(String.valueOf(random.nextInt(100))); + // 如果是点击操作,随机生成点击的分类ID和产品ID(范围在0到99之间) + clickCategoryId = Long.valueOf(String.valueOf(random.nextInt(100))); + clickProductId = Long.valueOf(String.valueOf(random.nextInt(100))); } else if("order".equals(action)) { - orderCategoryIds = String.valueOf(random.nextInt(100)); + // 如果是下单操作,随机生成下单的分类ID和产品ID(转换为字符串形式) + orderCategoryIds = String.valueOf(random.nextInt(100)); orderProductIds = String.valueOf(random.nextInt(100)); } else if("pay".equals(action)) { - payCategoryIds = String.valueOf(random.nextInt(100)); + // 如果是支付操作,随机生成支付的分类ID和产品ID(转换为字符串形式) + payCategoryIds = String.valueOf(random.nextInt(100)); payProductIds = String.valueOf(random.nextInt(100)); } - - Row row = RowFactory.create(date, userid, sessionid, + + // 使用RowFactory创建一个Row对象,将本次操作相关的所有字段值传入,代表一行模拟数据 + Row row = RowFactory.create(date, userid, sessionid, pageid, actionTime, searchKeyword, clickCategoryId, clickProductId, orderCategoryIds, orderProductIds, payCategoryIds, payProductIds); + + // 将生成的Row对象添加到rows列表中,不断积累模拟数据 rows.add(row); } } } - + + // 将存储了Row对象的列表转换为JavaRDD,使其可以在Spark的分布式环境下进行处理 JavaRDD rowsRDD = sc.parallelize(rows); - + + // 定义DataFrame的数据结构(Schema),明确每个字段的名称、数据类型以及是否可为空等信息 StructType schema = DataTypes.createStructType(Arrays.asList( DataTypes.createStructField("date", DataTypes.StringType, true), DataTypes.createStructField("user_id", DataTypes.LongType, true), @@ -97,36 +133,64 @@ public class MockData { DataTypes.createStructField("order_product_ids", DataTypes.StringType, true), DataTypes.createStructField("pay_category_ids", DataTypes.StringType, true), DataTypes.createStructField("pay_product_ids", DataTypes.StringType, true))); - + + // 使用SQLContext基于rowsRDD和定义好的结构schema创建一个DataFrame对象,用于后续的数据操作和分析 DataFrame df = sqlContext.createDataFrame(rowsRDD, schema); - - df.registerTempTable("user_visit_action"); + + // 将创建好的DataFrame注册为一个临时表,表名为"user_visit_action",方便后续用SQL语句进行查询等操作 + df.registerTempTable("user_visit_action"); + + // 打印DataFrame的第一行数据,用于简单查看模拟生成的数据情况 for(Row _row : df.take(1)) { - System.out.println(_row); + System.out.println(_row); } - + /** * ================================================================== + * 以下是模拟生成用户基本信息数据的相关代码部分,与上面模拟用户访问行为数据的逻辑类似,但字段不同。 */ - + + // 清空之前用于存储用户访问行为数据的rows列表,准备存储用户基本信息数据 rows.clear(); + + // 定义一个字符串数组,包含了两种性别,用于模拟用户的性别信息 String[] sexes = new String[]{"male", "female"}; + + // 循环模拟生成100个用户的基本信息 for(int i = 0; i < 100; i ++) { + // 用户ID直接使用循环变量i,简单递增赋值 long userid = i; + + // 生成用户名,格式为"user"加上用户ID String username = "user" + i; + + // 生成姓名,格式为"name"加上用户ID String name = "name" + i; + + // 随机生成用户年龄,范围在0到59岁之间 int age = random.nextInt(60); + + // 生成职业信息,格式为"professional"加上一个随机数(范围在0到99之间) String professional = "professional" + random.nextInt(100); + + // 生成所在城市信息,格式为"city"加上一个随机数(范围在0到99之间) String city = "city" + random.nextInt(100); + + // 随机选择一个性别,从定义的sexes数组中随机选取 String sex = sexes[random.nextInt(2)]; - - Row row = RowFactory.create(userid, username, name, age, + + // 使用RowFactory创建一个Row对象,将本次用户基本信息相关的所有字段值传入,代表一行模拟数据 + Row row = RowFactory.create(userid, username, name, age, professional, city, sex); + + // 将生成的Row对象添加到rows列表中,积累用户基本信息数据 rows.add(row); } - + + // 将存储了用户基本信息Row对象的列表再次转换为JavaRDD,以便后续操作 rowsRDD = sc.parallelize(rows); - + + // 定义用户基本信息DataFrame的数据结构(Schema),明确每个字段的名称、数据类型以及是否可为空等信息 StructType schema2 = DataTypes.createStructType(Arrays.asList( DataTypes.createStructField("user_id", DataTypes.LongType, true), DataTypes.createStructField("username", DataTypes.StringType, true), @@ -135,13 +199,17 @@ public class MockData { DataTypes.createStructField("professional", DataTypes.StringType, true), DataTypes.createStructField("city", DataTypes.StringType, true), DataTypes.createStructField("sex", DataTypes.StringType, true))); - + + // 使用SQLContext基于新的rowsRDD和定义好的结构schema2创建一个用于存储用户基本信息的DataFrame对象 DataFrame df2 = sqlContext.createDataFrame(rowsRDD, schema2); + + // 打印用户基本信息DataFrame的第一行数据,用于简单查看模拟生成的数据情况 for(Row _row : df2.take(1)) { - System.out.println(_row); + System.out.println(_row); } - - df2.registerTempTable("user_info"); + + // 将用户基本信息的DataFrame注册为一个临时表,表名为"user_info",方便后续用SQL语句进行关联等操作 + df2.registerTempTable("user_info"); } - -} + +} \ No newline at end of file diff --git a/src/main/java/cn/edu/hust/session/CategorySortKey.java b/src/main/java/cn/edu/hust/session/CategorySortKey.java index cdc07ee..8291aa1 100644 --- a/src/main/java/cn/edu/hust/session/CategorySortKey.java +++ b/src/main/java/cn/edu/hust/session/CategorySortKey.java @@ -1,119 +1,149 @@ package cn.edu.hust.session; - import scala.math.Ordered; +// CategorySortKey类实现了Ordered接口(用于定义比较规则)以及Serializable接口(用于支持对象的序列化操作) +// 该类主要用于定义分类排序相关的键,通过比较不同实例中的点击数、订单数和支付数来确定排序规则 public class CategorySortKey implements Ordered, java.io.Serializable { + // 用于记录点击次数的成员变量 private Long clickCount; + // 用于记录订单次数的成员变量 private Long orderCount; + // 用于记录支付次数的成员变量 private Long payCount; + // 实现Ordered接口中的compare方法,用于定义两个CategorySortKey实例的比较逻辑 + // 根据点击数、订单数、支付数依次比较来确定两个实例的大小关系 @Override public int compare(CategorySortKey categorySortKey) { - if(clickCount-categorySortKey.getClickCount()!=0) - { - return (int) (clickCount-categorySortKey.getClickCount()); - }else if(clickCount-categorySortKey.getClickCount()==0&&orderCount-categorySortKey.getOrderCount()!=0) - { - return (int) (orderCount-categorySortKey.getOrderCount()); + // 首先比较点击数,如果点击数不同,则根据点击数的差值返回比较结果 + if (clickCount - categorySortKey.getClickCount()!= 0) { + return (int) (clickCount - categorySortKey.getClickCount()); + } + // 如果点击数相同,接着比较订单数,若订单数不同,则根据订单数的差值返回比较结果 + else if (clickCount - categorySortKey.getClickCount() == 0 && orderCount - categorySortKey.getOrderCount()!= 0) { + return (int) (orderCount - categorySortKey.getOrderCount()); } - else if(clickCount-categorySortKey.getClickCount()==0&&orderCount-categorySortKey.getOrderCount()==0&&payCount-categorySortKey.getPayCount()!=0) - return (int) (payCount-categorySortKey.getPayCount()); + // 如果点击数和订单数都相同,再比较支付数,若支付数不同,则根据支付数的差值返回比较结果 + else if (clickCount - categorySortKey.getClickCount() == 0 && orderCount - categorySortKey.getOrderCount() == 0 && payCount - categorySortKey.getPayCount()!= 0) + return (int) (payCount - categorySortKey.getPayCount()); + // 如果点击数、订单数和支付数都相同,则认为两个实例相等,返回0 return 0; } + // 实现Ordered接口中的$less方法,用于判断当前实例是否小于给定的CategorySortKey实例 @Override public boolean $less(CategorySortKey categorySortKey) { - if(clickCountcategorySortKey.getClickCount()) - { + // 首先比较点击数,如果当前实例的点击数大于给定实例的点击数,则返回true,表示当前实例大于给定实例 + if (clickCount > categorySortKey.getClickCount()) { return true; - }else if(clickCount==categorySortKey.getClickCount()&&orderCount>categorySortKey.getOrderCount()) - { + } + // 如果点击数相等,接着比较订单数,若当前实例的订单数大于给定实例的订单数,则返回true + else if (clickCount == categorySortKey.getClickCount() && orderCount > categorySortKey.getOrderCount()) { return true; } - else if(clickCount==categorySortKey.getClickCount()&&orderCount==categorySortKey.getOrderCount()&&payCount>categorySortKey.getPayCount()) + // 如果点击数和订单数都相等,再比较支付数,若当前实例的支付数大于给定实例的支付数,则返回true + else if (clickCount == categorySortKey.getClickCount() && orderCount == categorySortKey.getOrderCount() && payCount > categorySortKey.getPayCount()) return true; + // 如果以上比较都不满足大于的条件,则返回false,表示当前实例不大于给定实例 return false; } + // 实现Ordered接口中的$less$eq方法,用于判断当前实例是否小于等于给定的CategorySortKey实例 @Override public boolean $less$eq(CategorySortKey categorySortKey) { - if($less(categorySortKey)) - { + // 如果当前实例小于给定实例(通过$less方法判断),则返回true + if ($less(categorySortKey)) { return true; } - else if(clickCount==categorySortKey.getClickCount()&&orderCount==categorySortKey.getOrderCount()&&payCount==categorySortKey.getPayCount()) + // 如果点击数、订单数和支付数都与给定实例相等,则也返回true,表示小于等于 + else if (clickCount == categorySortKey.getClickCount() && orderCount == categorySortKey.getOrderCount() && payCount == categorySortKey.getPayCount()) return true; + // 其他情况返回false return false; } + // 实现Ordered接口中的$greater$eq方法,用于判断当前实例是否大于等于给定的CategorySortKey实例 @Override public boolean $greater$eq(CategorySortKey categorySortKey) { - if($greater(categorySortKey)) - { + // 如果当前实例大于给定实例(通过$greater方法判断),则返回true + if ($greater(categorySortKey)) { return true; - }else if(clickCount==categorySortKey.getClickCount()&&orderCount==categorySortKey.getOrderCount()&&payCount==categorySortKey.getPayCount()) + } + // 如果点击数、订单数和支付数都与给定实例相等,则也返回true,表示大于等于 + else if (clickCount == categorySortKey.getClickCount() && orderCount == categorySortKey.getOrderCount() && payCount == categorySortKey.getPayCount()) return true; + // 其他情况返回false return false; } + // 实现Ordered接口中的compareTo方法,与compare方法逻辑基本一致,用于定义比较规则 + // 根据点击数、订单数、支付数依次比较来确定两个实例的大小关系 @Override public int compareTo(CategorySortKey categorySortKey) { - if(clickCount-categorySortKey.getClickCount()!=0) - { - return (int) (clickCount-categorySortKey.getClickCount()); - }else if(clickCount-categorySortKey.getClickCount()==0&&orderCount-categorySortKey.getOrderCount()!=0) - { - return (int) (orderCount-categorySortKey.getOrderCount()); - } - else if(clickCount-categorySortKey.getClickCount()==0&&orderCount-categorySortKey.getOrderCount()==0&&payCount-categorySortKey.getPayCount()!=0) - return (int) (payCount-categorySortKey.getPayCount()); + if (clickCount - categorySortKey.getClickCount()!= 0) { + return (int) (clickCount - categorySortKey.getClickCount()); + } else if (clickCount - categorySortKey.getClickCount() == 0 && orderCount - categorySortKey.getOrderCount()!= 0) { + return (int) (orderCount - categorySortKey.getOrderCount()); + } else if (clickCount - categorySortKey.getClickCount() == 0 && orderCount - categorySortKey.getOrderCount() == 0 && payCount - categorySortKey.getPayCount()!= 0) + return (int) (payCount - categorySortKey.getPayCount()); return 0; } + // 获取点击次数的方法 public Long getClickCount() { return clickCount; } + // 设置点击次数的方法 public void setClickCount(Long clickCount) { this.clickCount = clickCount; } + // 获取订单次数的方法 public Long getOrderCount() { return orderCount; } + // 设置订单次数的方法 public void setOrderCount(Long orderCount) { this.orderCount = orderCount; } + // 获取支付次数的方法 public Long getPayCount() { return payCount; } + // 设置支付次数的方法 public void setPayCount(Long payCount) { this.payCount = payCount; } + // 同时设置点击次数、订单次数和支付次数的方法 public void set(Long clickCount, Long orderCount, Long payCount) { this.clickCount = clickCount; this.orderCount = orderCount; this.payCount = payCount; } -} +} \ No newline at end of file diff --git a/src/test/java/cn/edu/hust/jdbc/JDBCHelperTest.java b/src/test/java/cn/edu/hust/jdbc/JDBCHelperTest.java index dbcc9ae..a216d81 100644 --- a/src/test/java/cn/edu/hust/jdbc/JDBCHelperTest.java +++ b/src/test/java/cn/edu/hust/jdbc/JDBCHelperTest.java @@ -1,47 +1,68 @@ -package cn.edu.hust.jdbc; - -import org.junit.Test; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -public class JDBCHelperTest { - @Test - public void testUpdate() - { - String sql="insert into user(username,age) values(?,?)"; - Object[] params={"zhangsan",12}; - JDBCHelper.getInstance().excuteUpdate(sql,params); +package cn.edu.hust.jdbc; // 包名,通常用来指定代码所属的模块或功能。 + +import org.junit.Test; // 导入JUnit的Test注解,用于标记测试方法。 + +import java.sql.ResultSet; // 导入SQL的ResultSet类,用于处理查询结果集。 +import java.sql.SQLException; // 导入SQL异常类,用于捕获和处理数据库相关的错误。 +import java.util.ArrayList; // 导入ArrayList类,用于创建动态数组。 +import java.util.List; // 导入List接口,用于定义列表类型的集合。 + +public class JDBCHelperTest { // 测试类,包含多个测试方法,用于验证JDBCHelper类的功能。 + + // 测试更新操作(插入数据) + @Test // 标记此方法为测试方法,JUnit会自动识别并执行。 + public void testUpdate() { + // SQL插入语句,插入一个用户信息到user表中。 + String sql = "insert into user(username, age) values(?, ?)"; + + // 插入的参数,表示要插入的用户名是"zhangsan",年龄是12。 + Object[] params = {"zhangsan", 12}; + + // 使用JDBCHelper类的单例实例执行更新操作(插入)。 + JDBCHelper.getInstance().excuteUpdate(sql, params); } + // 测试批量操作(批量插入数据) + @Test // 标记此方法为测试方法。 + public void testBatch() { + // SQL插入语句,插入多个用户信息到user表中。 + String sql = "insert into user(username, age) values(?, ?)"; - @Test - public void testBatch() - { - String sql="insert into user(username,age) values(?,?)"; - List params=new ArrayList(); - params.add(new Object[]{"lisi",23}); - params.add(new Object[]{"wangwu",28}); - JDBCHelper.getInstance().excuteBatch(sql,params); + // 创建一个List集合用于保存多组插入参数。 + List params = new ArrayList<>(); + + // 添加第一组插入参数:用户名"lisi",年龄23。 + params.add(new Object[]{"lisi", 23}); + + // 添加第二组插入参数:用户名"wangwu",年龄28。 + params.add(new Object[]{"wangwu", 28}); + + // 使用JDBCHelper类的单例实例执行批量插入操作。 + JDBCHelper.getInstance().excuteBatch(sql, params); } - @Test - public void testQuery() - { - String sql="select * from user where username=?"; - Object[] params={"zhangsan"}; + // 测试查询操作(查询单个用户数据) + @Test // 标记此方法为测试方法。 + public void testQuery() { + // SQL查询语句,查询username为"zhangsan"的用户信息。 + String sql = "select * from user where username=?"; + + // 查询条件,用户名为"zhangsan"。 + Object[] params = {"zhangsan"}; + + // 使用JDBCHelper类的单例实例执行查询操作,并传入查询回调接口。 JDBCHelper.getInstance().excuteQuery(sql, params, new JDBCHelper.QueryCallBack() { + + // QueryCallBack接口的process方法,负责处理查询结果。 @Override public void process(ResultSet rs) { try { - if(rs.next()) - { - System.out.println("结果是"+rs.getInt(2)); + // 如果查询结果集中有数据,取出第二列的内容(假设为年龄)。 + if (rs.next()) { + System.out.println("结果是" + rs.getInt(2)); // 输出查询结果中的第二列(年龄)。 } } catch (SQLException e) { - e.printStackTrace(); + e.printStackTrace(); // 捕获SQL异常并打印堆栈信息。 } } });