JDBC和MySQL的实现原理
這兩天復習了一下JDBC操作MySQL,把crud操作的例子記一下,
類庫鏈接(mysql-connector-java-5.1.37-bin.jar):http://files.cnblogs.com/files/xujingyang/mysql-connector-java-5.1.37-bin.zip
1.1?JDBC概述
JDBC(Java Data Base Connectivity,java數據庫連接)是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。是Java訪問數據庫的標準規范
JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。
JDBC需要連接驅動,驅動是兩個設備要進行通信,滿足一定通信數據格式,數據格式由設備提供商規定,設備提供商為設備提供驅動軟件,通過軟件可以與該設備進行通信。
今天我們使用的是mysql的驅動mysql-connector-java-5.1.39-bin.jar
1.2?JDBC原理
Java提供訪問數據庫規范稱為JDBC,而生產廠商提供規范的實現類稱為驅動。
?
?
?
?
?
?
?
?
?
?
JDBC是接口,驅動是接口的實現,沒有驅動將無法完成數據庫連接,從而不能操作數據庫!每個數據庫廠商都需要提供自己的驅動,用來連接自己公司的數據庫,也就是說驅動一般都由數據庫生成廠商提供。
?
1.3?JDBC開發步驟
1.3.1?導入驅動jar包
創建lib目錄,用于存放當前項目需要的所有jar包
選擇jar包,右鍵執行build path / Add to Build Path
1.4.1?API詳解:注冊驅動
代碼:Class.forName("com.mysql.jdbc.Driver");
JDBC規范定義驅動接口:java.sql.Driver,MySql驅動包提供了實現類:com.mysql.jdbc.Driver
DriverManager工具類,提供注冊驅動的方法?registerDriver(),方法的參數是java.sql.Driver,所以我們可以通過如下語句進行注冊:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
以上代碼不推薦使用,存在兩方面不足
通常開發我們使用Class.forName()?加載一個使用字符串描述的驅動類。
如果使用Class.forName()將類加載到內存,該類的靜態代碼將自動執行。
通過查詢com.mysql.jdbc.Driver源碼,我們發現Driver類“主動”將自己進行注冊
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}?
}
……
}
?
1.4.2?API詳解:獲得鏈接
代碼:Connection con = DriverManager.getConnection
(“jdbc:mysql://localhost:3306/mydb”,”root”,”root”);
獲取連接需要方法?DriverManager.getConnection(url,username,password),三個參數分別表示,url?需要連接數據庫的位置(網址)user用戶名 ?password?密碼
url比較復雜,下面是mysql的url:
jdbc:mysql://localhost:3306/mydb
JDBC規定url的格式由三部分組成,每個部分中間使用冒號分隔。
l 第一部分是jdbc,這是固定的;
l 第二部分是數據庫名稱,那么連接mysql數據庫,第二部分當然是mysql了;
l 第三部分是由數據庫廠商規定的,我們需要了解每個數據庫廠商的要求,mysql的第三部分分別由數據庫服務器的IP地址(localhost)、端口號(3306),以及DATABASE名稱(mydb)組成。
?
1.4.3?API詳解:獲得語句執行平臺
String sql = "某SQL語句";
獲取Statement語句執行平臺:Statement stmt = con.createStatement();
常用方法:
n?int executeUpdate(String sql); --執行insert update delete語句.
n?ResultSet executeQuery(String sql); --執行select語句.
n?boolean execute(String sql); --執行select返回true?執行其他的語句返回false.
1.4.4?API詳解:處理結果集(執行insert、update、delete無需處理)
ResultSet實際上就是一張二維的表格,我們可以調用其boolean next()方法指向某行記錄,當第一次調用next()方法時,便指向第一行記錄的位置,這時就可以使用ResultSet提供的getXXX(int col)方法(與索引從0開始不同個,列從1開始)來獲取指定列的數據:
rs.next();//指向第一行
rs.getInt(1);//獲取第一行第一列的數據
常用方法:
n?Object getObject(int index)?/ Object getObject(String name)?獲得任意對象
n?String getString(int index)?/ Object getObject(String name)?獲得字符串
n?int getInt(int index)?/ Object getObject(String name)?獲得整形
n?double getDouble(int index)?/ Object getObject(String name)?獲得雙精度浮點型
?
1.4.5?API詳解:釋放資源
與IO流一樣,使用后的東西都需要關閉!關閉的順序是先得到的后關閉,后得到的先關閉。
rs.close();
stmt.close();
con.close();
1.5?SQL注入問題
假設有登錄案例SQL語句如下:
SELECT * FROM?用戶表?WHERE NAME =?用戶輸入的用戶名?AND PASSWORD =?用戶輸的密碼;
此時,當用戶輸入正確的賬號與密碼后,查詢到了信息則讓用戶登錄。但是當用戶輸入的賬號為XXX?密碼為:XXX’??OR ‘a’=’a時,則真正執行的代碼變為:
SELECT * FROM?用戶表?WHERE NAME =?‘XXX’?AND PASSWORD =’?XXX’??OR ’a’=’a’;
此時,上述查詢語句時永遠可以查詢出結果的。那么用戶就直接登錄成功了,顯然我們不希望看到這樣的結果,這便是SQL注入問題。
為此,我們使用PreparedStatement來解決對應的問題。
1.6?API詳解:預處理對象
使用PreparedStatement預處理對象時,建議每條sql語句所有的實際參數,都使用逗號分隔。
String sql = "insert into sort(sid,sname) values(?,?)";;
PreparedStatement預處理對象代碼:
PreparedStatement psmt = conn.prepareStatement(sql)
常用方法:
l?int executeUpdate(); --執行insert update delete語句.
l?ResultSet executeQuery(); --執行select語句.
l?boolean execute(); --執行select返回true 執行其他的語句返回false.
l?void?setXxx(int?index, Xxx?xx) 將指定參數設置為給定Java的xx值。在將此值發送到數據庫時,驅動程序將它轉換成一個?SQL Xxx類型值。
例如:
setString(2, "家用電器")?把SQL語句中第2個位置的占位符? 替換成實際參數?"家用電器"
1.7?預處理對象executeUpdate方法
通過預處理對象的executeUpdate方法,完成記錄的insert\update\delete語句的執行。操作格式統一如下:
1.?注冊驅動
2.?獲取連接
3.?獲取預處理對象
4. SQL語句占位符設置實際參數
5.?執行SQL語句
6.?釋放資源
?
2.1?使用properties配置文件
開發中獲得連接的4個參數(驅動、URL、用戶名、密碼)通常都存在配置文件中,方便后期維護,程序如果需要更換數據庫,只需要修改配置文件即可。
通常情況下,我們習慣使用properties文件,此文件我們將做如下要求:
a)?key命名自定義,如果是多個單詞,習慣使用點分隔。例如:jdbc.driver
b)?value值不支持中文,如果需要使用非英文字符,將進行unicode轉換。
1.2?創建配置文件
在項目跟目錄下,創建文件,輸入“db.properties”文件名。
l?文件中的內容
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
user=root
password=root
?
1.3?加載配置文件:Properties對象
對應properties文件處理,開發中也使用Properties對象進行。我們將采用加載properties文件獲得流,然后使用Properties對象進行處理。
?
總結
以上是生活随笔為你收集整理的JDBC和MySQL的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios 部分string颜色_iOS-代
- 下一篇: odbc远程连接mysql_无法使用un