在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獲取不同的表。