MyBatis implementa un almacenamiento mensual simple de tablas de datos


Prefacio

Un escenario empresarial introducido hoy es principalmente cuando la tabla de datos es demasiado grande y los datos deben almacenarse mensualmente. Por ejemplo, la tabla de registro de operaciones del usuario us_record se puede dividir por mes, us_record_2022_11, us_record_2022_12, etc.
El siguiente contenido está implementado en base a SpringBoot + MyBatis


1. Análisis y código de ideas simples

Al almacenar datos por mes, primero debe determinar si la tabla mensual correspondiente al registro ya existe al ingresar al programa .

  • Si ingresa por primera vez, debe crear una tabla de datos basada en los caracteres distintivos correspondientes.
  • Si se ha creado una tabla de registros, los datos deben insertarse dinámicamente en función de caracteres distintivos.

1.1 Determinar si existe una tabla mensual correspondiente

Aquí distinguimos por año_mes

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);
}

Cómo determinar si existe una determinada tabla en la base de datos

  • Escribir definición de interfaz
// database:对应的数据库  table:对应的表名
int countTableNum(@Param("database") String database, @Param("table") String table);
  • Escriba la implementación de SQL (cuántas tablas de datos con este nombre hay en la base de datos correspondiente)
<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 Crear tablas basadas en distinción de meses

  • Escribir definición de interfaz
// 按月份为后缀创建对应的数据库表
int createTable(@Param("tableName") String tableName);
  • Escribir implementación 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 Insertar tabla de datos según mes

  • Escribir definición de interfaz
// 根据月份插入对应的用户相关记录表 UsDataRecord:对应的用户操作记录
int insertData(@Param("record") UsDataRecord usDataRecord, @Param("tableName") String tableName);
  • Escriba una implementación de SQL (agregue declaraciones de inserción según su propio negocio)
<insert id="insertData">
      insert into us.${tableName}
      ..........
 </insert>        

1.4 Proceso de uso completo

// 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);
       

Resumir

Este proceso de tabulación de datos es relativamente sencillo. Principalmente aclara cómo se cuenta el número de tablas en la base de datos y cómo crear tablas dinámicamente .

Supongo que te gusta

Origin blog.csdn.net/TheWindOfSon/article/details/128457370
Recomendado
Clasificación