一:JDBC簡介
1.什麼是JDBC
JDBC指Java數據庫連接,是一種標準Java應用編程接口( JAVA API),用來連接Java編程語言和廣泛的數據庫;從根本上來説,JDBC是一種規範,它提供了一套完整的接口,允許便攜式訪問到底層數據庫
JDBC API 庫包含下面提到的每個任務,都是與數據庫相關的常用用法。
製作到數據庫的連接
創建 SQL 或 MySQL 語句
執行 SQL 或 MySQL 查詢數據庫
查看和修改所產生的記錄
2.JDBC架構
JDBC的API支持兩層和三層處理模式進行數據庫訪問,但一般的JDBC架構由兩層處理模式組成:
JDBC API: 提供了應用程序對 JDBC 管理器的連接。
JDBC Driver API: 提供了 JDBC 管理器對驅動程序連接。
常見的JDBC組件
DriverManager:這個類管理一系列數據庫驅動程序
Driver: 這個接口處理與數據庫服務器的通信
Connection: 此接口具有接觸數據庫的所有方法
Statement: 使用創建於這個接口的對象將SQL語句提交到數據庫。
ResultSet: 在你使用語句對象執行SQL查詢後
二:JDBC SQL語法
在上次的文章中詳細地寫了SQL各種語法,此處不在贅述
三:JDBC驅動類型
1.類型1:JDBC-ODBC 橋驅動程序
在類型1驅動程序中,一個 JDBC 橋接器是用來訪問安裝在每個客户機上的 ODBC 驅動程序
2.類型2:JDBC-Native API
在類型2驅動程序中,JDBC API調用轉換成原生的 C/C++ API調用,這對於數據庫來説具有唯一性。這些驅動程序通常由數據庫供應商提供,並和 JDBC-ODBC 橋驅動程序同樣的方式使用。該供應商的驅動程序必須安裝在每台客户機上。
3.類型3:JDBC-Net純Java
在類型3驅動程序中,一般用三層方法來訪問數據庫
4.類型4:100%純Java
在類型4驅動程序中,一個純粹的基於 Java 的驅動程序通過 socket 連接與供應商的數據庫進行通信。這是可用於數據庫的最高性能的驅動程序,並且通常由供應商自身提供。
四:JDBC連接數據庫
步驟:
1.導入JDBC包
在你的Java代碼中,用import語句添加你所需的類
import java.sql.* ; // for standard JDBC programs
import java.math.* ; // for BigDecimal and BigInteger
2.註冊JDBC驅動程序
這一步會導致JVM加載所需的驅動程序到內存中執行,因此它可以實現你的JDBC請求
註冊方法:
(1)Class.forName()
try {
Class.forName("oracle.jdbc.driver.OracleDriver"
);
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
System.exit(1);
}
(2)方法2:DriverManager.registerDriver()
try {
Driver myDriver = new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver( myDriver );
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
System.exit(1);
}
3.數據庫URL制定
這是用來創建格式正確的地址指向你想要連接的數據庫
三個加載 DriverManager.getConnection() 方法:
1>getConnection(String url)
2>getConnection(String url,Properties prop)
3>getConnection(String url,String user,String password)
4.創建連接對象
最後,代碼調用 DriverManager對象的 getConnection()方法來建立實際的數據庫連接
例如:
String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String URL = "jdbc:sqlserver://數據庫地址;DatabaseName=數據庫名;
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);
5.Statement 對象
Statement:可以正常訪問數據庫,適用於運行靜態 SQL 語句。Statement 接口不接受參數。
(1)創建Statement
使用Connection對象的 createStatement()方法創建一個
Statement stmt = null;
try {
stmt = conn.createStatement( );
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}
創建了一個Statement對象之後,你可以用它的三個執行方法的任一方法來執行SQL語句
1>boolean execute(String SQL) : 如果 ResultSet 對象可以被檢索,則返回的布爾值為 true ,否則返回 false 。當你需要使用真正的動態 SQL 時,可以使用這個方法來執行 SQL DDL 語句
2>int executeUpdate(String SQL) : 返回執行 SQL 語句影響的行的數目。使用該方法來執行 SQL 語句,是希望得到一些受影響的行的數目,例如,INSERT,UPDATE 或 DELETE 語句
3>ResultSet executeQuery(String SQL) : 返回一個 ResultSet 對象。當你希望得到一個結果集時使用該方法,就像你使用一個 SELECT 語句
!!關閉 Statement 對象
Statement stmt = null;
try {
stmt = conn.createStatement( );
. . .
}
catch (SQLException e) {
. . .
}
finally {
stmt.close();
}
6.connection對象
Connection是JDBC中的一個接口,它代表着與數據庫的物理連接。它允許您與數據庫建立通信,發送SQL語句,並獲取查詢結果
Connection對象還支持事務管理。事務是一組SQL操作,要麼全部成功,要麼全部失敗。通過Connection對象,您可以開啓、提交或回滾事務。
在使用Connection對象時,還需要注意以下幾個重要的事項:
1>連接泄漏:務必確保每個獲取的連接最終都被關閉,以避免連接泄漏
2>線程安全:Connection對象通常不是線程安全的,因此應該在單個線程中使用,並確保每個線程都有自己的連接
3>連接池配置:如果使用連接池,要仔細配置連接池的參數,以滿足應用程序的性能需求
4>異常處理:要具備良好的異常處理機制,以處理與數據庫連接和操作相關的異常情況
5>事務管理:瞭解事務的概念和使用方法,以確保數據庫操作的一致性和完整性
7.數據庫查詢操作
SQL語句從數據庫查詢中獲取數據,並將數據返回到結果集中。SELECT語句是一種標準的方法,它從一個數據庫中選擇行記錄,並顯示在一個結果集中。 java.sql.ResultSet接口表示一個數據庫查詢的結果集
一個 ResultSet對象控制一個光標指向當前行的結果集
查詢遍歷
import java.sql.*;
public class JDBC{
public static void main(String[] args) throws ClassNotFoundException,SQLException{
String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String URL = "jdbc:sqlserver://數據庫地址;DatabaseName=數據庫名;
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);
Class.forName(JDBC_DRIVER);
Connection connection = DriverManager.getConnection(URL,USEA,PASS);
Statement stmt = connection.createStatement();
ResultSet rs = stmt,executeQuery("SELECT * FROM 數據庫名);
while(rs.nest()){
Integer id = rs.getInt(1);
String USER = rs.getString("USER");
String PASS = rs.getString("PASS");
System.out.println(id +"-" +USER+"-"+PASS;
}
}
}
(1)Statement對象
Statement對象用於向數據庫發送SQL語句,數據庫的增刪改查通過這個對象來完成(向數據庫中發送指令)
查詢方法:
ResultSet executeQuery(String sql)
statement.executeUpdate():執行更新(包括增刪改,返回變化的行數)
8.釋放數據庫資源
try{
rs.close();
stmt.close();
}catch (Exeception e){
e.printStackTrace();
}finally{
if(connection != null){
try{
connection.close();
} catch(Exception ex){
}
}
}
五:JDBC執行語句
1.JDBC執行INSERT語句
String sql= "insert into employee(eno,ename) values(?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,10);
pstmt.setString(2,"張三");
//executeUpdate方法返回記錄數
int cnt = pstmt.executeUpdate();
//cnt=1
System.out.println("數據新增成功");
2.JDBC執行UPDATE語句
String sqlUpdate = "Update users set pass_word=? where user_name=?";
PreparedStatement pstmtUpdate = connection.prepareStatement(sqlUpdate);
pstmtUpdate.setString(2, "張三");
pstmtUpdate.setString(1,"888888" );
//executeUpdate方法返回記錄數
int UpdateCnt = pstmtUpdate.executeUpdate();
//cnt=1
System.out.println("數據更新成功")
3.JDBC執行Delete語句
String sqlDelete = "Delete users where user_name=?";
PreparedStatement pstmtDelete = connection.prepareStatement(sqlDelete);
pstmtDelete.setString(1, "張三");
//executeUpdate方法返回記錄數
int DeleteCnt = pstmtDelete.executeUpdate();
//cnt=1
System.out.println("數據刪除成功");
4.SQL注入
SQL注入是一種非常常見的數據庫攻擊手段,SQL注入漏洞也是網絡世界中最普遍的漏洞之一。SQL注入其實就是惡意用户通過在表單中填寫包含SQL關鍵字的數據來使數據庫執行非常規代碼的過程。簡單來説,就是數據做了代碼才能乾的事情。
防止SQL注入:
PreparedStatement對SQL進行參數化,預防SQL注入攻擊
5.JDBC事務管理
事務是以一種可靠的、一致的方式,訪問和操作數據庫的程序單元
(1)事務提交和回滾
conn.commit( );
conn.rollback( );
(2)使用還原點
Connection對象有兩個新的方法來管理還原點
setSavepoint(String savepointName): 定義了一個新的還原點。它也返回一個Savepoint對象。
releaseSavepoint(Savepoint savepointName): 刪除一個還原點。請注意,它需要一個作為參數的 Savepoint 對象。這個對象通常是由 setSavepoint() 方法生成的一個還原點。
有一個 rollback (String savepointName) 方法,該方法可以回滾到指定的還原點。
(3)JDBC允許兩種事務模式
自動提交事務模式
手動提交事務模式
6.Apache Commons DBUtils
commons-dbutils是 Apache提供的開源 JDBC工具類庫
它是對JDBC的簡單封裝,學習成本極低
使用commons-dbutils可以極大簡化JDBC編碼工作量