JDBC(Java DataBase Connectivity,java數據庫鏈接)是一種用於執行SQL語句的Java API。JDBC是Java訪問數據庫的標準規範,能夠爲不一樣的關係型數據庫提供統一訪問,它由一組用Java語言編寫的接口和類組成。java
JDBC與數據庫驅動的關係:接口與實現類的關係。mysql
JDBC有關的類:都在java.sql 和 javax.sql 包下. sql
接口在Java中是用來定義 `行爲規範的`. 接口必須有實現類.數據庫
JDBC規範(四個核心對象):服務器
DriverManager:用於註冊驅動app
Connection: 表示與數據庫建立的鏈接ide
Statement: 操做數據庫sql語句的對象工具
ResultSet: 結果集或一張虛擬表atom
// 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(); }
// 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();
}
// 配置文件的名字 jdbc.properties #mysql driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8 user=root password=111
// 配置文件的名字 jdbc.properties
#mysql
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8
user=root
password=111
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; } } }
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;
}
}
}
@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
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);
}
}
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);
}
}
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);
}
}
}
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">url