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

 更新时间:2023年03月17日 15:56:14   作者:Stephen GS  
本文主要介绍了MyBatis实现简单的数据表分月存储,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

相关文章

  • Struts2中异常处理机制分析

    Struts2中异常处理机制分析

    这篇文章主要介绍了Struts2中异常处理机制分析,涉及到了声明式异常捕捉的相关内容,以及两种异常映射的分析,需要的朋友可以参考下。
    2017-09-09
  • Java实现批量导入excel表格数据到数据库中的方法

    Java实现批量导入excel表格数据到数据库中的方法

    这篇文章主要介绍了Java实现批量导入excel表格数据到数据库中的方法,结合实例形式详细分析了java导入Excel数据到数据库的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Java 中的vector和list的区别和使用实例详解

    Java 中的vector和list的区别和使用实例详解

    在大家还没有了解vector,list,deque的知识之前,我先给大家介绍下stl,本文重点给大家介绍vector和list的区别及使用,感兴趣的的朋友一起看看吧
    2017-09-09
  • Java实现员工信息管理系统

    Java实现员工信息管理系统

    这篇文章主要为大家详细介绍了Java实现员工信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Spring Cloud 使用 Resilience4j 实现服务熔断的方法

    Spring Cloud 使用 Resilience4j 实现服务熔断的方法

    服务熔断是为了保护我们的服务,比如当某个服务出现问题的时候,控制打向它的流量,让它有时间去恢复,或者限制一段时间只能有固定数量的请求打向这个服务,这篇文章主要介绍了Spring Cloud 使用 Resilience4j 实现服务熔断,需要的朋友可以参考下
    2022-12-12
  • idea向System.getenv()添加系统环境变量的操作

    idea向System.getenv()添加系统环境变量的操作

    这篇文章主要介绍了idea向System.getenv()添加系统环境变量的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • GC算法实现篇之并发标记清除

    GC算法实现篇之并发标记清除

    这篇文章主要为大家介绍了GC算法实现篇之并发-标记-清除, CMS垃圾收集器在减少停顿时间上做了很多给力的工作, 大量的并发线程执行的工作并不需要暂停应用线程
    2022-01-01
  • Spring Boot 自定义数据源DruidDataSource代码

    Spring Boot 自定义数据源DruidDataSource代码

    这篇文章主要介绍了Spring Boot 自定义数据源DruidDataSource代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SpringBoot 过滤器、拦截器、监听器对比及使用场景分析

    SpringBoot 过滤器、拦截器、监听器对比及使用场景分析

    过滤器是处于客户端和服务器资源文件之间的一道过滤网,这篇文章主要介绍了SpringBoot 过滤器、拦截器、监听器对比及使用场景分析,需要的朋友可以参考下
    2021-05-05
  • Java基础泛型详情

    Java基础泛型详情

    这篇文章主要介绍了Java基础泛型详情,泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型,下面文章的详细介绍,需要的朋友可以参考一下
    2022-04-04

最新评论