介紹
SUN公司爲了簡化、統一對數據庫的操作,定義了一套Java操作數據庫的規範(接口),稱之爲JDBC。
- JDBC全稱爲:Java Data Base Connectivity 【Java數據庫連接】
- 組成JDBC的2個包: java.sql
javax.sql
注意:開發JDBC應用需要以上2個包的支持外,還需要導入相應JDBC的數據庫實現(即數據庫驅動)。
下載驅動
推薦下載地址 : https://mvnrepository.com/artifact/mysql/mysql-connector-java
搭建實驗環境
新建一個Java工程,並導入數據驅動。
在mysql中創建一個庫,並創建user表和插入表的數據。
使用JDBC
編寫程序從user表中讀取數據,並打印在命令行窗口中。
編寫JDBC代碼固定步驟:
① 加載驅動
② 獲取與數據庫的鏈接
③ 獲取用於向數據庫發送sql語句的statement
④ 向數據庫發sql,並獲取代表結果集的resultset
⑤ 取出結果集的數據
⑥ 關閉鏈接,釋放資源
//測試JDBC的CRUD
public class Demo01 {
@Test
public void insert() {
Connection connection = null;
Statement statement = null;
try {
//1.獲取數據庫連接
connection = JDBCUtils.getConnection();
//2.創建statement對象
statement = connection.createStatement();
//3.編寫Sql語句
String sql = "INSERT INTO users(id,NAME,PASSWORD,email,birthday) VALUES(5,'wangwu','123456','[email protected]','1979-12-04');";
//4.執行sql語句
int i = statement.executeUpdate(sql); //返回受影響的行數
} catch (SQLException e) {
e.printStackTrace();
} finally {
//5.釋放資源
JDBCUtils.closeAll(null,statement,connection);
}
}
DriverManager類講解
JDBC程序中的DriverManager用於加載驅動,並創建與數據庫的鏈接,這個API的常用方法:
I. DriverManager.registerDriver(new Driver());
II. DriverManager.getConnection(url, user, password);
注意:在實際開發中並不推薦採用registerDriver方法註冊驅動。
原因有二: I. 查看Driver的源碼可以看到,如果採用此種方式,會導致驅動程序註冊兩次,在內存中會有兩個Driver對象。
II. 程序依賴mysql的api,脫離mysql的jar包,程序將無法編譯,將來程序切換底層數據庫將會非常麻煩。
推薦方式:Class.forName(“com.mysql.jdbc.Driver”); 採用此種方式不會導致驅動對象在內存中重複出現,並且採用此種方式,程序僅僅只需要一個字符串, 不需要依賴具體的驅動,使程序的靈活性更高。
數據庫URL講解
URL用於標識數據庫的位置,通過URL地址告訴JDBC程序連接哪個數據庫,URL的寫法爲:
依次爲 : 協議 + 子協議 + 主機:端口 + 數據庫 + 參數
如果連接的是本地的Mysql數據庫,並且連接使用的端口是3306 那麼的url地址可以簡寫爲: jdbc:mysql:///數據庫
Connection類講解
Jdbc程序中的Connection,它用於代表數據庫的鏈接,Collection是數據庫編程中最重要的一個 對象,客戶端與數據庫所有交互都是通過connection對象完成的。
常用方法:
- createStatement():創建向數據庫發送sql的statement對象。
- prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。
- prepareCall(sql):創建執行存儲過程的callableStatement對象。
- setAutoCommit(boolean autoCommit):設置事務是否自動提交。
- commit() :在鏈接上提交事務。
- rollback() :在此鏈接上回滾事務。
Statement類講解
Jdbc程序中的Statement對象用於向數據庫發送SQL語句
Statement對象常用方法:
- executeQuery(String sql) :用於向數據發送查詢語句。
- executeUpdate(String sql):用於向數據庫發送insert、update或delete語句
- execute(String sql):用於向數據庫發送任意sql語句
- addBatch(String sql) :把多條sql語句放到一個批處理中。
- executeBatch():向數據庫發送一批sql語句執行。
ResultSet類講解
Jdbc程序中的ResultSet用於代表Sql語句的執行結果。
Resultset封裝執行結果時,採用的類似 於表格的方式。ResultSet 對象維護了一個指向表格數據行的遊標,初始的時候,遊標在第一 行之前,調用ResultSet.next() 方法,可以使遊標指向具體的數據行,進行調用方法獲取該行 的數據。
- ResultSet既然用於封裝執行結果的,所以該對象提供的都是用於獲取數據的get方法:
獲取任意類型的數據 : - getObject(int index)
- getObject(string columnName)
獲取指定類型的數據 : - getString(int index)
- getString(String columnName)
ResultSet還提供了對結果集進行滾動的方法:
next():移動到下一行
Previous():移動到前一行
absolute(int row):移動到指定行
beforeFirst():移動resultSet的最前面。
afterLast() :移動到resultSet的最後面。
釋放資源
JDBC程序運行完後,切記要釋放程序在運行過程中,創建的那些與數據庫進行交互的對象,特別是Connection對象,它是非常稀 有的資源,用完後必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機。
- Connection的使用原則是儘量晚創建,儘量早的釋放。
- 爲確保資源釋放代碼能運行,資源釋放代碼也一定要放在finally語句中。
statement對象
- Jdbc中的statement對象用於向數據庫發送SQL語句,想完成對數據庫的增刪改查,只需要通 過這個對象向數據庫發送增刪改查語句即可。
- Statement對象的executeUpdate方法,用於向數據庫發送增、刪、改的sql語句, executeUpdate執行完後,將會返回一個整數(即增刪改語句導致了數據庫幾行數據發生了變化)。
- Statement.executeQuery方法用於向數據庫發送查詢語句,executeQuery方法返回代表查詢 結果的ResultSet對象。
1.CRUD操作-create
Statement st = conn.createStatement();
String sql = "insert into user(….) values(…..) ";
int num = st.executeUpdate(sql);
if(num>0) {
System.out.println("插入成功!!!");
}
2.CRUD操作-update
Statement st = conn.createStatement();
String sql = “update user set name= ' ' where name= ' ' ";
int num = st.executeUpdate(sql);
if(num>0) {
System.out.println(“修改成功!!!");
}
3.CRUD操作-delete
Statement st = conn.createStatement();
String sql = “delete from user where id=1”;
int num = st.executeUpdate(sql);
if(num>0) {
System.out.println(“刪除成功!!!");
}
4.CRUD操作-read
Statement st = conn.createStatement();
String sql = “select * from user where id=1;
ResultSet rs = st.executeQuery(sql);
while(rs.next()) {
//根據獲取列的數據類型,分別調用rs的相應方法映射到java對象中
}
PreparedStatement對象
- PreperedStatement是Statement的子類
- 它的實例對象可以通過調用Connection.preparedStatement()方法獲得,相對於Statement對象 而言:PreperedStatement可以避免SQL注入的問題。
- Statement會使數據庫頻繁編譯SQL,可能造成數據庫緩衝區溢出。PreparedStatement可對 SQL進行預編譯,從而提高數據庫的執行效率。並且PreperedStatement對於sql中的參數, 允許使用佔位符的形式進行替換,簡化sql語句的編寫。