标签: Oracle

Oracle中复杂数据类型–集合

集合是用来处理多行单列的数据,记录是用来处理单行多列,变量处理单行单列数据,PL/SQL记录表处理多行多列数据
1.索引表
下标可以为负数,并且元素的个数没有限制,只能作为PL/SQL复合数据类型使用.
TYPE type_name IS TABLE OF element_type
[NOT NULL] INDEX BY key_type;
identifier type_name;

type_name用于指定用户自定义数据类型的名称(IS TABLE .. INDEX表示索引表),element_type用于指定索引表元素的数据类型.NOT NULL表示不能引用NULL元素.
key_type用于指定索引表下标的数据类型(BINARY_INTEGER, PLS_INTEGER, VARCHAR2),identifier定义索引表变量
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
BEGIN
SELECT ename INTO ename_table(-1) FROM emp
WHERE empno=&no;
dbms_output.put_line(‘雇员名:’||ename_table(-1));
END;
其中ename_table(-1)表示下标是-1的元素.

DECLARE
TYPE ename_table_type IS TABLE OF NUMBER
INDEX BY VARCHAR2(10);
ename_table ename_table_type;
BEGIN
ename_table(‘北京’) := 1;
END;

2.嵌套表
元素下标从1开始,元素个数没有限制,值可以是稀疏的.可以作为表列的数据类型使用.
TYPE type_name IS TABLE OF element_type
identifier type_name;
type_name用于指定嵌套表的名字,element_type指定嵌套表元素的数据类型.在使用时,必须先使用构造方法先初始化构造表
(1)在PL/SQL块中使用嵌套表
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE;
ename_table ename_table_type
BEGIN
ename_table:=ename_table_type(‘MARY’,’MARY’,’MARY’);
SELECT enmae INTO ename_table(2) FROM emp
WHERE emp_no=&no;
dbms_output.put_line(‘雇员名:’||ename_table(2));
END;
(2)在表列中使用嵌套表
必须先使用CREATE TYPE命令来建立嵌套表类型,当使用嵌套表类型作为表列的数据类型时,必须为嵌套表指定专门的存储表
CREATE TYPE phone_type IS TABLE OF VARCHAR2(20);

CREATE TABLE employee(
id NUMBER(4), name VARCHAR2(10),sal NUMBER(6,2),
phone phone_type)NESTED TABLE phone STORE AS phone_type;

经过上面的定义后,就可以在建立employee的时间使用这个嵌套类型了.
BEGIN
INSERT INTO employee VALUES(1, ‘SCOTT’, 800, phone_type(‘123456′,’13245641234’));
END;

3.变长数组(VARRAY)
下标从1开始,元素的*大个数是有限制的.
TYPE type_name, IS VARRAY(size_limit) OF element_type[NOT NULL];
identifier type_name;
使用的时间必须要用构造方法进行初始化,例如:
DECLARE
TYPE ename_table_type IS VARRAY(20) OF emp.ename%TYPE;
ename_table ename_table_type:=ename_table_type(‘A’,’A’);
BEGIN
SELECT ename INTO ename_table(1) FROM emp
WHERE empno=&no;
dbms_output.put_line(‘雇员姓名:’||ename_table(1));
END;

VARRAY也可以作为列的数据类型使用,在表中引用此数据类型必须先create type
CREATE TYPE phone_type IS VARRAY(20) OF VARCHAR2(20);
CREATE TABLE employee(
id NUMBER(4),
name VARCHAR2(20),
sal NUMBER(6,2),
phone phone_type);

Oracle与SQL Server,MySQL介绍,优缺点比较

Oracle简介:
定义
Oracle database,又名Oracle RDBMS,简称Oracle。是甲骨文公司的一款关系数据库管理系统在数据库领域一直处于*地位的产品。

优点
开放性:Oracle能在所有主流平台上运行,完全支持所有工业标准采用完全开放策略,使客户选择适合解决方案对开发商全力支持。
可伸缩性,并行性:Oracle 并行服务器通过使组结点共享同簇工作来扩展windownt能力,提供高用性和高伸缩性簇解决方案,windowsNT能满足需要用户把数据库移UNIXOracle并行服务器对各种UNIX平台集群机制都有着相当高集成度。
安全性:获得*高认证级别的ISO标准认证。*
Oracle性能高:保持开放平台下TPC-D和TPC-C世界记录。
客户端支持及应用模式:Oracle 多层次网络计算支持多种工业标准用ODBC、JDBC、OCI等网络客户连接。
使用风险 :Oracle 长时间开发经验完全向下兼容得广泛应用地风险低。
缺点
**硬件:**对硬件的要求很高(以Orcle12C为例)
组件 内存需求
Oracle Grid Infrastructure installations 4GB以上
Oracle Database installations *小1GB,建议2GB以上
管理:管理较复杂,
价格 :价格相对比价贵。
操作:操作较复杂,需要技术, 同时提供GUI和命令行,在windowsNT和unix下操作相同
SQL Serve
简介
SQL Server系列软件是Microsoft 公司推出的关系型数据库管理系统。2008年10月,SQL Server 2008简体中文版在中国正式上市,SQL Server 2008 版本可以将结构化、半结构化和非结构化文档的数据直接存储到数据库中。可以对数据进行查询、搜索、同步、报告和分析之类的操作。数据可以存储在各种设备上,从数据中心*大的服务器一直到桌面计算机和移动设备,它都可以控制数据而不用管数据存储在哪里。

此外,SQL Server 2008 允许使用 Microsoft .NET 和Visual Studio开发的自定义应用程序中使用数据,在面向服务的架构(SOA)和通过 Microsoft BizTalk Server 进行的业务流程中使用数据。信息工作人员可以通过日常使用的工具直接访问数据。

除了发布企业版的同时,提供适用于中小型应用规模的标准版、工作组版、以及180天试用的评估版及免费的学习版。

SQL Serve优点
易用性
可伸缩性:适合分布式组织
集成性:与许多其他服务器软件紧密关联
**决策便利:**用于决策支持的数据仓库功能
**性价比:**良好的性价比
灵活性:允许单位在快速变化的环境中从容响应,从而获得竞争优势。从数据管理和分析角度看,将原始数据转化为商业智能和充分利
SqlServer缺点
开放性 :SQL Server 只能windows上运行没有丝毫开放性操作系统系统稳定对数据库十分重要Windows 9X系列产品偏重于桌面应用NT server只适合小型企业而且windows平台靠性安全性和伸缩性非常有限象unix样久经考验尤其处理大数据库;
伸缩性并行性 :SQL server 并行实施和共存模型并成熟难处理日益增多用户数和数据卷伸缩性有限;
安全性:没有获得任何安全证书。
性能 :SQL Server 多用户时性能佳 。
客户端支持及应用模式: 客户端支持及应用模式。只支持C/S模式,SQL Server C/S结构只支持windows客户用ADO、DAO、OLEDB、ODBC连接;
使用风险:SQL server 完全重写代码经历了长期测试断延迟许多功能需要时间来证明并十分兼容;
MySQL
MySQL简介
一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是*流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是*好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

MySQL优点
简单易用:MySQL 是一个高性能且相对简单的数据库系统,与一些更大系统的设置和管理相比,其复杂程度较低。
价格:MySQL 对多数个人用户来说是免费的。
小巧:数据库发行版仅仅只有21M,安装完成也仅仅51M。
性能:许多客户机可同时连接到服务器。MySQL数据库没有用户数的限制,多个客户机可同时使用同一个数据库。可利用几个输入查询并查看结果的界面来交互 式地访问 MySQL。这些界面为:命令行客户机程序、Web 浏览器或 X Window System 客户机程序。此外,还有由各种语言(如C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, and Tcl)编写的界面。因此,可以选择使用已编好的客户机程序或编写自己的客户机应用程序。
连接性和安全性:MySQL 是完全网络化的,其数据库可在因特网上的任何地方访问,因此,可以和任何地方的任何人共享数据库。而且 MySQL 还能进行访问控制,可以控制哪些人不能看到您的数据。
可移植性:MySQL 可运行在各种版本的 UNIX 以及其他非 UNIX 的系统(如 Windows 和 OS/2)上。MySQL 可运行在从家用 PC 到高级的服务器上。
开放式的分发:MySQL 容易获得;只要使用 Web 浏览器即可。如果不能理解某样东西是如何起作用的,或者对某个算法感到好奇,可以将其源代码取来,对源代码进行分析。如果不喜欢某些东西,则可以更改它。
速度:MySQL 运行速度很快。开发者声称 MySQL 可能是目前能得到的*快的数据库。
MySQL缺点
不支持热备份:MySQL*大的缺点是其安全系统,主要是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变; 没有一种存储过程(Stored Procedure)语言,这是对习惯于企业级数据库的程序员的*大限制;
MySQL的价格随平台和安装方式变化:Linux的MySQL如果由用户自己或系统管理员而不是第三方安装则是免费的,第三方案则必须付许可费。Unix或Linux 自行安装免费 、Unix或Linux 第三方安装 收费;

SQL Server,MySQL,Oracle三者的区别

Oracle 能在所有主流平台上运行(包括Windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择*适合的解决方案。对开发商全力支持,Oracle并行服务器通过使一组结点共享同一簇中的工作来扩展Windows NT的能力,提供高可用性和高伸缩性的簇的解决方案。如果Windows NT不能满足需要,用户可以把数据库移到UNIX中。Oracle的并行服务器对各种UNIX平台的集群机制都有着相当高的集成度。Oracle获得*高认证级别的ISO标准认证.Oracle性能*高,保持开放平台下的TPC-D和TPC-C的世界记录Oracle多层次网络计 算,支持多种工业标准,可以用ODBC、JDBC、OCI等网络客户连接。
Oracle 在兼容性、可移植性、可联结性、高生产率上、开放性也存在优点。Oracle产品采用标准SQL,并经过美国国家标准技术所(NIST)测试。与 IBM SQL/DS,DB2,INGRES,IDMS/R等兼容。 Oracle的产品可运行于很宽范围的硬件与操作系统平台上。可以安装在70种以上 不同的大、中、小型机上;可在VMS、DOS、UNIX、WINDOWS等多种操作系统下工作。能与多种通讯网络相连,支持各种协议(TCP/IP、 DECnet、LU6.2等)。提供了多种开发工具,能*大的方便用户进行进一步的开发。Oracle良好的兼容性、可移植性、可连接性和高生产率是 Oracle RDBMS具有良好的开放性。
Oracle价格是比较昂贵的。据说一套正版的Oracle软件早在2006年年底的时候在市场上的价格已经达到了6位数。所以如果你的项目不是那种超级大的项目,还是放弃Oracle吧。

SQL Server

SQL Server 是 Microsoft推出一套产品,它具有使用方便、可伸缩性好、与相关软件集成程度高等优点,逐渐成为Windows平台下进行数据库应用开发较为理想的 选择之一。SQLServer是目前流行的数据库之一,它已广泛应用于金融、保险、电力、行政管理等与数据库有关的行业。而且,由于其易操作性及友好的界 面,赢得了广大用户的青睐,尤其是SQLServer与其它数据库,如Access、FoxPro、Excel等有良好的ODBC接口,可以把上述数据库 转成SQLServer的数据库,因此目前越来越多的读者正在使用SQLServer。
SQL Server由于是微软的产品,又有着如此强大的功能,所以他的影响力是几种数据库系统中比较大,用户也是比较多的。它一般是和同是微软产品的.net平台一起搭配使用。当然其他的各种开发平台,都提供了与它相关的数据库连接方式。因此,开发软件用SQL Server做数据库是一个正确的选择。

MySQL

MySQL不支持事务处理,没有视图,没有存储过程和触发器,没有数据库端的用户自定义函数,不能完全使用标准的SQL语法。
从数据库行家听说的*件事就是MySQL缺乏transactions,rollbacks, 和subselects的功能。如果你计划使用MySQL写一个关于银行、会计的应用程序,或者计划维护一些随时需要线性递增的不同类的计数器,你将缺乏transactions功能。在现有的发布版本的 MySQL下,请不要有任何的这些想法。(请注意,MySQL的测试版3.23.x系列现在已经支持transactions了)。
在非常必要的情况下,MySQL的局限性可以通过一部分开发者的努力得到克服。在MySQL中你失去的主要功能是subselect语句,而这正是其它的所有数据库都具有的。换而言之,这个失去的功能是一个痛苦。
MySQL没法处理复杂的关联性数据库功能,例如,子查询(subqueries),虽然大多数的子查询都可以改写成join
另一个MySQL没有提供支持的功能是事务处理(transaction)以及事务的提交(commit)/撤销(rollback)。一个事务指的是被当作一个单位来共同执行的一群或一套命令。如果一个事务没法完成,那么整个事务里面没有一个指令是真正执行下去的。对于必须处理线上订单的商业网站来说,MySQL没有支持这项功能,的确让人觉得很失望。但是可以用MaxSQL,一个分开的服务器,它能通过外挂的表格来支持事务功能。
外键(foreignkey)以及参考完整性限制(referentialintegrity)可以让你制定表格中资料间的约束,然后将约束 (constraint)加到你所规定的资料里面。这些MySQL没有的功能表示一个有赖复杂的资料关系的应用程序并不适合使用MySQL。当我们说 MySQL不支持外键时,我们指的就是数据库的参考完整性限制–MySQL并没有支持外键的规则,当然更没有支持连锁删除(cascadingdelete)的功能。简短的说,如果你的工作需要使用复杂的资料关联,那你还是用原来的Access吧。
你在MySQL中也不会找到存储进程(storedprocedure)以及触发器(trigger)。(针对这些功能,在Access提供了相对的事件进程(eventprocedure)。
MySQL+php+apache三者被软件开发者称为“php黄金组合”。

Oracle和MySQL的主要区别

Oracle:客户端和命令窗口,都是由用户决定内容-> conn user_name/password;

MySQL:客户端和命令窗口,都是由数据库决定内容-> use datebase;

都可以创建多数据库多用户,个人倾向于Oracle一个数据库中多个用户的形式,MySQL多个数据库多个用户形式(*好每个数据库对应一个用户)

Oracle是大型数据库而MySQL是中小型数据库,Oracle市场占有率达40%,MySQL只有20%左右,同时MySQL是开源的而Oracle价格非常高。

Oracle支持大并发,大访问量,是OLTP(On-Line Transaction Processing联机事务处理系统)*好的工具。

安装所用的空间差别也是很大的,MySQL安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。

Oracle也与MySQL操作上的一些区别

组函数用法规则

MySQL中组函数在select语句中可以随意使用,但在Oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列否则报错
eg:
select name,count(money) from user;这个放在MySQL中没有问题在Oracle中就有问题了。

自动增长的数据类型处理

MySQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。Oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。
CREATE SEQUENCE序列号的名称(*好是表名+序列号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中*大的值按字段的长度来定,如果定义的自动增长的序列号NUMBER(6),*大值为999999
INSERT语句插入这个字段值为:序列号的名称.NEXTVAL

单引号的处理

MySQL里可以用双引号包起字符串,Oracle里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

翻页的SQL语句的处理

MySQL处理翻页的SQL语句比较简单,用LIMIT开始位置,记录个数;PHP里还可以用SEEK定位到结果集的位置。Oracle处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<100,不能用ROWNUM>80。
以下是经过分析后较好的两种Oracle翻页SQL语句(ID是唯一关键字的字段名):
语句一:
SELECT ID, [FIELD_NAME,…] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;

语句二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (SELECT [FIELD_NAME,…] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;

长字符串的处理

长字符串的处理Oracle也有它特殊的地方。INSERT和UPDATE时*大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用Oracle里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。

日期字段的处理

MySQL日期字段分DATE和TIME两种,Oracle日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE,精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日24小时:分钟:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式,可以参看Oracle DOC.

日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)
日期字段的数学运算公式有很大的不同。MySQL找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)Oracle找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE – 7;
MySQL中插入当前时间的几个函数是:NOW()函数以`’YYYY-MM-DD HH:MM:SS’返回当前的日期时间,可以直接存到DATETIME字段中。CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())
而Oracle中当前时间是sysdate

空字符的处理

MySQL的非空字段也有空的内容,Oracle里定义了非空字段就不容许有空的内容。按MySQL的NOT NULL来定义Oracle表结构,导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

字符串的模糊比较

MySQL里用字段名like%’字符串%’,Oracle里也可以用字段名like%’字符串%’但这种方法不能使用索引,速度不快,用字符串比较函数instr(字段名,’字符串’)>0会得到更精确的查找结果。

程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。

主键

MySQL一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,MySQL将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。

Oracle实现了ANSIISQL中大部分功能,如,事务的隔离级别、传播特性等而MySQL在这方面还是比较的弱

Oracle 客户端、服务器、数据库、数据库对象(表、视图等)的关系

1、数据库服务器

所谓数据库服务器,只是在机器上安装了一个数据库管理软件,这个软件可以管理多个数据库.一般开发人员会针对每一个应用创建一个数据库

2、单实例数据库模式下的数据库服务器、数据库、数据库实例、数据库对象的关系,如下图

%title插图%num%title插图%num

Oracle 11g 迁移数据文件

一、基础环境

操作系统:Windows 或 Linux

数据库版本:Oracle Database 11g R2

二、解决问题

1、我们在进行备份数据库或者进行复杂的操作的时候,表空间自动扩展功能开启的时候,会提示磁盘空间不足。

2、将数据文件分散到不同的磁盘,以提高数据库的 I/O 性能。

三、操作步骤

1、以 DBA 的身份登陆SQL Plus ;

sqlplus / as sysdba;
2.1、查询数据文件清单:数据表空间、索引表空间使用以下语句

SELECT NAME FROM V$DATAFILE;
2.2、查询数据文件清单:临时表空间使用以下语句

SELECT FILE_NAME FROM DBA_TEMP_FILES
3、正常关闭数据库。

SHUTDOWN IMMEDIATE;
4、开始移动数据文件(为了保险起见,也可使用复制命令)。

特别说明:在SQL Plus中,先输入一个$,后面再加上操作系统的命令,可以执行操作系统的操作;数据文件的路径必须是英文双引号;在Windows 系统中,命令和路径不区分大小写,大小写均可; 在 Linux 系统中,命令和路径是区分大小写的,因此必须使用小写。

Windows 系统:

$move “D:\PROGRAMFILES\ORACLE\ORADATA\ORCL\SSPT01.DBF” “E:\ORADATA\SSPT01.DBF”;
Linux 系统:

$mv “/oradata/orcl/SSPT01.DBF” “/opt/oradata/SSPT01.DBF”;
5、将数据库启动到 mount 状态。

STARTUP MOUNT;
6、修改数据文件名称,数据文件路径必须使用单引号。(以下语句中的路径为 Windows 路径,可以替换成 Linux 路径)

ALTER DATABASE RENAME FILE ‘D:\PROGRAMFILES\ORACLE\ORADATA\ORCL\SSPT01.DBF’ TO ‘E:\ORADATA\SSPT01.DBF’;
7、打开数据库。

ALTER DATABASE OPEN;
8、查询数据库数据文件状态。

SELECT NAME,STATUS FROM V$DATAFILE;
9、查询 scott.emp 表中的数据。

SELECT * FROM SCOTT.EMP;
10、操作完成,退出 SQL Plus。

SQL 列转行的实现

–列转行,逗号拼接指定列的值

SQL Server中写法:
SELECT STUFF(( SELECT  ‘,’ + Field1 from TableA FOR XML PATH(”)), 1, 1, ”)

Oracle中写法:

方法一:wmsys.wm_concat
select wmsys.wm_concat(Field1) from TableA

方法二:LISTAGG()

2.1、LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX)

用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来

 1 with temp as(
 2   select 'China' nation,'Beijing' city from dual union
 3   select 'China' nation,'Shanghai' city from dual union
 4   select 'China' nation,'Guangzhou' city from dual union
 5   select 'USA' nation,'New York' city from dual union
 6   select 'USA' nation,'Bostom' city from dual
 7 )
 8 select nation,listagg(city,',') within group(order by city)
 9 from temp
10 group by nation;

2.2、over(partition by XXX)

在不使用Group by语句时候,使用LISTAGG函数(当作SUM()函数来使用)

1 with temp as(
2   select 'China' nation,'Beijing' city from dual union
3   select 'China' nation,'Shanghai' city from dual union
4   select 'China' nation,'Guangzhou' city from dual union
5   select 'USA' nation,'New York' city from dual union
6   select 'USA' nation,'Bostom' city from dual
7 )
8 select nation,city,listagg(city,',') within group(order by city) over(partition by nation) rank
9 from temp;

 

搭建Spring Boot项目 如何配置数据源

在上一章中,我们已经搭建好项目,现在来讲一下如何配置数据源。

由于在有的项目中,用的数据源可能会涉及多个,且是不同类型的,我们接下来就讲解多数据源的配置。

 

情景描述:

现有项目需要访问不同的数据库,有Mysql、Oracle、Sql server数据库

就以该情景为例,讲讲该如何配置。

 

步骤:

1、在resources文件夹下新建persistence-multiple-db.properties资源文件,如下图:

(备注:具体的值自己配置)

%title插图%num

 1 # Mysql数据库
 2 app.datasource.mysql.url=jdbc:mysql://192.168.1.100/XXX数据库名称
 3 app.datasource.mysql.username=username
 4 app.datasource.mysql.password=password
 5 app.datasource.mysql.driver-class-name=com.mysql.jdbc.Driver
 6 app.datasource.mysql.maximum-pool-size=10
 7 
 8 # Oracle数据库
 9 app.datasource.oracle.url=jdbc:oracle:thin:@192.168.1.100:1521/XXX数据库名称
10 app.datasource.oracle.username=username
11 app.datasource.oracle.password=password
12 app.datasource.oracle.driver-class-name=oracle.jdbc.driver.OracleDriver
13 app.datasource.oracle.maximum-pool-size=30
14 
15 # Sql server数据库
16 app.datasource.sqlserver.url=jdbc:sqlserver://192.168.1.100;databaseName=XXX数据库名称
17 app.datasource.sqlserver.username=username
18 app.datasource.sqlserver.password=password
19 app.datasource.sqlserver.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
20 app.datasource.sqlserver.maximum-pool-size=30

 

2、在config文件夹中新建MysqlDatabaseConfig.java、OracleDatabaseConfig.java、SqlserverDatabaseConfig.java

在domain文件夹中新建mysql、oracle、sqlserver文件夹

在repository文件夹中新建mysql、oracle、sqlserver文件夹

(备注:命名可以自定义,我这里是为了便于区分)

%title插图%num

接下来就依次配置这三个文件,以MysqlDatabaseConfig.java为例说明一下,另外两个同理,但是要注意@Primary(优先考虑,优先考虑被注解的对象注入)注解,另外两个不要添加该注解

 1 package com.hyl.springdemo.config;
 2 
 3 import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
 4 import com.zaxxer.hikari.HikariDataSource;
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.boot.jdbc.DataSourceBuilder;
 7 import org.springframework.context.annotation.Bean;
 8 import org.springframework.context.annotation.Configuration;
 9 import org.springframework.context.annotation.Primary;
10 import org.springframework.context.annotation.PropertySource;
11 import org.springframework.core.env.Environment;
12 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
13 import org.springframework.orm.jpa.JpaTransactionManager;
14 import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
15 import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
16 import org.springframework.transaction.PlatformTransactionManager;
17 
18 import javax.sql.DataSource;
19 import java.util.HashMap;
20 
21 @Configuration
22 @EnableEncryptableProperties
23 @PropertySource({ "classpath:persistence-multiple-db.properties" })
24 @EnableJpaRepositories(
25         basePackages = "com.hyl.springdemo.repository.mysql",
26         entityManagerFactoryRef = "mysqlEntityManager",
27         transactionManagerRef = "mysqlTransactionManager"
28 )
29 public class MysqlDatabaseConfig {
30 
31     @Autowired
32     private Environment env;
33 
34     @Bean
35     @Primary
36     public DataSource mysqlDataSource() {
37 
38         HikariDataSource dataSource = DataSourceBuilder.create().type(HikariDataSource.class).build();
39         dataSource.setDriverClassName(env.getProperty("app.datasource.mysql.driver-class-name"));
40         dataSource.setJdbcUrl(env.getProperty("app.datasource.mysql.url"));
41         dataSource.setUsername(env.getProperty("app.datasource.mysql.username"));
42         dataSource.setPassword(env.getProperty("app.datasource.mysql.password"));
43         dataSource.setMaximumPoolSize(Integer.parseInt(env.getProperty("app.datasource.mysql.maximum-pool-size")));
44 
45         return dataSource;
46     }
47 
48     @Bean
49     @Primary
50     public LocalContainerEntityManagerFactoryBean mysqlEntityManager() {
51         LocalContainerEntityManagerFactoryBean em
52                 = new LocalContainerEntityManagerFactoryBean();
53         em.setDataSource(mysqlDataSource());
54         em.setPackagesToScan(
55                 new String[] { "com.hyl.springdemo.domain.mysql" });
56 
57         HibernateJpaVendorAdapter vendorAdapter
58                 = new HibernateJpaVendorAdapter();
59         em.setJpaVendorAdapter(vendorAdapter);
60         em.setPersistenceUnitName("MysqlPersistenceUnit");
61         HashMap<String, Object> properties = new HashMap<>();
62         properties.put("hibernate.hbm2ddl.auto",
63                 env.getProperty("hibernate.hbm2ddl.auto"));
64         properties.put("hibernate.dialect",
65                 "org.hibernate.dialect.MySQL5Dialect");
66         em.setJpaPropertyMap(properties);
67 
68         return em;
69     }
70 
71     @Bean
72     @Primary
73     public PlatformTransactionManager mysqlTransactionManager() {
74 
75         JpaTransactionManager transactionManager
76                 = new JpaTransactionManager();
77         transactionManager.setEntityManagerFactory(
78                 mysqlEntityManager().getObject());
79         return transactionManager;
80     }
81 }

 

3、新建Repository,访问数据库(关于该部分,在后续的文章中再进行介绍)

%title插图%num

 

4、新建Service层,访问Repository

%title插图%num

 

5、在Controller层中进行调用

%title插图%num

 

6、运行项目,在网页中查看

%title插图%num

此篇博文主要是为了介绍配置多数据源,涉及到的其它内容在后续的博文中会逐一介绍

 

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速