1、第一步,在数据透视表下方创建一个新表,然后进入下一步。
2、其次,完成上述步骤后,在新表中引用数据透视表F3的数据时,发现自动生成了一串函数公式,然后进入下一步。
3、接着,完成上述步骤后,将“李四”更改为“$E3”,将“元月”更改为“F$2”,然后进入下一步。
4、最后,完成上述步骤后,把单元格复制并粘贴到其他区域,数据透视表数据的引用成功,问题就解决了。
1、用超链接方法,如在一个工作蔳中表1用来输入数据,表2、表3、表4。。。。等用来进行相关汇总及分 析与查询
2、或者用2个文件,一个文件1用来输入数据用,另一个文件用中的数据采用超链接的方法,进行查询、窗体、汇总、报表、数据分析的设计
MybatisPlus特性
快速开始
初始化测试数据表:
父工程依赖
该工程用于依赖管理,pom如下:
创建MyBaitsPlus工程
依赖如下:
properties配置
在这里配置数据库连接,以及数据连接池与mybatisplus的配置等
常规增删改查实现
创建实体类:
该lombok插件省去getset方法。
创建UserMapper接口,并且实现BaseMapper<User>这里我们指定实体类为user可直接使用接口中的方法。
UserMapperxml,如下:
执行SQL:
在SpringBoot中使用MybatisPlus分页需要注入Bean,并且在启动类上使用@MapperScan("comsimplespringbootmapper")扫描mapper文件路径如下:
使用MyBatisPlus可以为我们减少很多很多的代码,不过需要编写实体类,有失必有得。
配置动态数据源
dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。
优势
网上关于动态数据源的切换的文档有很多,核心只有两种。
如果你的数据源较少,场景不复杂,选择以上任意一种都可以。如果你需要更多特性,请尝试本动态数据源。
劣势
不能使用多数据源事务(同一个数据源下能使用事务),网上其他方案也都不能提供。
如果你需要使用到分布式事务,那么你的架构应该到了微服务化的时候了。
如果呼声强烈,项目达到800 star,作者考虑集成分布式事务。
PS: 如果您只是几个数据库但是有强烈的需求分布式事务,建议还是使用传统方式自己构建多套环境集成atomic这类,网上百度很多。
约定
建议
强烈建议在 主从模式 下遵循普遍的规则,以便他人能更轻易理解你的代码。
主数据库 建议 只执行 INSERT UPDATE DELETE *** 作。
从数据库 建议 只执行 SELECT *** 作。
快速开始
加入依赖:
注释掉原来的数据库配置,加入:
使用 @DS 切换数据源。
@DS 可以注解在方法上和类上, 同时存在方法注解优先于类上注解 。
注解在service实现或mapper接口方法上,但强烈不建议同时在service和mapper注解。 (可能会有问题)
如果不加入主键则使用默认数据源。
DruidDataSourceAutoConfigure会注入一个DataSourceWrapper,其会在原生的springdatasource下找url,username,password等。而我们动态数据源的配置路径是变化的,所以需要排除:
或者在类上排除:
然后更换properties配置信息:
本篇代码案例地址:
>
这里使用的是dynamic-datasource-spring-boot-starter ,它是一个基于springboot的快速集成多数据源的启动器。
1首先在pom文件引入dynamic-datasource-spring-boot-starter
2applicationyml配置文件内容如下:
上面的配置中从dynamic开始是有关多数据源的配置,primary用来配置主数据源也叫默认数据源,它的默认值是master,因此,如果不指定primary的话一定要有名为master的数据源。strict 是用来配置是否启用严格 模式,如果为true表示启用,此时如果没有匹配的数据源会抛出异常,如果为false则会使用默认数据源。datasource下面就是配置多数据源的信息了。
后面的mybatis-plus配置我主要是用来说明集成这个不会对mybatis-plus对配置产生影响,该怎么用mybatis-plus就继续怎么用。
3使用@DS("要切换的数据源"),上面配置的test可以使用@DS("test")切换数据源
1注解添加在daomapper上无效
2注解添加到interface Service类上无效
3注解添加到interface Service方法上无效
那么,此注解应该如何使用呢?
添加@DS注解到实现类或者实现类的方法上才可以
当注解添加到类上,意味着此类里的方法都使用此数据源;
当注解添加到方法上时,意味着此方法上使用的数据源优先级高于其他一切配置
常见问题:
1不能使用事务,否则数据源不会切换,使用的还是是第一次加载的数据源 。
删除 *** 作多数据源的方法或者类、接口 上的 注解 @Transactional() 即可。
2第一次加载的数据源之后,第二次(第三次) *** 作其它数据源,如果数据源不存在,使用的还是第一次加载的数据源
3数据源名称最好不要包含下滑线,下滑线的数据源切换不了
拓展-传播机制
如何实现多数据源动态切换!
最近接到一个监控数据库资源情况的小项目。需要监控多个数据库的长时间耗时的SQL,并发出短信预警提醒。
技术实现思路:
1、通过配置设置一个主数据库,通过主数据库读取需要监控的数据库的地址,账号密码,驱动类型,需要执行的SQL,以及查询结果字段,短信模板等。
2、使用jdbc模板实现,动态数据源的配置及切换。
3、短信内容实现动态替换,模板引擎替换
4、动态SQL,根据执行类型字段,支持增删改查的SQL
5、可以根据插入的SQL的链路串起来SQL执行顺序。前边的SQL也可以动态生成后续需要动态执行的SQL,动态插入到执行SQL列表中。
今天先把思路设计出来,后续再上实现的代码。
如果动态表格信息不变,可以考虑设置单元格的值为常量。以下是常用办法:
1 在Excel中选中需要设为常量的单元格或一列/行单元格后,鼠标右键选择“格式单元格”,在d出的“元格格式”对话框中选择“数字”选项卡,然后在“分类”列表中选择相应的数字格式,你可以选择“文本”或“数字”格式,并且在“类型”框中输入数字或文本。
2 如果要对多个单元格进行设置,可以使用填充工,首先将一个单元格填入所需字符或数字,选中单元格后再使用拖动填充工具把相邻单元格一起填好,就可以将原来的动态表格变为常量表格了。
3 另外,如果是需要将整个表格都设置为量,可以选中表格中的所有单元格,然后按下“Ctrl+C”复制表格,再选择只包含数据的区域,点击右键,在d出的“常规”列表中选择“值”,确定即可,这样就可以将整个表格的内容设置为常量了。
注意的是,以上方法适用于Excel等电子表格软件,如果是在其他软件中使用动态表格,需要根据具体情况使用相应的方法。
1 概述
笔者从2014年开始接触SaaS(Software as a Service),即多租户(或多承租)软件应用平台;并一直从事相关领域的架构设计及研发工作。机缘巧合,在笔者本科毕业设计时完成了一个基于SaaS的高效财务管理平台的课题研究,从中收获颇多。最早接触SaaS时,国内相关资源匮乏,唯一有的参照资料是《互联网时代的软件革命:SaaS架构设计》(叶伟等著)一书。最后课题的实现是基于OSGI(Open Service Gateway Initiative)Java动态模块化系统规范来实现的。
时至今日,五年的时间过去了,软件开发的技术发生了巨大的改变,笔者所实现SaaS平台的技术栈也更新了好几波,真是印证了那就话:“山重水尽疑无路,柳暗花明又一村”。基于之前走过的许多弯路和踩过的坑,以及近段时间有许多网友问我如何使用Spring Boot实现多租户系统,决定写一篇文章聊一聊关于SaaS的硬核技术。
说起SaaS,它只是一种软件架构,并没有多少神秘的东西,也不是什么很难的系统,我个人的感觉,SaaS平台的难度在于商业上的运营,而非技术上的实现。就技术上来说,SaaS是这样一种架构模式:它让多个不同环境的用户使用同一套应用程序,且保证用户之间的数据相互隔离。现在想想看,这也有点共享经济的味道在里面。
笔者在这里就不再深入聊SaaS软件成熟度模型和数据隔离方案对比的事情了。今天要聊的是使用Spring Boot快速构建独立数据库/共享数据库独立Schema的多租户系统。我将提供一个SaaS系统最核心的技术实现,而其他的部分有兴趣的朋友可以在此基础上自行扩展。
2 尝试了解多租户的应用场景
假设我们需要开发一个应用程序,并且希望将同一个应用程序销售给N家客户使用。在常规情况下,我们需要为此创建N个Web服务器(Tomcat),N个数据库(DB),并为N个客户部署相同的应用程序N次。现在,如果我们的应用程序进行了升级或者做了其他任何的改动,那么我们就需要更新N个应用程序同时还需要维护N台服务器。接下来,如果业务开始增长,客户由原来的N个变成了现在的N+M个,我们将面临N个应用程序和M个应用程序版本维护,设备维护以及成本控制的问题。运维几乎要哭死在机房了…
为了解决上述的问题,我们可以开发多租户应用程序,我们可以根据当前用户是谁,从而选择对应的数据库。例如,当请求来自A公司的用户时,应用程序就连接A公司的数据库,当请求来自B公司的用户时,自动将数据库切换到B公司数据库,以此类推。从理论上将没有什么问题,但我们如果考虑将现有的应用程序改造成SaaS模式,我们将遇到第一个问题:如果识别请求来自哪一个租户?如何自动切换数据源?
3 维护、识别和路由租户数据源
我们可以提供一个独立的库来存放租户信息,如数据库名称、链接地址、用户名、密码等,这可以统一的解决租户信息维护的问题。租户的识别和路由有很多种方法可以解决,下面列举几个常用的方式:
解决了上述问题后,我们再来看看如何获取客户端传入的租户信息,以及在我们的业务代码中如何使用租户信息(最关键的是DataSources的问题)。
我们都知道,在启动Spring Boot应用程序之前,就需要为其提供有关数据源的配置信息(有使用到数据库的情况下),按照一开始的需求,有N个客户需要使用我们的应用程序,我们就需要提前配置好N个数据源(多数据源),如果N<50,我认为我还能忍受,如果更多,这样显然是无法接受的。为了解决这一问题,我们需要借助Hibernate 5提供的动态数据源特性,让我们的应用程序具备动态配置客户端数据源的能力。简单来说,当用户请求系统资源时,我们将用户提供的租户信息(tenantId)存放在ThreadLoacal中,紧接着获取TheadLocal中的租户信息,并根据此信息查询单独的租户库,获取当前租户的数据配置信息,然后借助Hibernate动态配置数据源的能力,为当前请求设置数据源,最后之前用户的请求。这样我们就只需要在应用程序中维护一份数据源配置信息(租户数据库配置库),其余的数据源动态查询配置。接下来,我们将快速的演示这一功能。
4 项目构建
我们将使用Spring Boot 215版本来实现这一演示项目,首先你需要在Maven配置文件中加入如下的一些配置:
然后提供一个可用的配置文件,并加入如下的内容:
接下来,我们需要关闭Spring Boot自动配置数据源的功能,在项目主类上添加如下的设置:
最后,让我们看看整个项目的结构:
5 实现租户数据源查询模块
我们将定义一个实体类存放租户数据源信息,它包含了租户名,数据库连接地址,用户名和密码等信息,其代码如下:
持久层我们将继承JpaRepository接口,快速实现对数据源的CURD *** 作,同时提供了一个通过租户名查找租户数据源的接口,其代码如下:
业务层提供通过租户名获取租户数据源信息的服务(其余的服务各位可自行添加):
接下来是配置自定义的数据源,其源码如下:
在改配置类中,我们主要提供包扫描路径,实体管理工程,事务管理器和数据源配置参数的配置。
6 实现租户业务模块
在此小节中,租户业务模块我们仅提供一个用户登录的场景来演示SaaS的功能。其实体层、业务层和持久化层根普通的Spring Boot Web项目没有什么区别,你甚至感觉不到它是一个SaaS应用程序的代码。
首先,创建一个用户实体User,其源码如下:
业务层提供了一个根据用户名检索用户信息的服务,它将调用持久层的方法根据用户名对租户的用户表进行检索,如果找到满足条件的用户记录,则返回用户信息,如果没有找到,则返回null;持久层和业务层的源码分别如下:
7 配置拦截器
我们需要提供一个租户信息的拦截器,用以获取租户标识符,其源代码和配置拦截器的源代码如下:
8 维护租户标识信息
在这里,我们使用ThreadLocal来存放租户标识信息,为动态设置数据源提供数据支持,该类提供了设置租户标识、获取租户标识以及清除租户标识三个静态方法。其源码如下:
9 动态数据源切换
要实现动态数据源切换,我们需要借助两个类来完成,CurrentTenantIdentifierResolver和AbstractDataSourceBasedMultiTenantConnectionProviderImpl。从它们的命名上就可以看出,一个负责解析租户标识,一个负责提供租户标识对应的租户数据源信息。
首先,我们需要实现CurrentTenantIdentifierResolver接口中的resolveCurrentTenantIdentifier()和validateExistingCurrentSessions()方法,完成租户标识的解析功能。实现类的源码如下:
有了租户标识符解析类之后,我们需要扩展租户数据源提供类,实现从数据库动态查询租户数据源信息,其源码如下:
最后,我们还需要提供租户业务模块数据源配置,这是整个项目核心的地方,其代码如下:
10 应用测试
最后,我们通过一个简单的登录案例来测试本次课程中的SaaS应用程序,为此,需要提供一个Controller用于处理用户登录逻辑。在本案例中,没有严格的对用户密码进行加密,而是使用明文进行比对,也没有提供任何的权限认证框架,知识单纯的验证SaaS的基本特性是否具备。登录控制器代码如下:
在启动项目之前,我们需要为主数据源创建对应的数据库和数据表,用于存放租户数据源信息,同时还需要提供一个租户业务模块数据库和数据表,用来存放租户业务数据。一切准备就绪后,启动项目,在浏览器中输入:>
以上就是关于动态数据源出现无效参数怎么解决全部的内容,包括:动态数据源出现无效参数怎么解决、Excel 请问怎么自定义动态数据源、SpringBoot整合MyBatisPlus配置动态数据源等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)