【JDBC】
(java Data Base Connectivity, java數據庫連接)是一種用於執行SQL語句的java API,可以爲多種關係數據庫提供統一訪問,是由java語言編寫的類和接口組成。也是java訪問數據庫標準規範。
【JDBC 原理】
java提供訪問數據庫規範稱爲JDBC,而生產廠商提供規範的實現類稱爲驅動。JDBC是接口,驅動是接口的實現類。
【JDBC操作數據庫步驟】
(1) 註冊驅動 告知JVM使用的是哪一個數據庫的驅動
(2) 獲得連接 使用JDBC中的類,來完成對MySQL數據的連接(TCP協議)
(3) 獲得語句執行平臺 通過連接對象 獲得對SQL語句的執行者對象
1、Statement sta = con.createStatement();
2、PreparedStatement pst = con.prepareStatement(sql); 避免注入攻擊
(4) 執行SQL語句 使用執行者對象,向數據庫執行SQL語句 獲取數據庫執行後的結果
int executeUpdate(String sql); 執行 insert、delete、update語句
ResultSet executeQuery (String sql); 執行select語句
(5) 處理結果 (執行insert、delete、update語句無需處理)
ResultSet 實際上是一個二維的表格 ,方法boolean next() 將光標從當前位置向前移一行,有結果集返回true,沒有結果集返回false。
(6) 釋放資源 調用一堆close()
【方法executeUpdate】
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Driver;
public class JDBCDemo1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. 註冊驅動 反射技術 將驅動類加入到內存
// 使用java.sql.DriverManager靜態方法registerDriver(Driver driver)
// Driver 是一個接口,參數傳遞,MySQL程序中的實現類
//DriverManager.registerDriver(new Driver()); // 驅動類源代碼,註冊2次驅動程序
// Class.forName()加載一個使用字符串描述的 驅動類(將該類加載到內存中,該類的靜態方法將自動執行)
Class.forName("com.mysql.jdbc.Driver");
// 2. 獲得數據庫連接 DriverManager工具類 中靜態方法
// static connection getConnection(String url, String user, String password)
// 返回值是Connection接口的實現類 在mysql驅動程序
// url:數據庫地址 jdbc:mysql://數據庫服務器的IP地址:端口號/數據庫名字
String url = "jdbc:mysql://localhost:3306/mybase1";
String user = "root"; // 數據庫賬戶
String password = "123"; // 數據庫密碼
Connection con = DriverManager.getConnection(url, user, password);
// 3. 獲得語句執行平臺 ,通過數據庫連接對象,獲得SQL語句的執行者對象
// con對象調用方法 Statement createStatement() 獲取Statement對象,將SQL語句發送到數據庫
// 返回值是Statement接口的實現類對象,在mysql驅動程序
Statement sta = con.createStatement();
// 4. 執行SQL語句 通過執行者對象調用方法 執行SQL語句,獲取結果
// int executeUpdate(String sql) 執行數據庫中SQL語句 僅限於 insert delete update
// 返回int 成功操作數據的行數
int row = sta.executeUpdate("INSERT INTO sort1(sname,sprice,sdesc) VALUES ('新能源汽車',30000,'補貼')");
System.out.println(row); // 1
// 6. 釋放資源
sta.close();
con.close();
}
}
【方法executeQuery】
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. 註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2. 獲得數據庫連接
String url ="jdbc:mysql://localhost:3306/mybase1";
String user = "root"; // 數據庫賬戶
String password = "123"; // 數據庫密碼
Connection con = DriverManager.getConnection(url, user, password);
// 3. 獲得SQL語句執行對象
Statement stat = con.createStatement();
// 拼寫查詢的SQL語句
String sql = "SELECT * FROM sort1";
// 4. 調用執行對象方法,執行SQL語句獲取結果集
// ResultSet executeQuery(String sql) 執行SQL語句中的select查詢
// 返回值ResultSet的接口的實現類對象 實現類在mysql的驅動中
ResultSet rs = stat.executeQuery(sql);
// 5. 處理結果集
// ResultSet 接口方法 boolean next() 有結果集返回true 沒有結果集返回false
while(rs.next()){
// 獲取每列數據,使用的是ResultSet接口的方法 getXX方法參數中,建議寫String列名
System.out.println(rs.getInt("sid")+" "+rs.getString("sname")+" "
+rs.getDouble("sprice")+" "+rs.getString("sdesc"));
}
// 6. 釋放資源
rs.close();
stat.close();
con.close();
}
}
【SQL注入攻擊 用戶登錄案例】
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
/*
* SQL注入攻擊 用戶登錄案例
* 在java程序實現用戶登錄,用戶輸入賬戶和密碼後,到數據庫中檢查賬戶和密碼
* */
public class JDBCDemo3 {
public static void main(String[] args) throws Exception {
// 1. 註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2. 獲得數據連接
String url = "jdbc:mysql://localhost:3306/mybase1";
String user = "root"; // 數據庫賬戶
String password = "123"; // 數據庫密碼
Connection con = DriverManager.getConnection(url, user, password);
// 3. 獲得SQL語句執行對象
Statement stat = con.createStatement();
// 鍵盤輸入 賬戶 密碼
Scanner sc = new Scanner(System.in);
String strname = sc.nextLine();
String strpassword = sc.nextLine();
// 4. 拼寫查詢的SQL語句 執行語句獲得結果集
// 執行SQL語句,在數據庫中查找用戶名和密碼,若存在,登錄成功;否則登錄失敗
// 注入攻擊 鍵盤輸入 strname=1 strpassword=2' or '1=1 則會登錄成功
String sql = "SELECT * FROM user1 WHERE username='"+ strname +"' AND userpassword='"+strpassword+"'";
System.out.println(sql);
ResultSet rs = stat.executeQuery(sql);
// 5. 處理結果集
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getString("userpassword"));
}
// 6. 釋放資源
rs.close();
stat.close();
con.close();
}
}
【防止注入攻擊】
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;
/*
* SQL防止注入攻擊 用戶登錄案例
* 在java程序實現用戶登錄,在數據庫中檢查賬戶和密碼
*
* Statement接口實現類,作用:執行SQL語句,返回結果集
* Statement的一個子接口PreparedStatement 作用:對SQL語句進行預編譯存儲,多次高效的執行SQL語句
* PreparedStatement這個接口的實現類 ,在驅動程序中
* Connection數據庫連接對象的方法:
* PreparedStatement PreparedStatement(String sql)
* */
public class JDBCDemo4 {
public static void main(String[] args) throws Exception {
// 1. 註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2. 獲得數據連接
String url = "jdbc:mysql://localhost:3306/mybase1";
String user = "root"; // 數據庫賬戶
String password = "123"; // 數據庫密碼
Connection con = DriverManager.getConnection(url, user, password);
// 鍵盤輸入 賬戶 密碼
Scanner sc = new Scanner(System.in);
String strname = sc.nextLine();
String strpassword = sc.nextLine();
// 執行SQL語句,在數據庫中查找用戶名和密碼,若存在,登錄成功;否則登錄失敗
// 注入攻擊 鍵盤輸入 strname=1 strpassword=2' or '1=1 則會登錄成功
String sql = "SELECT * FROM user1 WHERE username=? AND userpassword=?"; // SQL語句中的參數全部採用問號佔位符
// 3. 獲得SQL語句執行對象
PreparedStatement pst = con.prepareStatement(sql);
// 調用pst對象方法set,設置問號佔位符上的參數
pst.setObject(1, strname);
pst.setObject(2, strpassword);
System.out.println(sql);
// 4. 調用方法,執行SQL語句,獲取結果集
ResultSet rs = pst.executeQuery();
// 5. 處理結果集
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getString("userpassword"));
}
// 6. 釋放資源
rs.close();
pst.close();
con.close();
}
}
【PrepareStatement接口】實現數據表的更新操作
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/*
* 使用PreparedStatement接口,實現數據表的更新操作
* */
public class JDBCDemo5 {
public static void main(String[] args) throws Exception {
// 1. 註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2. 獲得數據連接
String url = "jdbc:mysql://localhost:3306/mybase1";
String user = "root"; // 數據庫賬戶
String password = "123"; // 數據庫密碼
Connection con = DriverManager.getConnection(url, user, password);
// 拼寫修改的SQL語句,參數採用?佔位
String sql = "UPDATE sort1 SET sname=?,sprice=? WHERE sid=?";
// 調用數據庫的連接對象con的方法preparedStatement獲取SQL語句的預編譯對象
PreparedStatement pst = con.prepareStatement(sql);
// 調用pst對象的setXX方法,設置?佔位
pst.setObject(1, "羽絨服");
pst.setObject(2, 2000);
pst.setObject(3, 8);
// 調用pst的方法執行SQL語句
pst.executeUpdate();
// 關閉資源
pst.close();
con.close();
}
}
【PreparedStatement接口】實現數據表的查詢操作
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/*
* PrepareStatement接口實現數據表的查詢操作
* */
public class JDBCDemo6 {
public static void main(String[] args) throws Exception {
// 1. 註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2. 獲得數據連接
String url = "jdbc:mysql://localhost:3306/mybase1";
String user = "root"; // 數據庫賬戶
String password = "123"; // 數據庫密碼
Connection con = DriverManager.getConnection(url, user, password);
String sql = "SELECT * FROM sort1";
PreparedStatement pst = con.prepareStatement(sql);
// 調用pst對象方法,執行查詢語句
ResultSet rs = pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("sid")+" "+rs.getString("sname")+" "+rs.getString("sprice")
+" "+rs.getString("sdesc"));
}
rs.close();
pst.close();
con.close();
}
}