JDBC的操作五大步驟:註冊驅動;建立連接;創建statement去執行sql,獲得結果;處理結果;釋放資源。就是這麼簡簡單單的五步,闡釋了Java連接數據庫時的優雅。
文章目錄
啥是JDBC
JDBC全稱: Java Data Base Connectivity,Java 數據庫連接
爲什麼會出現JDBC?
- 對於Java這門編程語言來說,它可能需要連接各種數據庫(MySQL、SQL Server、Oracle等等);
- 那麼對於這些數據庫廠商來說,他們都需要提供一套Java程序員能看懂的操作API;
- 這對於程序員來說,可謂是不小的難度。因爲,
當你連接MySQL時用的是一套API,當你連接Oracle時,又用的是另外一套API,十分蛋疼
。 - 於是SUN公司就想能不能程序員只用一套API,就可以操作所有的數據庫。(
皆大歡喜。) - 於是,就誕生了JDBC這門規範、技術,程序員使用SUN公司提供的API,就可以操作所有的數據庫,至於其他的,就是SUN公司的事了~~
註冊驅動
接下來,我將使用Java來連接MySQL數據庫。學習JDBC的基礎用法。
第0步:首要步驟!!
導入驅動包:
- 在當前項目根目錄下建立一個“lib”文件夾;
- 把“mysql-connector-java-5.1.18-bin.jar”複製到該文件夾中;
- 選中該jar包,右鍵,執行“build Path”才能真正導入該jar包。纔可以開始執行以下的步驟!
爲什麼要導入這個jar包?
- 有了這個包,你纔可以愉快地使用JDBC操作MySQL數據庫。
- 裏面提供了MySQL的實現類:
com.mysql.jdbc.Driver
。 - 但是要注意,JDBC規範定義
驅動接口在java.sql.Driver
,也就是你要操作數據庫的所有方法都要在這個包下
查找。
註冊驅動法一:創建驅動對象
快速理解連接操作方式:
import com.mysql.jdbc.Driver;
import java.util.Properties;
import java.sql.Connection;
import java.sql.SQLException;
public class TempMain {
// 連接數據庫URL格式爲:jdbc協議:數據庫子協議:主機:端口/連接的數據庫名
// 和HTTP協議類似
private static String url = "jdbc:mysql://localhost:3306/mydb";
private static String user = "root";// 用戶名
private static String password = "root";// 密碼
//第一種方法:使用驅動程序去連接
public static void main(String[] args) throws SQLException {
//1.創建驅動程序類對象:
//new不能是接口,而是實現類;實現類(要導包)在:com.mysql.jdbc.Driver裏;
Driver driver = new com.mysql.jdbc.Driver(); //新版本
//Driver driver = new org.gjt.mm.mysql.Driver(); //舊版本
//設置用戶名和密碼
Properties props = new Properties();
props.setProperty("user", user);
props.setProperty("password", password);
//2.連接數據庫,返回連接對象
Connection conn = driver.connect(url, props);
System.out.println(conn);
//輸出:com.mysql.jdbc.JDBC4Connection@ba4d54,表明連接成功
}
}
分析:
JDBC的URL格式:
JDBC規定url的格式由三部分組成,每個部分中間使用冒號分隔。
- 第一部分是jdbc,這是固定的;
- 第二部分是數據庫名稱,那麼連接mysql數據庫,第二部分當然是mysql了;
- 第三部分是由數據庫廠商規定的,我們需要了解每個數據庫廠商的要求,mysql的第三部分分別由數據庫服務器的IP地址(localhost)、端口號(3306),以及DATABASE名稱(mydb)組成。
如果連接的是本地的Mysql數據庫,並且連接使用的端口是3306,那麼的url地址可以簡寫爲:
jdbc: mysql://數據庫,
例如:jdbc: mysql://localhost:3306/mydb
註冊驅動法二: 使用驅動管理器類連接數據庫
快速理解使用方式
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TempMain {
// 連接數據庫URL格式爲:jdbc協議:數據庫子協議:主機:端口/連接的數據庫名
// 和HTTP協議類似
private static String url = "jdbc:mysql://localhost:3306/mydb";
private static String user = "root";// 用戶名
private static String password = "root";// 密碼
// 第二種方法:使用驅動管理器類連接數據庫
public static void main(String[] args) throws SQLException {
Driver driver = new com.mysql.jdbc.Driver();
// Driver driver2 = new com.oracle.jdbc.Driver(); //Oracle數據庫的連接
// 1.註冊驅動程序(可以註冊多個驅動程序)
DriverManager.registerDriver(driver);
// DriverManager.registerDriver(driver2);
//注意,通過查詢驅動包中的Driver類的源碼可知:該類的static代碼塊中已經執行了“DriverManager.registerDriver(driver);”,那麼這就相當於註冊了兩次,冗餘了
// 2.連接到具體的數據庫
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
//輸出:com.mysql.jdbc.JDBC4Connection@31b7dea0;表明連接成功
}
}
不推薦使用這種註冊方式:
- 硬編碼,後期不易於程序擴展和維護
- 通過查詢驅動包中的Driver類的源碼可知:該類的static代碼塊中已經執行了“
DriverManager.registerDriver(driver);
”,那麼這就相當於註冊了兩次,也就是在內存中會有兩個Driver對象,冗餘了 - 程序依賴mysql的api,脫離mysql的jar包,程序將無法編譯,將來程序切換底層數據庫將會非常麻煩。
註冊驅動法三: 使用加載驅動程序類來註冊驅動程序
快速理解使用方式
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TempMain {
// 連接數據庫URL格式爲:jdbc協議:數據庫子協議:主機:端口/連接的數據庫名
// 和HTTP協議類似
private static String url = "jdbc:mysql://localhost:3306/mydb";
private static String user = "root";// 用戶名
private static String password = "root";// 密碼
// 第三種方法:使用驅動管理器類連接數據庫
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 1.通過得到字節碼對象的方式加載靜態代碼塊,從而註冊驅動程序
Class.forName("com.mysql.jdbc.Driver"); // 參數是字節碼
// 2.連接到具體的數據庫
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
//輸出:com.mysql.jdbc.JDBC4Connection@50675690,表明連接成功
}
}
底層原理:
- 通常開發我們使用
Class.forName()
加載一個使用字符串描述的驅動類。 - 如果使用Class.forName()將類加載到內存,該
類的靜態代碼將自動執行
。 - 通過查詢com.mysql.jdbc.Driver源碼,我們發現Driver類“主動”將自己進行註冊
- 結論:推薦使用
建立連接
方法1:創建驅動對象
Driver driver = new com.mysql.jdbc.Driver(); //若new驅動對象
Connection conn = driver.connect(url, props); //則必須使用這種建立連接
方法2:使用加載驅動程序類來註冊驅動程序
Class.forName("com.mysql.jdbc.Driver"); //加載驅動對象
Connection conn = DriverManager.getConnection(url, user, password); //加載獲取連接
- Connection是接口,DriverManager.getConnection()返回的是com.mysql.jdbc.JDBC4Connectiond的實現類。
Connection類的API詳解
createStatement()
:創建向數據庫發送sql的statement對象。prepareStatement(sql)
:創建向數據庫發送預編譯sql的PrepareSatement對象。prepareCall(sql)
:創建執行存儲過程的callableStatement對象。setAutoCommit(boolean autoCommit)
:設置事務是否自動提交。commit()
:在鏈接上提交事務。rollback()
:在此鏈接上回滾事務。
DriverManager類功能詳解
- DriverManager在JDBC規範中是類而不是接口。它是一個服務類,用於管理JDBC驅動程序,提供getConnection()方法建立應用程序與數據庫的連接。
- getConnection()是個靜態方法。返回的是com.mysql.jdbc.JDBC4Connectiond的實現類。打印“conn”變量內容爲:“com.mysql.jdbc.JDBC4Connectiond”
- DriverManager在java.sql包中。當我們調用sql包裏不論什麼一個類(包含接口)的不論什麼一個方法時都會報一個編譯時異常SQLException。
創建statement去執行sql,獲得結果
類型:
1、運行靜態SQL語句。通常通過Statement實例實現。
2、運行動態SQL語句。通常通過PreparedStatement實例實現。
3、運行數據庫存儲過程。通常通過CallableStatement實例實現。
測試用的mysql語句
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE person(
p_id INT PRIMARY KEY,
p_name VARCHAR(10),
p_age INT
);
INSERT INTO person(p_id,p_name,p_age) VALUES
(1,"asus",20),
(2,"alibaba",40),
(3,"huawei",50)
靜態SQL:Statement
特性:
java.sql.Statement接口
,所有的操作方法也來自該接口;- 在每次使用時,都是
用“com.mysql.jdbc”包中的類來返回“java.sql.Statement”接口的引用
!
Statement接口提供了三種運行SQL語句的方法:executeQuery、executeUpdate 和execute。
ResultSet executeQuery(String sqlString)
:運行查詢數據庫的SQL語句。返回一個結果集(ResultSet)對象。int executeUpdate(String sqlString)
:用於運行INSERT、UPDATE或DELETE語句以及SQL DDL語句,如:CREATETABLE和DROP TABLE等。返回影響作用的行數。boolean execute(sqlString)
:用於運行返回多個結果集、多個更新計數或二者組合的語句。ddBatch(String sql)
:把多條sql語句放到一個批處理中。executeBatch()
:向數據庫發送一批sql語句執行。
學習例子:
https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/03-%E9%9D%99%E6%80%81SQL(Statement)%E7%9A%84CRUD
動態SQL:PreparedStatement
特性:
- 是“java.sql.Statement”
接口的子接口
- 這個
接口的實現類
,在數據庫的驅動中:“com.mysql.jdbc. JDBC4PreparedStatement”
方法詳情:
int executeUpdate()
; 執行PreparedStatement對象中預編譯的SQL語句。返回執行成功的行數。 適用執行:insert、update、delete類的SQL語句;executeQuery方法
,適用於執行有返回結果集的SQL語句,例如select。
學習例子:
https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/04-%E5%8A%A8%E6%80%81SQL(PreparedStatement)%E7%9A%84CURD
處理結果
獲取方法:
- Object getObject(int index) / Object getObject(String name) 獲得任意對象
- String getString(int index) / Object getObject(String name) 獲得字符串
- int getInt(int index) / Object getObject(String name) 獲得整形
- double getDouble(int index) / Object getObject(String name) 獲得雙精度浮點型
遍歷方法:
- boolean next(); 將光標移動至下一行。當光標返回最後一行之後一行,或者爲空,返回false。
- Previous():移動到前一行
- absolute(int row):移動到指定行
- beforeFirst():移動resultSet的最前面。
- afterLast() :移動到resultSet的最後面。
釋放資源
操作完畢以後要把全部使用的JDBC對象全都關閉,以釋放JDBC資源。關閉順序和聲明順序相反:
1、關閉記錄集
2、關閉聲明
3、關閉連接對象
關閉資源SOP:
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();
}
}