转载

Mybatis Plus 分表操作

大家都知道没到万不已就不分表分库,我也是没有办法,先不使用中间件实现简单的分表操作。可根据实际情况来分表,我现在要分的就是运动穿戴设备的运动数据,单次运动对应多个运动轨迹记录,有运动表(watch_sport)和运动详情表(watch_sport_detail),数据量比较大的就是运动详情表了,像我这种情况算是比较简单的,单次运动详情都在一张表里就行,而且不同运动之间相对独立。

Mybatis Plus 分表操作

刚开始使用了比较傻的方法,就是有几个表就创建几个Entity和Mapper,然后通过插件watch_sport的Id取摩来判断执行哪个Mapper,刚开始我创建了10个表,所以Service有10个Mapper,写switch和10个case操作,如果是100个或者更多的表我真的要崩溃了。目前方案是取摩操作可取,利用动态替换表名的方式来简化操作。

添加数据操作

@Service
public class WatchSportDetailServiceImpl implements WatchSportDetailService {

    @Autowired
    private WatchSportDetailMapper watchSportDetailMapper;

    @Override
    public void addWatchSportDetail(WatchSportDetailViewModel model) {
        final int tableNumber = 10; // 分表数量
        long watchSportDetailId = model.getWatchSportId();
        int position = (int) (watchSportDetailId % tableNumber);
        watchSportDetailMapper.add(position, model.getWatchSportId(), model.getLatitude(), model.getLongitude(), model.getHr(),
                model.getStep(), model.getTime());
    }
}

WatchSportDetailMapper.java

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wiiteer.wear.entity.WatchSportDetail;
import org.apache.ibatis.annotations.Mapper;
import java.util.Date;

@Mapper
public interface WatchSportDetailMapper extends BaseMapper<WatchSportDetail> {

    void add(int tableIndex, long watchSportId, Double latitude, Double longitude, Integer hr, Integer step, Date time);
}

WatchSportDetailMapper.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="com.wiiteer.wear.mapper.WatchSportDetailMapper">

    <insert id="add">
        INSERT INTO watch_sport_detail#{tableIndex} (
          watch_sport_id,
          time,
          latitude,
          longitude,
          hr,
          step,
          create_time
        )
        VALUES (#{watchSportId},#{time},#{latitude},#{longitude},#{hr},#{hr},NOW());
    </insert>
</mapper>

WatchSportDetail.java

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.util.Date;

@Data
public class WatchSportDetail {

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    // 运动ID
    private Long watchSportId;

    // 纬度
    private Double latitude;

    // 经度
    private Double longitude;

    // 心率
    private Integer hr;

    // 步数
    private Integer step;

    // 时间
    private Date time;
    private Date createTime;

    // get set 省略
}

这样简单多了,增加多少张表都不会增加代码量了,原来的代码已经删了不然贴出来给大家看看。

原文  https://segmentfault.com/a/1190000023134410
正文到此结束
Loading...