大家都知道没到万不已就不分表分库,我也是没有办法,先不使用中间件实现简单的分表操作。可根据实际情况来分表,我现在要分的就是运动穿戴设备的运动数据,单次运动对应多个运动轨迹记录,有运动表(watch_sport)和运动详情表(watch_sport_detail),数据量比较大的就是运动详情表了,像我这种情况算是比较简单的,单次运动详情都在一张表里就行,而且不同运动之间相对独立。
刚开始使用了比较傻的方法,就是有几个表就创建几个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()); } }
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); }
<?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>
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 省略 }
这样简单多了,增加多少张表都不会增加代码量了,原来的代码已经删了不然贴出来给大家看看。