jeecgboot按字段分表_jeecgboot 分表-程序员宅基地

技术标签: jeecgboot分表  javaWeb知识  mybatis分表  mysql分表实现  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/eakom/article/details/104951373

智能推荐

使用单例模式封装go-kafka链接(github.com/Shopify/sarama)_kafka-go封装-程序员宅基地

文章浏览阅读2.9k次。package kafkaimport (“errors”“github.com/Shopify/sarama”“github.com/luslin/webs/src/server1/conf”“github.com/luslin/webs/src/server1/dbsource/redis”“github.com/prometheus/common/log”“sync”)va..._kafka-go封装

Toeplitz矩阵以及矩阵乘法FFT加速_toeplitz矩阵乘向量例子-程序员宅基地

文章浏览阅读3.9k次。Toeplitz矩阵以及矩阵乘法FFT加速1.Toeplitz矩阵托普利兹矩阵,简称为T型矩阵,它是由Bryc、Dembo、Jiang于2006年提出的。托普利兹矩阵的主对角线上的元素相等,平行于主对角线的线上的元素也相等;矩阵中的各元素关于次对角线对称,即T型矩阵为次对称矩阵。这里我们使用matlab中自带的函数生成一个toeplitz矩阵的例子:x=[1 2 3 4];y=[1 5 6 7 8 9];z=toeplitz(x,y);我们可以得到一个这样的矩阵结果:我们可以看到,其中x中_toeplitz矩阵乘向量例子

Python pandas练习Retuns50stocks股票,纯英文ipynb作业20题,100%正确答案_create a function that takes a positive integer an-程序员宅基地

文章浏览阅读848次,点赞2次,收藏3次。#%% mdAssigment 4Instructions: This problem set should be done individuallyAnswer each question in the designated space belowAfter you are done. save and upload in blackboard.Please check that you are submitting the correct file. One way to avoid mist_create a function that takes a positive integer and returns the next bigger

FDR校正的程序实现及严格程度对比_fdr校正后全没有意义-程序员宅基地

文章浏览阅读2.4w次,点赞9次,收藏44次。FDR校正的程序实现及严格程度对比前言 做统计分析就离不开P value<0.05,而写过科研文章的人也都知道没有经过FDR校正的P值就像一盘散沙,不用风吹,走两步自个儿就散了。那么FDR校正这个让人又爱又恨的东西是什么呢?又是如何实现呢? 原理是这样:设总共有m个候选基因,每个基因对应的p值从小到大排列分别是 p(1),p(2),..._fdr校正后全没有意义

淦VINS-MONO源码 01--IMU的误差模型和标定-程序员宅基地

文章浏览阅读921次。IMU的误差模型和标定工作原理加速度计工作原理陀螺仪测量原理误差来源IMU噪声模型biasscale轴偏差IMU校准确定性误差六面法标定bias和scale factor温度相关的参数标定随机误差高斯白噪声Bias 随机游走艾伦方差标定数学模型加速度计数学模型陀螺仪数学模型在看完orb-slam后,也投了一些实习,发现纯视觉的方案在很多方面都没得到采用,特别是自动驾驶中定位感知方面,基本上是雷达+IMU+相机+GPS等等的多传感器融合,所以接下来的计划会看看vins-mono和loam的源代码,一个是IM

Dotween常用方法详解-程序员宅基地

文章浏览阅读10w+次,点赞213次,收藏880次。Dotween是unity里非常常用的插件,但是很多人应该没有仔细的阅读过它的api,它实际有很多好用的方法,下面我就针对一些相对常用的方法,做下总结:一、Unity常用组件拓展方法(1) Transform拓展方法1)Position 改变世界坐标 移动方法,第一个参数是要移动到的目标点,不是移动这个向量的距离 transform.DOMov..._dotween

随便推点

python中git克隆代码失败_使用Git clone代码失败的解决方法-程序员宅基地

文章浏览阅读830次。今天从GitHub上找到一份代码,想要clone到本地,便利用Git去clone代码,结果报了以下错误:error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054fatal: The remote end hung up unexpectedlyfatal: early EOFfatal: index-pa..._python无法使用clone

数字单片机的技术发展-程序员宅基地

文章浏览阅读1.8k次。数字单片机的技术发展 数字单片机的技术进步反映在内部结构、功率消耗、外部电压等级以及制造工艺上。在这几方面,较为典型地说明了数字单片机的水平。在目前,用户对单片机的需要越来越多,但是,要求也越来越高。下面分别就这四个方面说明单片机的技术进步状况。 1、 内部结构的进步 单片机在内部已集成了越来越多的部件,这些部件包括一般常用的电路,例如:定时器,比较器,A/D转换器,D

sqlite3 调用sqlite3_exec查询数据时出现"callback requested query abort"-程序员宅基地

文章浏览阅读4.9k次,点赞6次,收藏7次。不知道有没有人跟我一样,在调用sqlite3的API中sqlite3_exec()函数时出现abort问题,今天我就遇到了,如下图。函数基本原型为: int sqlite3_exec(sqlite3*,const char *sql,sqlite_callback,void *param,char **errmsg); 主要功能是用于查询数据库里的_callback requested query abort

关于ctags的安装和使用_ctags 安装-程序员宅基地

文章浏览阅读627次。1、运行下列命令,是ctags进行安装$ sudo apt-get install ctags2、安装成功后,在项目目录下,就可以了$ ctags -R3、一些细节,如果你是你只想生成php的$ ctags --languages=php -R .4、或者$ ctags -R --exclude=*.js5、无聊时,可以查看ctags都支持那些语言$ ctags --list-languages开发中如何跳转ctrl + ]跳转后如何回到开始的位置_ctags 安装

4.链表组件(LeetCode 817)_给定链表头结点 head,该链表上的每个结点都有一个唯一的整型值 。 同时给定列表 g-程序员宅基地

文章浏览阅读254次。问题描述 :给定链表头结点 head,该链表上的每个结点都有一个唯一的整型值 。同时给定列表 G,该列表是上述链表中整型值的一个子集。返回列表 G 中组件的个数,这里对组件的定义为:链表中一段极长连续结点的值(该值必须在列表 G 中)构成的集合。极长的含义是:这段连续结点的前面或后面结点不属于G。示例 1:输入:head: 0->1->2->3G = [0, 1, 3]输出: 2解释:链表中,0 和 1 是相连接的,且 G 中不包含 2,所以 [0, 1] 是 G 的一_给定链表头结点 head,该链表上的每个结点都有一个唯一的整型值 。 同时给定列表 g

使用神器MobaXterm连接远程mysql和redis-程序员宅基地

文章浏览阅读3.4k次。https://mobaxterm.mobatek.net/download-home-edition.htmlmysqlredis连接测试mysql127.0.0.13307密码使用线上密码redis127.0.0.16380密码使用线上密码转载于:https://www.cnblogs.com/cxscode/...