日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

25、jdbc操作数据库(2)

發(fā)布時(shí)間:2023/12/3 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 25、jdbc操作数据库(2) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說一下使用jdbc時(shí)涉及到的一些基本的接口和類

java.sql.Driver

是數(shù)據(jù)庫(kù)驅(qū)動(dòng)接口,com.mysql.jdbc.Driver是mysql對(duì)應(yīng)的驅(qū)動(dòng),由數(shù)據(jù)庫(kù)供應(yīng)商實(shí)現(xiàn),用于提供驅(qū)動(dòng),實(shí)現(xiàn)了java.sql.Driver接口。

java.sql.DriverManager

管理驅(qū)動(dòng)的類,可以使用DriverManager通過驅(qū)動(dòng)來(lái)獲取數(shù)據(jù)庫(kù)連接。

java.sql.Connection

對(duì)數(shù)據(jù)庫(kù)連接進(jìn)行管理的接口,一個(gè)Connection就相當(dāng)于一個(gè)通往對(duì)應(yīng)數(shù)據(jù)庫(kù)的通道。

對(duì)以上幾個(gè)做一個(gè)詳細(xì)介紹,直接看源碼:

//com.mysql.jdbc.Driver 實(shí)現(xiàn)了 java.sql.Driver接口 public class Driver extends NonRegisteringDriver implements java.sql.Driver {//向驅(qū)動(dòng)管理器注冊(cè)自己static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}//構(gòu)造一個(gè) com.mysql.jdbc.Driver 用于注冊(cè)public Driver() throws SQLException {// Required for Class.forName().newInstance()} }// 驅(qū)動(dòng)管理器類中,看一下如何注冊(cè)驅(qū)動(dòng)、獲取數(shù)據(jù)庫(kù)連接的 public class DriverManager {//注冊(cè)驅(qū)動(dòng)最終調(diào)用的方法public static synchronized void registerDriver(java.sql.Driver driver, DriverAction da) throws SQLException {//如果驅(qū)動(dòng)程序還沒有添加到列表 registeredDrivers 中,請(qǐng)注冊(cè)它if(driver != null) {registeredDrivers.addIfAbsent(new DriverInfo(driver, da));} else {throw new NullPointerException();}}//獲取連接最終調(diào)用的方法private static Connection getConnection( String url, java.util.Properties info, Class<?> caller) throws SQLException {//當(dāng)callerCl為null時(shí),我們應(yīng)該檢查應(yīng)用程序(它間接調(diào)用這個(gè)類)的類加載器,//這樣就可以從這里加載rt.jar外部的JDBC驅(qū)動(dòng)程序類。ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;synchronized(DriverManager.class) {if (callerCL == null) {callerCL = Thread.currentThread().getContextClassLoader();}}// 遍歷試圖建立連接的已加載的 registeredDrivers。 for(DriverInfo aDriver : registeredDrivers) {// 如果調(diào)用方?jīng)]有加載驅(qū)動(dòng)程序的權(quán)限,那么跳過它。if(isDriverAllowed(aDriver.driver, callerCL)) {Connection con = aDriver.driver.connect(url, info);if (con != null) { return (con);}}} } }

java.sql.Statement

對(duì)數(shù)據(jù)庫(kù)操作的一個(gè)接口,可以發(fā)送sql、執(zhí)行sql,它是先組裝sql,然后發(fā)送sql查詢結(jié)果,因此存在缺陷,其缺陷在于它發(fā)送的sql是將參數(shù)拼接完之后再進(jìn)行編譯的,所以容易發(fā)生sql注入攻擊的危險(xiǎn),一般不用,這里不做詳細(xì)介紹。
何為sql注入攻擊,例如:發(fā)送的如下SQL

"SELECT * FROM USER WHERE USER_NAME = "+ USER_NAME +"AND PWD = "+PWD;
這時(shí)我這樣設(shè)置:USER_NAME = user | PWD = 111 or 1=1,則SQL就會(huì)變成
SELECT * FROM USER WHERE USER_NAME = user AND PWD = 111 or 1=1
這樣就直接規(guī)避掉了用戶名和密碼的校驗(yàn)。

java.sql.PreparedStatement

對(duì)數(shù)據(jù)庫(kù)操作的一個(gè)接口,可以發(fā)送sql、執(zhí)行sql,在獲取PreparedStatement對(duì)象時(shí),就已經(jīng)將sql發(fā)送出去編譯成了可執(zhí)行的sql語(yǔ)句,也就是常說的預(yù)編譯,SQL中使用占位符的方式來(lái)表示參數(shù),占位符的地方只是參數(shù),不能所作sql中固定的語(yǔ)法
例如:發(fā)送的sql="SELECT * FROM USER WHERE USER_NAME = ? AND PWD = ?";
然后再另外使用方法的方式去設(shè)置 ? 占位符處的參數(shù),防止了sql注入的風(fēng)險(xiǎn),通過Connection接口的connection.prepareStatement(sql)方法獲取PreparedStatement,具體實(shí)現(xiàn)調(diào)用的是? com.mysql.jdbc.ConnectionImpl 中的方法。

java.sql.CallableStatement

和 PreparedStatement 功能大致相同,只是CallableStatement對(duì)象可以用于執(zhí)行存儲(chǔ)過程,而PreparedStatement只可以執(zhí)行基本的SQL語(yǔ)句。

java.sql.ResultSet

用于存儲(chǔ)查詢返回的結(jié)果集,對(duì)于mysql來(lái)說,最終是通過com.mysql.jdbc.PreparedStatement中的方法獲取的ResultSet對(duì)象。

java.sql.DatabaseMetaData

此對(duì)象用于獲取數(shù)據(jù)庫(kù)的整體綜合信息,可以使用Connection對(duì)象的connection.getMetaData()方法直接獲取。

java.sql.ResultSetMetaData

用于獲取關(guān)于ResultSet對(duì)象中列的類型和屬性信息,通過ResultSet對(duì)象的resultSet.getMetaData()方法直接獲取。

java.sql.Types

這個(gè)類中定義了用于標(biāo)識(shí)SQL類型的常量,稱為JDBC類型。

這里總結(jié)一下:開發(fā)者使用jdbc操作數(shù)據(jù)庫(kù)時(shí),添加驅(qū)動(dòng)時(shí)需要添加對(duì)應(yīng)數(shù)據(jù)庫(kù)廠商提供的驅(qū)動(dòng)包中的Driver,而后具體操作時(shí),直接調(diào)用 java.sql.* 包中接口的方法即可,最終底層調(diào)用的是對(duì)應(yīng)數(shù)據(jù)庫(kù)廠商提供的com.*.jdbc.*包中的實(shí)現(xiàn)類中的方法,數(shù)據(jù)庫(kù)廠商提供的驅(qū)動(dòng)包實(shí)現(xiàn)了java.sql.*包中接口的方法,這就是代碼層面上的jdbc。java提供一組接口,數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn)這些接口,根據(jù)自身的特點(diǎn)編寫不同的實(shí)現(xiàn),而程序員只需使用java中的接口即可,利用了多態(tài)的方式。

總結(jié)

以上是生活随笔為你收集整理的25、jdbc操作数据库(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。