文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MyBatis实现简单的数据表分月存储

2023-03-19 18:02

关注

前言

今天介绍的一个业务场景主要是数据表过大时,需要按月份进行分月数据存储。例如用户操作记录表 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 数据表分月存储内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯