前言
今天介绍的一个业务场景主要是数据表过大时,需要按月份进行分月数据存储。例如用户操作记录表 us_record,可以按月份进行划分,us_record_2022_11, us_record_2022_12 等。
以下内容是基于 SpringBoot + MyBatis实现的
一、简单的思路分析和代码
进行数据分月存储时,先要判断进入程序时是否已存在记录对应的月度表。
- 若为第一次进入需要根据对应的区分字符创建数据表
- 若已创建记录表,需要根据区分字符动态插入数据
1.1 判断是否存在对应的月度表
这里以年度_月份为区分
LocalDate now = LocalDate.now();
String tableName = new StringBuilder().append(" us_record").append("_").append(now.getYear()).append("_").append(now.getMonthValue()).toString();
if(usDataRecordMapper.countTableNum(DATABASE, tableName) == 0){ // 若数据库中不存在,则新建对应的表
usDataRecordMapper.createTable(tableName);
}
如何判断数据库中是否存在某张表
编写接口定义
// database:对应的数据库 table:对应的表名
int countTableNum(@Param("database") String database, @Param("table") String table);
编写sql 实现 (对应的数据库下有多少个该名字的数据表)
<select id="countTableNum" resultType="java.lang.Integer">
select count(*) from information_schema.TABLES t
where t.TABLE_SCHEMA = #{database}
and t.TABLE_NAME = #{table}
</select>
1.2 根据月份区分创建表
编写接口定义
// 按月份为后缀创建对应的数据库表
int createTable(@Param("tableName") String tableName);
编写sql 实现
<update id="createTable">
CREATE TABLE us.${tableName}
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`app_type` int(4) NOT NULL COMMENT '来源 1:pc 3: 安卓 4: ios',
`event_type` int(4) DEFAULT '1' COMMENT '事件类型 1:下载 2:视频时长',
`business_type` int(4) DEFAULT NULL COMMENT '业务类型: 1:课程资料 2:复习资料 3:直播 4:录播 5:回放',
`online_duration` int(4) DEFAULT NULL,
`mapping_id` varchar(255) NOT NULL DEFAULT '' COMMENT '关联id',
`user_id` varchar(150) NOT NULL DEFAULT '' COMMENT '用户id',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`unit` int(4) DEFAULT NULL COMMENT '单位 : 1/次数 2/分钟 3/秒',
`learn_id` varchar(150) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户相关记录表';
</update>
1.3 根据月份插入数据表
编写接口定义
// 根据月份插入对应的用户相关记录表 UsDataRecord:对应的用户操作记录
int insertData(@Param("record") UsDataRecord usDataRecord, @Param("tableName") String tableName);
编写sql 实现 (根据自己的业务补充插入语句)
<insert id="insertData">
insert into us.${tableName}
..........
</insert>
1.4 完整的使用流程
// Step1: 判断是否存在对应月度表
LocalDate now = LocalDate.now();
String tableName = new StringBuilder().append(TABLE_NAME).append("_").append(now.getYear()).append("_").append(now.getMonthValue()).toString();
if(usDataRecordMapper.countTableNum(DATABASE, tableName) == 0){ // 若数据库中不存在,则新建对应的表
// Step2: 创建对应数据的月度表
usDataRecordMapper.createTable(tableName);
}
// Step3: 往对应月度表插入数据
usDataRecordMapper.insertData(usDataRecord, tableName);
到此这篇关于MyBatis实现简单的数据表分月存储的文章就介绍到这了,更多相关MyBatis 数据表分月存储内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!