JDBC獲取數(shù)據(jù)庫(kù)連接的5種方式實(shí)例
方式一:直接通過(guò)數(shù)據(jù)庫(kù)廠商提供的相關(guān)驅(qū)動(dòng)
步驟
- 導(dǎo)入相關(guān)驅(qū)動(dòng)(Build Path)
- 創(chuàng)建Driver類的實(shí)例化對(duì)象
- 獲取要連接數(shù)據(jù)庫(kù)的URL
- 創(chuàng)建Properties類的實(shí)例化對(duì)象,將賬號(hào)和密碼封裝到該對(duì)象中
- 通過(guò)Driver實(shí)例化對(duì)象調(diào)用connect(String url,Properties info)方法獲取connection對(duì)象
package connection;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Properties;
import org.junit.jupiter.api.Test;
public class ConnectionTest {
@Test
public void test() throws SQLException {
//創(chuàng)建Driver實(shí)例
Driver driver=new com.mysql.cj.jdbc.Driver();
//獲取要讀取數(shù)據(jù)庫(kù)的URL
String url="jdbc:mysql://localhost:3306/test04_emp";
//將賬號(hào)密碼封裝到Properties對(duì)象中
Properties info=new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
//通過(guò)Driver的對(duì)象獲取連接
Connection connect=driver.connect(url, info);
//調(diào)用連接的toString()
System.out.println(connect);
}
}
方法二:通過(guò)反射的方式來(lái)構(gòu)造Driver對(duì)象
- 通過(guò)Class的forName(Stirng className)獲取驅(qū)動(dòng)的運(yùn)行時(shí)類。
- 通過(guò)運(yùn)行時(shí)類的newInstance()來(lái)獲取運(yùn)行時(shí)類的對(duì)象。
- 獲取URL和將賬號(hào)密碼封裝到Properties對(duì)象中。
- 使用運(yùn)行時(shí)類的對(duì)象調(diào)用connect()方法獲取連接。
@Test
public void test2() throws Exception {
//通過(guò)反射的方式獲取運(yùn)行時(shí)類
Class clazz=Class.forName("com.mysql.cj.jdbc.Driver");
//通過(guò)反射的方式創(chuàng)建運(yùn)行時(shí)類對(duì)象
Driver driver=(Driver)clazz.newInstance();
//獲取URL
String url="jdbc:mysql://localhost:3306/test04_emp";
//封裝賬號(hào)密碼
Properties info=new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
//獲取連接
Connection connect=driver.connect(url, info);
System.out.println(connect);
}
方式三:使用DriverManager來(lái)替換Driver獲取連接
- 獲取Driver的實(shí)現(xiàn)類對(duì)象。
- 使用DriverManager的registerDriver(Driver driver)方法來(lái)注冊(cè)驅(qū)動(dòng)。
- 提供URL、賬號(hào)和密碼。
- 使用DriverManager的getConnection(String url,String user,String password)來(lái)獲取連接。
@Test
public void test3() throws Exception {
//通過(guò)反射的方式獲取Driver對(duì)象
Driver driver=(Driver)Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
//調(diào)用DriverManager的registerDriver(Driver driver)方法注冊(cè)驅(qū)動(dòng)
DriverManager.registerDriver(driver);
//提供賬號(hào)、密碼和URL
String user="root";
String password="abc123";
String url="jdbc:mysql://localhost:3306/test04_emp";
//調(diào)用DriverManager的getConnection()方法來(lái)獲取連接
Connection connect=DriverManager.getConnection(url,user,password);
System.out.println(connect);
/*getConnection()還有一種版本:getConnection(String url,Properties info)
* 可以參考方法一和方法二。
*/
}
方法四:省略創(chuàng)建Driver對(duì)象和注冊(cè)驅(qū)動(dòng)
- 通過(guò)反射將Driver類加載到內(nèi)存中。
- 提供賬號(hào)、密碼和URL。
- 通過(guò)DriverManager調(diào)用getConnection()獲取連接。
注意:這里之所以可以省略創(chuàng)建Driver對(duì)象和注冊(cè)驅(qū)動(dòng)是因?yàn)?,?chuàng)建Driver對(duì)象的目的是給DriverManager調(diào)用registerDriver()注冊(cè)驅(qū)動(dòng)時(shí)提供參數(shù),而在Driver類加載到內(nèi)存中時(shí),有一個(gè)static方法會(huì)自動(dòng)調(diào)用registerDriver()方法,從而自動(dòng)注冊(cè)驅(qū)動(dòng)。
@Test
public void test4() throws Exception {
//通過(guò)反射將Driver加載到內(nèi)存中
Class.forName("com.mysql.cj.jdbc.Driver");
//提供相關(guān)信息
String user="root";
String password="abc123";
String url="jdbc:mysql://localhost:3306/test04_emp";
//通過(guò)getConnection()獲取連接
Connection connect=DriverManager.getConnection(url,user,password);
System.out.println(connect);
}
方式五:通過(guò)配置文件的方式
- 創(chuàng)建配置文件
- 通過(guò)類的加載器生成指向配置文件的流
- 創(chuàng)建Properties對(duì)象,通過(guò)調(diào)用load()方法將配置文件加載到內(nèi)存中
- 通過(guò)Properti對(duì)象的getProperty(String key)獲取相關(guān)信息
- 通過(guò)反射的方式加載驅(qū)動(dòng)
- 調(diào)用getConnection()獲取連接
@Test
public void test5() throws Exception {
//通過(guò)類加載器創(chuàng)建一個(gè)指向配置文件的流
InputStream input=ConnectionTest.class.getClassLoader().getResourceAsStream("test.properties");
//創(chuàng)建Properties對(duì)象
Properties infoProperties=new Properties();
//以流為參數(shù)調(diào)用load()加載配置文件
infoProperties.load(input);
//獲取相關(guān)信息
String driver=infoProperties.getProperty("driver");
String url=infoProperties.getProperty("url");
String user=infoProperties.getProperty("user");
String password=infoProperties.getProperty("password");
//加載驅(qū)動(dòng)
Class.forName(driver);
//獲取連接
Connection connection= DriverManager.getConnection(url, user, password);
System.out.println(connection);
}
我們通常都使用方式五
每種方式迭代的原因
第一種方式是直接通過(guò)使用指定數(shù)據(jù)庫(kù)廠商的驅(qū)動(dòng)來(lái)獲取數(shù)據(jù)庫(kù)連接的,但是我們希望程序具有更好的可移植性,所以采用反射的方式來(lái)獲取驅(qū)動(dòng),這就產(chǎn)生了第二種方法;在開(kāi)發(fā)中,我們通常都不使用Driver來(lái)獲取連接,而是通過(guò)使用DriverManager來(lái)獲得數(shù)據(jù)庫(kù)連接,這就從第二種方式到了第三種方式;又因?yàn)镈river的實(shí)現(xiàn)類中有靜態(tài)方法調(diào)用了regiesterDriver()方法,所以在通過(guò)反射的方式將類加載到內(nèi)存中時(shí),會(huì)自動(dòng)注冊(cè)驅(qū)動(dòng),我們可以將注冊(cè)驅(qū)動(dòng)的過(guò)程省略,這就產(chǎn)生了第四種方法;在前面的方法中,我們都是直接把賬號(hào)密碼和URL以及驅(qū)動(dòng)的名稱直接寫(xiě)在程序中的額,這不太符合我們?nèi)粘5囊?guī)范,也在一定程度上增加了程序的 風(fēng)險(xiǎn),為此我們將相關(guān)信息保存在配置文件中,在程序中通過(guò)讀取配置文件的方式來(lái)獲取相關(guān)的信息,這就產(chǎn)生了最后一種也是我們最常用的方式。
方式五的優(yōu)點(diǎn)
- 將需要的數(shù)據(jù)放到配置文件中,實(shí)現(xiàn)了數(shù)據(jù)和代碼分離,減少了耦合性。
- 如果需要修改配置文件信息,只需要替換文件就可以,避免了重新打包文件。
總結(jié)
到此這篇關(guān)于JDBC獲取數(shù)據(jù)庫(kù)連接的5種方式的文章就介紹到這了,更多相關(guān)JDBC數(shù)據(jù)庫(kù)連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot + SpringSecurity 短信驗(yàn)證碼登錄功能實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot + SpringSecurity 短信驗(yàn)證碼登錄功能實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
身份證號(hào)碼驗(yàn)證算法深入研究和Java實(shí)現(xiàn)
這篇文章主要介紹了身份證號(hào)碼驗(yàn)證算法深入研究和Java實(shí)現(xiàn),本文講解了18身份證號(hào)碼的結(jié)構(gòu)、根據(jù)17位數(shù)字本體碼獲取最后一位校驗(yàn)碼程序?qū)嵗葍?nèi)容,需要的朋友可以參考下2015-06-06
基于SSM+Shiro+Bootstrap實(shí)現(xiàn)用戶權(quán)限管理系統(tǒng)
這篇文章主要介紹了基于SSM+Shiro實(shí)現(xiàn)一個(gè)用戶權(quán)限管理系統(tǒng),每位用戶只可訪問(wèn)指定的頁(yè)面,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,快跟隨小編一起學(xué)習(xí)吧2021-12-12
Java中浮點(diǎn)數(shù)精度問(wèn)題的解決方法
這篇文章給大家介紹了Java中浮點(diǎn)數(shù)精度問(wèn)題的解決方法,本文給大家介紹的非常詳細(xì),有問(wèn)題描述有原因分析,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-10-10
Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之字符串暴力匹配
字符串暴力匹配算法是指在一個(gè)長(zhǎng)字符串中暴力尋找是否包含某一子串所謂暴力匹配,就是不使用任何其他算法,將兩個(gè)字符串中的字符一一進(jìn)行比對(duì)2022-02-02
tio-boot框架整合ehcache實(shí)現(xiàn)過(guò)程示例
這篇文章主要為大家介紹了tio-boot框架整合ehcache實(shí)現(xiàn)過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
spring boot使用properties定義短信模板的方法教程
這篇文章主要給大家介紹了關(guān)于spring boot使用properties定義短信模板的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
簡(jiǎn)單理解遵循接口隔離原則的Java設(shè)計(jì)模式編程
這篇文章主要介紹了遵循接口隔離原則的Java設(shè)計(jì)模式編程,針對(duì)Java編程中interface接口方面的編寫(xiě)進(jìn)行約束,需要的朋友可以參考下2016-02-02

