19JDBC初體驗

来源:https://www.cnblogs.com/zhengyuan/archive/2018/08/08/9446355.html
-Advertisement-
Play Games

一、JDBC常用類和介面 JDBC(Java DataBase Connectivity,java資料庫連接)是一種用於執行SQL語句的Java API。JDBC是Java訪問資料庫的標準規範,可以為不同的關係型資料庫提供統一訪問,它由一組用Java語言編寫的介面和類組成。 JDBC與資料庫驅動的關 ...


一、JDBC常用類和介面

JDBCJava DataBase Connectivity,java資料庫連接)是一種用於執行SQL語句的Java APIJDBCJava訪問資料庫的標準規範,可以為不同的關係型資料庫提供統一訪問,它由一組用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);
		}
	}
}
     
x
110           1
@Test
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 =
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • random模塊用於生成各種隨機數,常用的方法有: random.random():產生0-1之間的隨機小數。 random.randint(a, b):產生a-b之間的隨機數,包含a和b。 random.randrange(a, b):產生a-b之間的隨機數,包含a,不包含b。 random.ch ...
  • 報數序列是指一個整數序列,按照其中的整數的順序進行報數,得到下一個數。其前五項如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被讀作 "one 1" ("一個一") , 即 11。 11 被讀作 "two 1s" ("兩個一"), 即 21。 21 被讀作 "one ...
  • 續playPoker類 運行截圖 ...
  • 項目:爬取房天下網站全國所有城市的新房和二手房信息 網站url分析 創建項目 sfw_spider.py items.py pipelines.py middleware.py 設置隨機User-Agent settings.py start.py ...
  • JDK9以上或JDK6以下使用mail.jar包不加JAF的activation.jar包會拋出該錯誤!JDK6以上不需要加該jar包; 參考原文 https://stackoverflow.com/questions/8186395/noclassdeffounderror-javax-activ ...
  • [TOC] 時間序列深度學習:seq2seq 模型預測太陽黑子 本文翻譯自《Time Series Deep Learning, Part 2: Predicting Sunspot Frequency With Keras Lstm in R》,略有刪減 "原文鏈接" 深度學習於商業 的用途之一是 ...
  • Celery 什麼是Celery? Celery是一種簡單/高效/靈活的即插即用的分散式任務隊列. Celery應用場景? 需要非同步處理的任務,發郵件/發簡訊/上傳等耗時的操作.最終到達提升用戶體驗的目的. Celery的模式 Celery主要是由Broker(中間人)和Worker(任務處理者)組 ...
  • 一、String的解析 1.String的含義 ①String是不可以被繼承的,String類是final類,String類是由char[]數組來存儲字元串。 ②String是不可變的字元序列,如果存儲abc則在字元串常量池中開闢長度固定為3的字元數組,無論怎麼改變均會產生新的實例。 2.Strin ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...