JDBC的簡介
簡介
- JDBC(Java Database Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用java語言編寫的類和接口組成
- JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序
- JDBC可以在各種平臺上使用Java,如Windows,Mac OS和各種版本的UNIX
- JDBC庫包括與數據庫使用相關的API
- 連接數據庫
- 創建SQL或MYSQL語句
- 在數據庫中執行SQL或MYSQL查詢
- 查看和修改生成的記錄
JDBC體系結構
- JDBC API支持用於數據庫訪問的兩層和三層處理模型,但通常,JDBC體系結構由兩層組成:
- JDBC:提供了應用程序到數據庫連接規範
- JDBC驅動程序:連接數據庫的驅動程序的實現
JDBC核心組件
- DriverManager:此類管理數據庫驅動程序列表,使用通信協議將來自java應用程序的連接請求與適當的數據庫驅動程序匹配。
- Driver:此接口處理與數據庫服務器的通信,我們很少會直接與Driver對象進行交互,而是使用DriverManager對象來管理這種類型的對象
- Connection:該接口具有用於連接數據庫的所有方法,連接對象表示上下文,數據庫的所有通信僅通過連接對象
- Statement:使用從此接口創建的對象將SQL語句提交到數據庫,除了執行存儲過程之位,一些派生接口還接受參數
- ResultSet:在使用Statement對象執行SQL查詢後,這些對象保存從數據庫檢索的數據。它作爲一個迭代器,允許我們移動其數據
- SQLException:此類處理數據庫應用程序中發生的任何異常
JDBC使用步驟
導入JDBC驅動包:需要下載包含數據可編程所需的JDBC的jar包(mysql的jar包:mysql-connector-java-5.1.48.jar)
註冊JDBC驅動程序:要求您初始化驅動程序,以便您可以打開與數據庫的通信通道
創建連接:需要使用DriverManager.getConnection()方法創建一個Connection對象,該對象表示與數據庫的物理連接
執行查詢:需要使用類型爲Statement的對象來構建和提交SQL語句到數據庫
從結果集中提取數據:需要使用相應的ResultSet.getXXX()方法從結果集中集中檢索數據
釋放資源:需要明確的關閉所有數據庫資源,而不依賴於JVM的垃圾收集
- 用eclipse,建議導入jar包,在項目下創建lib目錄,把mysql的jdbc的jar包放入此目錄,並添加到build path中(idea不同)
註冊驅動
- 第一種方式:是使用靜態DriverManager.registerDriver()方法。
package waking.test.jdbc;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.Driver;
public class Demo01 {
public static void main(String[] args) {
try {
Driver driver = new Driver();
DriverManager.registerDriver(driver);
System.out.println("註冊驅動成功、、、");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("註冊驅動異常、、、、");
}
}
}
- 第二種方式:Class.forName():註冊驅動程序最常見的方法是使用Java的Class.forName()方法,將驅動程序的類文件動態加載到內
存中,並將其自動註冊
package waking.test.jdbc;
public class Demo02 {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("註冊成功、、、");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("註冊異常、、、");
}
}
}
- 第三種方式:什麼都不寫,程序會自動加載驅動(不建議使用)
獲取連接
- 加載驅動程序後,可以使用DriverManager.getConnection()方法建立連接。
getConnection(String url)
getConnection(String url, Properties prop)
getConnection(String url,String user, String Password)
String URL ="jdbc:mysql://localhost:3306/csdn";
//csdn是數據庫名,localhost是代表本機,3306,是端口號
String USER ="root";
//mysql數據庫用戶名
String PASS = "123456"
//mysql數據庫密碼
//獲取連接
Connection conn = DriverManager.getConnection(URL,USER,PASS);
執行sql語句
- 一旦獲得了連接,就可以與數據庫交互,JDBC Statement和PreparedStatement接口定義了能夠發送SQL命令並從數據庫接收數據的方法和屬性。
接口 |
使用 |
Statement |
用於對數據庫進行通用訪問。在運行時使用靜態SQL語句時很有用。注:Statement接口不能接收參數 |
PreparedStatement |
推薦使用,多次使用SQL語句時使用,PrepareStatement接口在運行時接受輸入參數 |
方法名 |
說明 |
boolean execute(String SQL) |
如果可以檢索到ResultSet對象,則返回一個布爾值true,否則返回false。使用此方法執行SQL DDL語句或需要使用真正的動態SQL時 |
int executeUpdate(String SQL) |
返回SQL語句執行影響行數,使用此方法執行預期會影響多個行的SQL語句,列如:insert,update,delete語句 |
ResultSet executeQuery(String SQL) |
返回一個ResultSet對象,使用select語句 |
就像IO流一樣,JDBC中的方法也要關閉連接,通常關閉順序
ResultSet--->statement/preparedStatement-->Connection
CRUD操作
查詢(select)
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo03 {
public static void main(String[] args) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "select * from user";
rs = stmt.executeQuery(sql);
while(rs.next()) {
int userId = rs.getInt("userId");
String username = rs.getString("username");
String pword = rs.getString("password");
String address = rs.getString("address");
String phone = rs.getString("phone");
System.out.println("userId:"+userId+"username:"+username+"pword:"+pword+"address:"+address+"phone:"+phone);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
插入(insert)
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo04 {
public static void main(String[] args) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "insert into user values(5,'waking','waking','haha','17273934784')";
int row = stmt.executeUpdate(sql);
System.out.println("影響"+row+"行");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
更新(update)
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo05 {
public static void main(String[] args) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "update user set password = '123456' where userId=5";
int row = stmt.executeUpdate(sql);
System.out.println("影響"+row+"行");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
刪除(delete)
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo06 {
public static void main(String[] args) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "delete from user where userId = 5";
int row = stmt.executeUpdate(sql);
System.out.println("影響"+row+"行");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
用戶登錄註冊
- 用戶登錄案例是開放人員最常用的操作,以下實現簡單的登錄註冊
- 註冊
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class Demo07 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請您註冊、、");
System.out.println("請您輸入姓名");
String username = sc.nextLine();
System.out.println("請輸入密碼、、、");
String pword = sc.nextLine();
System.out.println("請輸入地址、、、");
String address = sc.nextLine();
System.out.println("請輸入手機號碼、、、");
String phone = sc.nextLine();
register(username, pword, address, phone);
}
public static void register(String username,String pword,String address,String phone) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "insert into user(username,password,address,phone) values('"+username+"','"+pword+"','"+address+"','"+phone+"')";
int row = stmt.executeUpdate(sql);
System.out.println("影響"+row+"行");
System.out.println("註冊成功、、、");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class Demo08 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("請登錄、、、");
System.out.println("請輸入用戶名、、、");
String username = sc.nextLine();
System.out.println("請輸入密碼");
String pword = sc.nextLine();
login(username, pword);
}
public static void login(String username,String pword) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
ResultSet rs =null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "select * from user where "+"username='"+username+"' and "+"password='"+pword+"'";
rs= stmt.executeQuery(sql);
if(rs!=null) {
System.out.println("登錄成功、、、");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
SQL注入
- 以上的用法有安全問題(SQL注入)
- 就是通過把SQL命令插入到web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令
- 具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它可以通過在web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
- 例子:
SELECT * FROM USER WHERE username='waking' AND PASSWORD='wakingwdr' OR '1'='1';
#後面or ‘1’=‘1’恆成立
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class Demo09 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("請登錄、、、");
System.out.println("請輸入用戶名、、、");
String username = sc.nextLine();
System.out.println("請輸入密碼");
String pword = sc.nextLine();
login(username, pword);
}
public static void login(String username,String pword) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
String sql = "select * from user where username = ? and password = ?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs =null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, pword);
rs = pstmt.executeQuery();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
System.out.println("登錄成功、、、");
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
下一篇會介紹JDBC和mysql的事務問題,以及批處理問題,感謝您的觀看