25、jdbc操作数据库(2)
說一下使用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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 戴尔 U2424H / HE 显示器开卖
- 下一篇: 26、jdbc操作数据库(3)