大家都知道没到万不已就不分表分库,我也是没有办法,先不使用中间件实现简单的分表操作。可根据实际情况来分表,我现在要分的就是运动穿戴设备的运动数据,单次运动对应多个运动轨迹记录,有运动表(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());
}
}
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 省略
}
这样简单多了,增加多少张表都不会增加代码量了,原来的代码已经删了不然贴出来给大家看看。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。