一、JDBC常用類和介面 JDBC(Java DataBase Connectivity,java資料庫連接)是一種用於執行SQL語句的Java API。JDBC是Java訪問資料庫的標準規範,可以為不同的關係型資料庫提供統一訪問,它由一組用Java語言編寫的介面和類組成。 JDBC與資料庫驅動的關 ...
一、JDBC常用類和介面
JDBC(Java DataBase Connectivity,java資料庫連接)是一種用於執行SQL語句的Java API。JDBC是Java訪問資料庫的標準規範,可以為不同的關係型資料庫提供統一訪問,它由一組用Java語言編寫的介面和類組成。
JDBC與資料庫驅動的關係:介面與實現類的關係。
二、JDBC常用類和介面
JDBC有關的類:都在java.sql 和 javax.sql 包下.
介面在Java中是用來定義 `行為規範的`. 介面必須有實現類.
JDBC規範(四個核心對象):
DriverManager:用於註冊驅動
Connection: 表示與資料庫創建的連接
Statement: 操作資料庫sql語句的對象
ResultSet: 結果集或一張虛擬表
特別註意: Mysql驅動8版本之後的driverClass 和url 的寫法 com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/day04?serverTimezone=UTC&characterEncoding=utf-8 // JDBC 初體驗
@Test
public void demo01() throws SQLException {
// 1. 裝載驅動
DriverManager.registerDriver(new Driver());
// 2. 建立連接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "111");
// 3. 操作數據
String sql = "select * from user;";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + " : " + username + " : " + password + " : " + email);
}
// 4. 釋放資源
rs.close();
stmt.close();
conn.close();
}
1
// JDBC 初體驗
2
@Test
3
public void demo01() throws SQLException {
4
// 1. 裝載驅動
5
DriverManager.registerDriver(new Driver());
6
// 2. 建立連接
7
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "111");
8
// 3. 操作數據
9
String sql = "select * from user;";
10
Statement stmt = conn.createStatement();
11
ResultSet rs = stmt.executeQuery(sql);
12
while (rs.next()) {
13
int id = rs.getInt("id");
14
String username = rs.getString("username");
15
String password = rs.getString("password");
16
String email = rs.getString("email");
17
System.out.println(id + " : " + username + " : " + password + " : " + email);
18
}
19
// 4. 釋放資源
20
rs.close();
21
stmt.close();
22
conn.close();
23
}
24
JDBC工具類的提取()
方式一、
--src下放連接資料庫的配置文件
|--properties
// 配置文件的名字 jdbc.properties
#mysql
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8
user=root
password=111
1
1
// 配置文件的名字 jdbc.properties
2
3
#mysql
4
driverClass=com.mysql.jdbc.Driver
5
url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8
6
user=root
7
password=111
8
--util包
|--JDBCUtils 類
|
public class JDBCUtils {
// 屬性
private static String driverClass;
private static String url;
private static String username;
private static String password;
// 什麼時候載入外部配置文件最合適 ???
// 特點1 : 隨著類的載入而載入.
// 特點2 : 靜態代碼塊只在類載入的被執行一次. 僅一次.
static {
Properties prop = new Properties();
try {
prop.load(new FileReader("jdbc.properties"));
// 如果程式執行到這裡, 說明外部資源文件載入成功, 需要給我們的靜態屬性賦值
driverClass = prop.getProperty("driverClass");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
// 直接執行載入驅動
loadDriver();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("文件資源載入失敗!");
}
}
// 載入驅動
public static void loadDriver() {
try {
// 1. 載入驅動
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
// e.printStackTrace();
// 驅動載入失敗!
throw new RuntimeException("驅動載入失敗!");
}
}
// 建立連接
public static Connection getConnection() throws SQLException {
// 2. 建立連接
return DriverManager.getConnection(url, username, password);
}
// 釋放資源
public static void release(Connection conn, Statement stmt, ResultSet rs) {
// 4. 釋放資源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
// 將 rs 清空
rs = null;
}
// 直接調用
release(conn, stmt);
}
public static void release(Connection conn, Statement stmt) {
// 4. 釋放資源
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
1
public class JDBCUtils {
2
3
// 屬性
4
private static String driverClass;
5
private static String url;
6
private static String username;
7
private static String password;
8
9
// 什麼時候載入外部配置文件最合適 ???
10
// 特點1 : 隨著類的載入而載入.
11
// 特點2 : 靜態代碼塊只在類載入的被執行一次. 僅一次.
12
static {
13
Properties prop = new Properties();
14
15
try {
16
prop.load(new FileReader("jdbc.properties"));
17
18
// 如果程式執行到這裡, 說明外部資源文件載入成功, 需要給我們的靜態屬性賦值
19
driverClass = prop.getProperty("driverClass");
20
url = prop.getProperty("url");
21
username = prop.getProperty("username");
22
password = prop.getProperty("password");
23
24
// 直接執行載入驅動
25
loadDriver();
26
27
} catch (IOException e) {
28
e.printStackTrace();
29
throw new RuntimeException("文件資源載入失敗!");
30
}
31
}
32
33
// 載入驅動
34
public static void loadDriver() {
35
try {
36
// 1. 載入驅動
37
Class.forName(driverClass);
38
} catch (ClassNotFoundException e) {
39
// e.printStackTrace();
40
// 驅動載入失敗!
41
throw new RuntimeException("驅動載入失敗!");
42
}
43
}
44
45
// 建立連接
46
public static Connection getConnection() throws SQLException {
47
// 2. 建立連接
48
return DriverManager.getConnection(url, username, password);
49
}
50
51
// 釋放資源
52
public static void release(Connection conn, Statement stmt, ResultSet rs) {
53
// 4. 釋放資源
54
if (rs != null) {
55
try {
56
rs.close();
57
} catch (SQLException e) {
58
e.printStackTrace();
59
}
60
// 將 rs 清空
61
rs = null;
62
}
63
// 直接調用
64
release(conn, stmt);
65
}
66
public static void release(Connection conn, Statement stmt) {
67
// 4. 釋放資源
68
if (stmt != null) {
69
try {
70
stmt.close();
71
} catch (SQLException e) {
72
e.printStackTrace();
73
}
74
stmt = null;
75
}
76
if (conn != null) {
77
try {
78
conn.close();
79
} catch (SQLException e) {
80
e.printStackTrace();
81
}
82
conn = null;
83
}
84
}
85
}
86
@Test
public void test_update() {
Connection conn = null;
Statement stmt = null;
try {
// 2. 建立連接
conn = JDBCUtils.getConnection();
// 3. 操作數據
String sql = "update user set username = 'zhaoliu', password = '123', email = '[email protected]' where id = 4;";
stmt = conn.createStatement();
int affectedRowNum = stmt.executeUpdate(sql);
System.out.println(affectedRowNum);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 釋放資源
JDBCUtils.release(conn, stmt);
}
}
@Test
public void test_delete() {
Connection conn = null;
Statement stmt = null;
try {
// 1. 建立連接
conn = JDBCUtils.getConnection();
// 2. 操作數據
String sql = "delete from user where id = 5;";
stmt = conn.createStatement();
int affectedRowNum = stmt.executeUpdate(sql);
System.out.println(affectedRowNum);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 釋放資源
JDBCUtils.release(conn, stmt);
}
}
@Test
public void test_insert() {
Connection conn = null;
Statement stmt = null;
try {
// 1. 建立連接
conn = JDBCUtils.getConnection();
// 2. 操作數據
String sql = "insert into user values(null, 'xiaoqi', '123', '[email protected]');";
stmt = conn.createStatement();
int affectedRowNumber = stmt.executeUpdate(sql);
System.out.println(affectedRowNumber);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 釋放資源
JDBCUtils.release(conn, stmt);
}
}
// 以上使用時 在進行查詢的操作時 有可能會出現 sql註入問題
// 解決SQL註入:使用PreparedStatement 取代 Statement
// PreparedStatement 解決SQL註入原理,運行在SQL中參數以?占位符的方式表示
// select * from user where username = ? and password = ? ;
// 將帶有?的SQL 發送給資料庫完成編譯 (不能執行的SQL 帶有?的SQL 進行編譯 叫做預編譯),在SQL編譯後發現缺少兩個參數
// PreparedStatement 可以將? 代替參數 發送給資料庫伺服器,因為SQL已經編譯過,參數中特殊字元不會當做特殊字元編譯,無法達到SQL註入的目的
/************ JDBC 資料庫連接操作 ***************/
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
// 1. 建立連接
conn = JDBCUtils.getConnection();
// 2. 操作數據
String sql = "select * from user where username = ? and password = ?;";
stmt = conn.prepareStatement(sql);
// 設置sql語句的參數
stmt.setString(1, username);
stmt.setString(2, password);
// 執行sql語句
rs = stmt.executeQuery();
// 判斷返回的結果
if (rs.next()) {
// 登錄成功
int id = rs.getInt("id");
String u_name = rs.getString("username");
String u_pwd = rs.getString("password");
String email = rs.getString("email");
System.out.println(id + " : " + u_name + " : " + u_pwd + " : " + email);
System.out.println("登錄成功!");
} else {
// 登錄失敗
System.out.println("登錄失敗! 用戶名或密碼錯誤!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 3. 釋放資源
JDBCUtils.release(conn, stmt, rs);
}
}
}
x110 1
2
public void test_update() {
3
Connection conn = null;
4
Statement stmt = null;
5
try {
6
// 2. 建立連接
7
conn = JDBCUtils.getConnection();
8
// 3. 操作數據
9
String sql =