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在这方面还是比较的弱

云数据库六大优势是什么 如何学好云计算技能

云数据库六大优势是什么?如何学好云计算技能?数据库是前端还是后台开发人员都需要了解和掌握的工具,传统的数据库工程师需要掌握基础理论知识、数据库基础知识、数据库运维知识以及数据库性能调优技能。不过随着云时代的到来,云数据库的应用及大规模普及,给数据库工程师的日常工作带来了很大的积*影响,下面就给大家详细介绍一下云数据库的六大优势:

%title插图%num

1、免部署。云数据库种类丰富,关系型数据库如MySQL、PostgreSQL、SQL Server,非关系型数据库如MongoDB、Redis、Memcache,兼容和支持各种版本。通过简单的购买操作,分钟级甚至秒级交付,云数据库一键部署。

2、高性能。云数据库软硬件深度调优,具有理想的性能表现。同时,底层硬件较快引入*新高性能硬件,多种性能加持下,DBA可聚焦在应用层优化。

3、高可靠性。云数据库能够自动探测,及时容灾,保证数据库服务不中断。对于数据库工程师来说,也不需要再额外部署高可用架构。

4、强大的灵活性和扩展性。云数据库弹性扩展的能力,至少是支持垂直扩展(scale-up),通常也支持水平扩展(scale-out)。灵活性则是第三维度的扩展,它可以支持一主多从,读写分离。数据库工程师能够在短期内聚焦业务,暂时不会有扩展性的烦恼。

5、自带运维能力。云数据库通常支持自动备份和手动备份两种模式,提供一键回档的功能找回数据。并提供详细的监控数据,也可配置异常自动告警。可以说,数据库工程师对云数据库基本没有运维工作。

6、安全可靠。云数据库在数据存储、网络链路访问、鉴权认证、多租户隔离方面做了多重保障,以确保数据安全,除此之外,它可以支持数据库审计,后端自动漏洞扫描,定期安全加固等。

使用云数据库后,数据库工程师可以有更多时间关注其他技能的锻炼和培养,提升自己的综合竞争力。如果你想了解更多云计算技术,可以选择专业学习一下。

SQL Server 数据库的迁移

不清楚各位大大是怎么做数据迁移的,反正俺大老粗的做法是,先把SQL Server的数据从企业管理中备份出来然后再恢复。

在恢复的过程中经常出现的一个问题就是,数据库的原来的用户跟新的数据库系统上的登录对不上号了,以前我曾经试过多次,但是经常都忘记,总是找一个*快速的方法来恢复数据库的用户,作此记录以慰昨日之辛苦:

SQL Server 数据库恢复用户之葵花点穴手, 以下部分copy from SQL Server Books Online.

sp_change_users_login
Changes the relationship between a Microsoft® SQL Server™ login and a SQL Server user in the current database.

Syntax
sp_change_users_login [ @Action = ] ‘action’
[ , [ @UserNamePattern = ] ‘user’ ]
[ , [ @LoginName = ] ‘login’ ]

Arguments
[@Action =] ‘action’

Describes the action to be performed by the procedure. action is varchar(10), and can be one of these values.

Value Description
Auto_Fix Links user entries in the sysusers table in the current database to logins of the same name in syslogins. It is recommended that the result from the Auto_Fix statement be checked to confirm that the links made are the intended outcome. Avoid using Auto_Fix in security-sensitive situations. Auto_Fix makes best estimates on links, possibly allowing a user more access permissions than intended.
user must be a valid user in the current database, and login must be NULL, a zero-length string (”), or not specified.

Report Lists the users, and their corresponding security identifiers (SID), that are in the current database, not linked to any login.
user and login must be NULL, a zero-length string (”), or not specified.

Update_One Links the specified user in the current database to login. login must already exist. user and login must be specified.

[@UserNamePattern =] ‘user’

Is the name of a SQL Server user in the current database. user is sysname, with a default of NULL. sp_change_users_login can be used only with the security accounts of SQL Server logins and users; it cannot be used with Microsoft Windows NT® users.

[@LoginName =] ‘login’

Is the name of a SQL Server login. login is sysname, with a default of NULL.

Return Code Values
0 (success) or 1 (failure)

Result Sets
Column name Data type Description
UserName sysname Login name.
UserSID varbinary(85) Login security identifier.

Remarks
Use this procedure to link the security account for a user in the current database with a different login. If the login for a user has changed, use sp_change_users_login to link the user to the new login without losing the user’s permissions.

login cannot be sa, and user cannot be the dbo, guest, or INFORMATION_SCHEMA users.

sp_change_users_login cannot be executed within a user-defined transaction.

Permissions
Any member of the public role can execute sp_change_users_login with the Report option. Only members of the sysadmin fixed server role can specify the Auto_Fix option. Only members of the sysadmin or db_owner roles can specify the Update_One option.

Examples
A. Show a report of the current user to login mappings
This example produces a report of the users in the current database and their security identifiers.

EXEC sp_change_users_login ‘Report’
B. Change the login for a user
This example changes the link between user Mary in the pubs database and the existing login, to the new login NewMary (added with sp_addlogin).

–Add the new login.
USE master
go
EXEC sp_addlogin ‘NewMary’
go

–Change the user account to link with the ‘NewMary’ login.
USE pubs
go
EXEC sp_change_users_login ‘Update_One’, ‘Mary’, ‘NewMary’
See Also
sp_addlogin

sp_adduser

sp_helplogins

sql server 2008登陆服务器名称是什么

说明:这是我遇到的一个问题,折磨了很久。

我在网上搜索了半天,大部分人都说是local,localhost,单独的一个点,127.0.0.1等,当时我尝试了都不行,*后再百度知道里找到,用.\myexpress试试,我一试,果然成功了,非常感谢。于是写出来分享给大家

通常情况下,有两种情况,
单独一个小数点
小数点\sqlexpress
不管是什么名称,下面都选择Windows认证

服务器名称查找,具体请在开始-运行那里,输入services.msc回车,在服务里面查找sql server开头的服务,看到底是什么名称

防止SQL注入攻击

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace DBGrep
{
public class SqlLocator
{
[DllImport(“odbc32.dll”)]
private static extern short SQLAllocHandle(short hType, IntPtr inputHandle, out IntPtr outputHandle);
[DllImport(“odbc32.dll”)]
private static extern short SQLSetEnvAttr(IntPtr henv, int attribute, IntPtr valuePtr, int strLength);
[DllImport(“odbc32.dll”)]
private static extern short SQLFreeHandle(short hType, IntPtr handle); [DllImport(“odbc32.dll”, CharSet = CharSet.Ansi)]
private static extern short SQLBrowseConnect(IntPtr hconn, StringBuilder inString, short inStringLength, StringBuilder outString, short outStringLength, out short outLengthNeeded);
private const short SQL_HANDLE_ENV = 1;
private const short SQL_HANDLE_DBC = 2;
private const int SQL_ATTR_ODBC_VERSION = 200;
private const int SQL_OV_ODBC3 = 3;
private const short SQL_SUCCESS = 0;
private const short SQL_NEED_DATA = 99;
private const short DEFAULT_RESULT_SIZE = 1024;
private const string SQL_DRIVER_STR = “DRIVER=SQL SERVER”;

public static string[] GetServers()
{
string[] retval = null;
string txt = string.Empty;
IntPtr henv = IntPtr.Zero;
IntPtr hconn = IntPtr.Zero;
StringBuilder inString = new StringBuilder(SQL_DRIVER_STR);
StringBuilder outString = new StringBuilder(DEFAULT_RESULT_SIZE);
short inStringLength = (short)inString.Length;
short lenNeeded = 0;
try
{
if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_ENV, henv, out henv))
{
if (SQL_SUCCESS == SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (IntPtr)SQL_OV_ODBC3, 0))
{
if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_DBC, henv, out hconn))
{
if (SQL_NEED_DATA == SQLBrowseConnect(hconn, inString, inStringLength, outString, DEFAULT_RESULT_SIZE, out lenNeeded))
{
if (DEFAULT_RESULT_SIZE < lenNeeded)
{
outString.Capacity = lenNeeded;
if (SQL_NEED_DATA != SQLBrowseConnect(hconn, inString, inStringLength, outString, lenNeeded, out lenNeeded))
{
throw new ApplicationException(“Unabled to aquire SQL Servers from ODBC driver.”);
}
}
txt = outString.ToString();
int start = txt.IndexOf(“{“) + 1;
int len = txt.IndexOf(“}”) – start;
if ((start > 0) && (len > 0))
{
txt = txt.Substring(start, len);
}
else
{
txt = string.Empty;
}
}
}
}
}
}
catch (Exception ex)
{
#if(DEBUG)
Console.WriteLine(“Acquire SQL Servier List Error” + (ex.Message).ToString());
#endif
txt = string.Empty;
}
finally
{
if (hconn != IntPtr.Zero)
{
SQLFreeHandle(SQL_HANDLE_DBC, hconn);
}
if (henv != IntPtr.Zero)
{
SQLFreeHandle(SQL_HANDLE_ENV, hconn);
}
}
if (txt.Length > 0)
{
retval = txt.Split(“,”.ToCharArray());
}
return retval;
}
}
}

2、利用SQLDMO(SQL Distributed Management Objects)
SQLDMO来自SQL Server自带的SQLDMO.dll,其本身是一个COM对象,可以在.net工程中添加对它的应用。然后可以得到以下对象:
SQLDMO.Application
SQLDMO.SQLServer
SQLDMO.Database
SQLDMO.NameList

得到SQL服务器的列表
SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers();
for(int i=0;i<sqlServers.Count;i++)
{
object srv = sqlServers.Item(i + 1);
if(srv != null)
{
this.cboServers.Items.Add(srv);
}
}
if(this.cboServers.Items.Count > 0)
this.cboServers.SelectedIndex = 0;
else
this.cboServers.Text = “<No available SQL Servers>”;
记住COM的集合从指针1开始,不是0

得到数据库列表
SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass();
srv.Connect(this.cboServers.SelectedItem.ToString(),this.txtUser.Text,this.txtPassword.Text);
foreach(SQLDMO.Database db in srv.Databases)
{
if(db.Name!=null)
this.cboDatabase.Items.Add(db.Name);
}

利用c#实现对sql server的信息探测

1、原理简述
对于SQL Server2000来说,打开SQL Server客户端准备连接,当拉开服务器列表的时候,整个局域网所有的SQL Server服务器都被列出来了。这是为什么呢?
原理如下:
从我自己的机器(192.168.0.1)上从1434端口广播(192.168.0.255)了这个UDP包,然后,整个局域网中的SQL Server服务器都开始响应这个UDP数据包,所有这些都是明文传输的,我们可以很容易探测一个IP地址的1434端口,获得该IP地址上运行的SQL Server的相关信息。
这些信息包括:主机名称、实例名称、版本、管道名称以及使用的端口等。这个端口是微软自己使用,而且不象默认的1433端口那样可以改变,1434是不能改变的。
2、程序实现
下面是一个利用1434进行探测的c#程序,核心代码如下(很简单,呵呵) :
using System;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading;
namespace ConsoleApplication3
{
class Class1
{
//创建一个UDPCLIENT实例
private static UdpClient m_Client;
//LISTEN用来获取返回的信息
public static string Listen(string hostip)
{
string HostIP = hostip;
IPAddress thisIP = IPAddress.Parse(HostIP);
IPEndPoint host = new IPEndPoint(thisIP,1434);
byte [] data = m_Client.Receive(ref host);
Encoding ASCII = Encoding.ASCII;
String strData = ASCII.GetString(data);
return strData;
}
//SEND
public static void Send(string hostip)
{
string HostIP = hostip;
byte [] buffer = {02};
//02为要发送的数据,只有02、03、04有回应
int ecode = m_Client.Send(buffer,1,HostIP,1434);
//ecode用来返回是否成功发送
if(ecode <= 0)
{
Console.WriteLine(“发送时出错:” + ecode);
}
}
//对返回的信息的简单的处理
public static void OutputInfo(string strdata)
{
string str = strdata;
//str.le
char [] that = {‘;‘,‘;‘};
string [] strofthis =str.Split(that);
//int i= 0 ;
for(int i=0;i
{
Console.Write(strofthis[i]);
Console.Write(‘/n‘);
}

}
//输入IP
public static string InputHostIP()
{
Console.Write(“enter the ip you want to scan:/n/n”);
string hostip =Console.ReadLine();
Console.Write(‘/n‘);
return hostip;
}
//EXIT
public static void Exit()
{
Console.WriteLine(“if you want to exit ,just input 1/n”);
int a = Console.Read();
if(a!= 1)
{
Console.WriteLine(“if you want to exit ,just input 1/n”);
Console.Read();
}
else
{
}
}
[STAThread]

static void Main(string[] args)
{
string HostIP;
HostIP = InputHostIP();
Console.WriteLine(“Begin to send udp to the host”);
m_Client = new UdpClient();
Send(HostIP);
string strData=Listen(HostIP);
OutputInfo(strData);
Exit();
}
}
}
3一个典型的返回的信息
ServerName;AWEN;
InstanceName;AWEN;
IsClustered;No;
Version;8.00.194;
tcp;1044; (TCP的端口,可见就算改了端口也是很容易找到的)
np;//AWEN/pipe/MSSQL$XHT310/sql/query;

搭建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

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