19JDBC初體驗

1、JDBC經常使用類和接口

JDBCJava DataBase Connectivity,java數據庫鏈接)是一種用於執行SQL語句的Java APIJDBCJava訪問數據庫的標準規範,能夠爲不一樣的關係型數據庫提供統一訪問,它由一組用Java語言編寫的接口和類組成。java

 

JDBC與數據庫驅動的關係:接口與實現類的關係。mysql

 

2、JDBC經常使用類和接口

JDBC有關的類:都在java.sql javax.sql 包下. sql

接口在Java中是用來定義 `行爲規範的`.   接口必須有實現類.數據庫

 

JDBC規範(四個核心對象):服務器

DriverManager:用於註冊驅動app

Connection: 表示與數據庫建立的鏈接ide

Statement: 操做數據庫sql語句的對象工具

ResultSet: 結果集或一張虛擬表atom

 
特別注意:
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工具類的提取()
 
方式1、
--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 = 'zhaoliu@youjian.cn' 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', 'xiaoqi@youjian.cn');";
			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 = "update user set username = 'zhaoliu', password = '123', email = 'zhaoliu@youjian.cn' where id = 4;";
10
stmt = conn.createStatement();
11
int affectedRowNum = stmt.executeUpdate(sql);
12
System.out.println(affectedRowNum);
13
} catch (SQLException e) {
14
e.printStackTrace();
15
} finally {
16
// 4. 釋放資源
17
JDBCUtils.release(conn, stmt);
18
}
19
}
20
 
         
21
@Test
22
public void test_delete() {
23
Connection conn = null;
24
Statement stmt = null;
25
 
         
26
try {
27
// 1. 創建鏈接
28
conn = JDBCUtils.getConnection();
29
// 2. 操做數據
30
String sql = "delete from user where id = 5;";
31
stmt = conn.createStatement();
32
int affectedRowNum = stmt.executeUpdate(sql);
33
System.out.println(affectedRowNum);
34
} catch (SQLException e) {
35
e.printStackTrace();
36
} finally {
37
// 4. 釋放資源
38
JDBCUtils.release(conn, stmt);
39
}
40
}
41
 
         
42
@Test
43
public void test_insert() {
44
 
         
45
Connection conn = null;
46
Statement stmt = null;
47
try {
48
// 1. 創建鏈接
49
conn = JDBCUtils.getConnection();
50
// 2. 操做數據
51
String sql = "insert into user values(null, 'xiaoqi', '123', 'xiaoqi@youjian.cn');";
52
stmt = conn.createStatement();
53
int affectedRowNumber = stmt.executeUpdate(sql);
54
System.out.println(affectedRowNumber);
55
} catch (SQLException e) {
56
e.printStackTrace();
57
} finally {
58
// 4. 釋放資源
59
JDBCUtils.release(conn, stmt);
60
}
61
}
62
 
         
63
 
         
64
// 以上使用時 在進行查詢的操做時 有可能會出現 sql注入問題
65
// 解決SQL注入:使用PreparedStatement 取代 Statement 
66
// PreparedStatement 解決SQL注入原理,運行在SQL中參數以?佔位符的方式表示
67
// select * from user where username = ? and password = ? ;
68
// 將帶有?的SQL 發送給數據庫完成編譯 (不能執行的SQL 帶有?的SQL 進行編譯 叫作預編譯),在SQL編譯後發現缺乏兩個參數
69
// PreparedStatement 能夠將? 代替參數 發送給數據庫服務器,由於SQL已經編譯過,參數中特殊字符不會當作特殊字符編譯,沒法達到SQL注入的目的 
70
 
         
71
 
         
72
 
         
73
/************ JDBC 數據庫鏈接操做 ***************/
74
Connection conn = null;
75
PreparedStatement stmt = null;
76
ResultSet rs = null;
77
 
         
78
try {
79
// 1. 創建鏈接
80
conn = JDBCUtils.getConnection();
81
// 2. 操做數據
82
String sql = "select * from user where username = ? and password = ?;";
83
stmt = conn.prepareStatement(sql);
84
// 設置sql語句的參數
85
stmt.setString(1, username);
86
stmt.setString(2, password);
87
// 執行sql語句
88
rs = stmt.executeQuery();
89
// 判斷返回的結果
90
if (rs.next()) {
91
// 登陸成功
92
int id = rs.getInt("id");
93
String u_name = rs.getString("username");
94
String u_pwd = rs.getString("password");
95
String email = rs.getString("email");
96
System.out.println(id + " : " + u_name + " : " + u_pwd + " : " + email);
97
System.out.println("登陸成功!");
98
} else {
99
// 登陸失敗
100
System.out.println("登陸失敗! 用戶名或密碼錯誤!");
101
}
102
} catch (SQLException e) {
103
e.printStackTrace();
104
} finally {
105
// 3. 釋放資源
106
JDBCUtils.release(conn, stmt, rs);
107
}
108
}
109
}
110
 
         
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">url



相關文章
相關標籤/搜索