您好,登錄后才能下訂單哦!
一、JDBC簡介
JDBC,Java Ddatabase Connection,Java數據庫連接。
Sun公司為了簡化、統一對數據庫的操作,定義了一套Java操作數據庫的規范,稱之為JDBC。
什么是驅動?兩個設備要進行通信,滿足一定通信數據格式,數據格式由設備提供商規定,設備提供商為設備提供驅動軟件,通過軟件可以與該設備進行通信。
如果沒有JDBC,Java程序員需要面向各個數據庫驅動接口編程,開發復雜;sun公司提供一套統一JDBC接口規范,Java程序只需要使用JDBC就可以操作任何數據庫,JDBC實現類由各個數據庫廠商提供。
1.組成JDBC的2個包:java.sql和javax.sql。
DriverManger驅動管理類、Connection連接接口、Statement(PreparedStatement、CallableStatement)數據庫操作、ResultSet結果集。
2.開發jdbc應用需要以上2個包外,還需要導入相應JDBC的數據庫實現。
二、JDBC快速入門
創建一個user表
create table user( id int primary key auto_increment, username varchar(20) unique not null, password varchar(20) not null, email varchar(40) not null );
package cn.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import com.mysql.jdbc.Driver; public class Test1 { public static void main(String[] args) throws Exception { //加載數據庫驅動 DriverManager.registerDriver(new Driver()); //獲取連接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //創建用于向數據庫發送SQL的Statement對象,并發送SQL Statement stat = conn.createStatement(); //從結果集中取出數據 String sql = " select * from user "; ResultSet rs = stat.executeQuery(sql); while(rs.next()){ System.out.println(rs.getInt(1)+","+rs.getString(2)+","+rs.getString(3)+","+rs.getString(4)); } //斷開數據庫的連接,并釋放相關資源 rs.close(); conn.close(); } }
三、JDBC編程步驟
四、JDBC訪問數據庫的流程
五、JDBC API詳解
5.1DriverManager類
jdbc程序中的DriverManager用于加載驅動,并創建和數據庫的連接,這個API的常用方法:
DriverManager.registerDriver(new Driver); DriverManager.getConnection(url,username,password);
注意,在實際開發中并不推薦采用registerDriver方法注冊驅動,原因有二:
1)查看Driver的源代碼可以看出,如果采用此種方式,會導致驅動程序注冊兩次,也就是在內存中會有兩個Driver對象。
package com.mysql.jdbc; import java.sql.DriverManager; import java.sql.SQLException; public class Driver extends NonRegisteringDriver implements java.sql.Driver { static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } }
2)程序依賴MySQL的API,脫離MySQL的jar包,程序將無法編譯,將來程序切換底層數據庫將會非常麻煩。
推薦方式:class.forName("com.mysql.jdbc.Driver");
采用此種方式不會導致驅動對象在內存中重復出現,并且采用此種方式,程序僅僅只需要一個字符串,不需要依賴具體的驅動,使得程序的靈活性更高。
同樣,在開發中也不建議采用具體的驅動類型指向getConnection方法返回的Connection對象。
5.2數據庫URL
URL用于標識數據庫的位置,程序員通過URL地址告訴JDBC程序連接那個數據庫,URL的寫法為:
常用數據庫URL的地址的寫法:
oracle jdbc:oracle:thin:@localhost:1521:sid mysql jdbc:mysql://localhost:3306/sid
常用屬性:useUnicode=true&characterEncoding=UTF-8
5.3Connection連接接口
應用一:獲取SQL的操作對象
Statement stat = conn.createSteatement() 該對象可以將SQL發送給數據庫進行執行
PreparedStatement pstmt = conn.prepareStatement(String sql) 對SQL語句進行預編譯,防止SQL注入
CallableStatement cstmt = conn.prepareCall(String sql) 該對象可以調用數據庫中存儲過程
應用二:對數據庫事務進行管理
conn.setAutoCommit(boolean flag) 設置事務是否自動提交
conn.commit() 提交數據庫事務
conn.rollback() 回滾數據庫事務
5.4Statement 用于將SQL發送給數據庫,獲取操作結果
jdbc程序中的Statement對象用于向數據庫發送SQL語句,Statement對象常用方法::
executeQuery(String sql) 用于向數據發送查詢語句
executeUpdate(String sql) 用于向數據庫發送insert、update或delete語句
execute(String sql) 用于向數據庫發送任意SQL語句
addBatch(String sql) 把多條SQL語句放到一個批處理中
executeBatch() 向數據庫發送批處理執行
5.5ResultSet
jdbc程序中采用的ResultSet用于代表SQL語句的執行結果。ResultSet封裝執行結果的時候,采用類似于表格的方式。ResultSet對象維護了一個指向表格數據行的游標,初始化的時候,游標在第一行之前,調用next()方法,可以使得游標指向具體的數據行,進而調用方法獲取該行數據。
resultSet既然用于封裝執行結果,所以該對象提供的大部分方法都是用獲取數據的get方法:
獲取任意類型的數據
getObject(int index) getObject(String columnName)
獲取指定類型的數據
getString(int index) getString(String columnName)
5.6釋放資源
jdbc程序運行完畢后,切記要釋放程序在運行過程中,創建的那些與數據庫進行交互的對象,這些對象通常是ResultSet、Statement和Connection對象。
特別是Connection對象,它是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機。Connection的使用原則是盡量晚創建,盡量早的釋放。
為確保資源釋放代碼能運行,資源釋放代碼也一定要放在finally語句中。
六、JDBC完成CRUD示例
增加:
private static void create() throws Exception { //加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取連接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //創建用于向數據庫發送SQL的Statement對象,并發送SQL Statement stat = conn.createStatement(); String sql = " insert into user (username,password,email) values('哈哈','haha','hah@163.com') "; int rows = stat.executeUpdate(sql); if(rows > 0){ System.out.println("執行增加完畢"); } //斷開數據庫的連接,并釋放相關資源 conn.close(); }
刪除
private static void delete() throws Exception { //加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取連接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //創建用于向數據庫發送SQL的Statement對象,并發送SQL Statement stat = conn.createStatement(); String sql = " delete from user where username = '哈哈'; "; int rows = stat.executeUpdate(sql); if(rows > 0){ System.out.println("執行刪除完畢"); } //斷開數據庫的連接,并釋放相關資源 conn.close(); }
修改
private static void update() throws Exception { //加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取連接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //創建用于向數據庫發送SQL的Statement對象,并發送SQL Statement stat = conn.createStatement(); String sql = " update user set email = '123@163.com' where id = 1 "; int rows = stat.executeUpdate(sql); if(rows > 0){ System.out.println("執行修改完畢"); } //斷開數據庫的連接,并釋放相關資源 conn.close(); }
查詢
//加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取連接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root"); //創建用于向數據庫發送SQL的Statement對象,并發送SQL Statement stat = conn.createStatement(); //從結果集中取出數據 String sql = " select * from user "; ResultSet rs = stat.executeQuery(sql); while(rs.next()){ System.out.println(rs.getInt(1)+","+rs.getString(2)+","+rs.getString(3)+","+rs.getString(4)); } //斷開數據庫的連接,并釋放相關資源 rs.close(); conn.close();
七、DAO模式
DAO模式(Data Access Object 數據庫訪問對象),在持久成通過DAO將數據源操作完全封裝起來,業務層通過Java對象,完成對數據源操作。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。