spring项目实现按日期分表技术

本文介绍了如何在Spring项目中使用MyBatisORM框架和MySQL数据库实现按天的日期分表,包括Controller、Service层的接口和方法,以及Mapper的XML映射文件。同时提到了在实际项目中需要考虑的事务管理、查询优化和分表扩展性问题。
摘要由CSDN通过智能技术生成

下面是一个Spring项目实现日期分表(按天表)的简单示例。这个示例采用了MyBatis作为ORM框架和MySQL数据库。

Controller

import com.alibaba.fastjson.JSONObject;
import your.package.LogService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class LogController {
    @Autowired
    private LogService logService;

    @PostMapping("/log/save")
    @ApiOperation(value = "保存日志信息")
    public String saveLog(@RequestBody JSONObject jsonObject) {
        logService.saveLog(jsonObject);
        return "ok";
    }

    @PostMapping("/log/createTable")
    @ApiOperation(value = "创建日志信息表")
    public String createTable() {
        logService.createdLogTable();
        return "ok";
    }
}

Service

import cn.hutool.core.date.format.FastDateFormat;
import com.alibaba.fastjson.JSONObject;
import your.package.LogMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
@Slf4j
public class LogService {

    @Autowired
    private LogMapper logMapper;

    public void saveLog(JSONObject jsonObject) {
        try {
            Date now = new Date();
            String dateStr = FastDateFormat.getInstance("yyyyMMdd").format(now);//20210728
            String data = (String) jsonObject.get("data");
            logMapper.insert(dateStr, data);
        } catch (Exception e) {
            log.error("api log 写入失败:{}", e.getMessage());
        }
    }

    @Scheduled(cron = "0 0 0 * * ?")
    public void createdLogTable() {
        Date now = new Date();
        String dateStr = FastDateFormat.getInstance("yyyyMMdd").format(now);//20210728
        logMapper.createdLogTable(dateStr);
    }
}

Mapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Repository;

@Repository
public interface LogMapper extends BaseMapper<T> {

    /**
     * 添加记录
     * @param date
     * @param data
     * @return
     */
    int insert(@Param("date") String date, @Param("data") String data);


    void createdLogTable(@Param("date") String date);
}

Xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="your.package.LogMapper">

    <insert id="insert">
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into t_log_${date}(data) values (#{data})
    </insert>
    <update id="createdLogTable">
        CREATE TABLE  if not exists t_log_${date} (
            `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
            `data` varchar(128) NOT NULL DEFAULT '' COMMENT '日志',
            PRIMARY KEY (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='日志记录表'
    </update>
</mapper>

总结

请注意,实际项目中分表的逻辑可能更复杂。根据业务情况和数据规模,可能还需要考虑到事务一致性、查询优化、表的创建和维护策略等问题。通常分表方案还会搭配使用数据中间件,例如ShardingSphere等,以提供更灵活且自动化的分表能力。

这个例子仅提供了按天分表保存日志的一种实现方式,提供作为概念演示。在真实的生产环境中,还需要进一步考量性能、事务和拓展性等问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值