在jeecgboot 使用mybatis框架,mybatis-plus3.1.1后支持分表,以下是在jeecg项目中实行分表
一、修改mybatis-plus版本后,必须要在3.1.1版本后
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.1.2</version>
</dependency>
二、修改entity实体把@TableName注释掉
@Data
//@TableName("empss_visual_meter_usage_hour")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="empss_visual_meter_usage_hour对象", description="表具每小时用量")
public class UsageHour{
/**统计时间*/
@Excel(name = "统计时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "统计时间")
private java.util.Date statTime;
/**表具编号*/
@Excel(name = "表具编号", width = 15)
@ApiModelProperty(value = "表具编号")
private java.lang.String code;
}
其他的controller、service、mapperd类等不需要改变
三、修改MybatisPlusConfig配置类paginationInterceptor()方法
@Bean
public PaginationInterceptor paginationInterceptor() {
// return new PaginationInterceptor();
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
dynamicTableNameParser.setTableNameHandlerMap(new HashMap<String, ITableNameHandler>(2) {{
//实现entity中usageHour类分表,这里按statTime,statTime为Date类型,分表时要转为年和类,注意usage_hour对应usageHour类的类名
put("usage_hour", (metaObject, sql, tableName) -> {
// 通过metaObject 可以获取传入参数,这里实现你自己的动态规则
//获取参数
Object originalObject = metaObject.getOriginalObject();
JSONObject originalObjectJSON = JSON.parseObject(JSON.toJSONString(originalObject));
JSONObject boundSql = originalObjectJSON.getJSONObject("boundSql");
JSONObject parameterObject = boundSql.getJSONObject("parameterObject");
String valueOf = String.valueOf(parameterObject);
Long statTime=0L;
if(valueOf.contains("{\"ew\":{")) {
statTime=getTimeByEw(parameterObject);
}else if(valueOf.contains("{\"et\":{")){
statTime=getTimeByEt(parameterObject);
}else {
statTime = parameterObject.getLong("statTime");
}
String formatDate = DateUtils.formatDate(statTime);
String year=formatDate.substring(0, 4);
//表名
return "empss_visual_meter_usage_hour_"+year;
});
//多个entity分表,实现entity中usageDay类分表,
put("usage_day", (metaObject, sql, tableName) -> {
//获取参数
Object originalObject = metaObject.getOriginalObject();
JSONObject originalObjectJSON = JSON.parseObject(JSON.toJSONString(originalObject));
JSONObject boundSql = originalObjectJSON.getJSONObject("boundSql");
JSONObject parameterObject = boundSql.getJSONObject("parameterObject");
String valueOf = String.valueOf(parameterObject);
Long statTime=0L;
if(valueOf.contains("{\"ew\":{")) {
statTime=getTimeByEw(parameterObject);
}else if(valueOf.contains("{\"et\":{")){
statTime=getTimeByEt(parameterObject);
}else {
// save ,update
statTime = parameterObject.getLong("statTime");
}
String formatDate = DateUtils.formatDate(statTime);
String year=formatDate.substring(0, 4);
return "empss_visual_meter_usage_day_"+year;
});
}
/**
* 使用QueryWrapper<T> query 查询时获取stat_time参数
* @param parameterObject
* @return
*/
private Long getTimeByEw(JSONObject parameterObject) {
JSONObject ew=parameterObject.getJSONObject("ew");
String sqlSegment = ew.getString("sqlSegment");
JSONObject paramNameValuePairs=ew.getJSONObject("paramNameValuePairs");
int indexOf = sqlSegment.indexOf("stat_time = #{ew.paramNameValuePairs.");
String substring = sqlSegment.substring(indexOf+37, indexOf+37+9);
Long statTime = paramNameValuePairs.getLong(substring);
return statTime;
}
/**
* 使用saveOrUpdateBatch 批量更新时时获取statTime参数
* @param parameterObject
* @return
*/
private Long getTimeByEt(JSONObject parameterObject) {
JSONObject et=parameterObject.getJSONObject("et");
Long statTime = et.getLong("statTime");
return statTime;
}
});
paginationInterceptor.setSqlParserList(Collections.singletonList(dynamicTableNameParser));
return paginationInterceptor;
}
四、分表时,应该要按某个字段分表,在增删改查时必须要带了了改字段信息,如果要实行更新ID进行修改和查询,可以在保存实现时加上分表字段信息,例如我按statTime(统计时间分表),我在save方法时,在ID前加上统计时间信息
Date statTime = usageHour.getStatTime();
SimpleDateFormat shortDateFormat = new SimpleDateFormat("yyyy");
String format = shortDateFormat.format(statTime);
usageHour.setId(format+UUID.fastUUID().toString());
usageHourService.save(usageHour);
在queryById或增删改时,更加传入的ID获取不同的表。