JDBC開發
JDBC開發
JDBC是SUN公司為統一對數據庫的操作,定義的一套Java操作數據庫的規范。
JDBC全稱為:Java DataBase Connectivity(java數據庫連接),它主要由接口組成。
組成JDBC的2個包:
java.sql
javax.sql
開發JDBC應用需要以上2個包的支持外,還需要導入相應JDBC的數據庫實現(即數據庫驅動)。
用jdbc連接數據庫的操作步驟:
一、搭建實驗環境:
二、編寫程序,在程序中加載數據庫驅動
Class.forName(“com.mysql.jdbc.Driver”);
DriverManager.registerDriver(Driver driver)
三、建立連接(Connection)
Connection conn =DriverManager.getConnection(url,user,pass);
四、創建用于向數據庫發送SQL的Statement對象,并發送sql
Statement st =conn.createStatement();
ResultSet rs = st.excuteQuery(sql);
五、從代表結果集的ResultSet中取出數據,打印到命令行窗口
六、斷開與數據庫的連接,并釋放相關資源
注意:
Jdbc程序中的DriverManager用于加載驅動,并創建與數據庫的鏈接,這個API的常用方法:
DriverManager.registerDriver(new Driver()),注意:在實際開發中,并不推薦采用這個方法注冊驅動。查看Driver的源代碼可以看到,如果采用此種方式,會導致驅動程序注冊兩次,也就是在內存中會有兩個Driver對象。
推薦方式:Class.forName(“com.mysql.jdbc.Driver”);采用此種方式不會導致驅動對象在內存中重復出現,并且采用此種方式,程序僅僅只需要一個字符串,不需要import驅動的API,這樣可使程序不依賴具體的驅動,使程序的靈活性更高。
DriverManager.getConnection(url, user, password),根據url獲取數據庫的鏈接。
URL用于標識數據庫的位置,程序員通過URL地址告訴JDBC程序連接哪個數據庫
常用數據庫URL地址的寫法:
? Oracle寫法:jdbc:oracle:thin:@localhost:1521:sid
? SqlServer—jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=sid
? MySql—jdbc:mysql://localhost:3306/sid
Mysql的url地址的簡寫形式: jdbc:mysql:///sid
常用屬性:useUnicode=true&characterEncoding=UTF-8
Jdbc程序中的Connection,它用于代表數據庫的鏈接,Collection是數據庫編程中最重要的一個對象,客戶端與數據庫所有交互都是通過connection對象完成的,這個對象的常用方法:
? createStatement():創建向數據庫發送sql的statement對象。
? prepareStatement(sql):創建向數據庫發送預編譯sql的PrepareSatement對象。
? prepareCall(sql):創建執行存儲過程的callableStatement對象。
? setAutoCommit(boolean autoCommit):設置事務是否自動提交。
? commit():在鏈接上提交事務。
? rollback():在此鏈接上回滾事務。
Jdbc程序中的Statement對象用于向數據庫發送SQL語句, Statement對象常用方法:
? execute(String sql):用于向數據庫發送任意sql語句
? executeQuery(String sql):只能向數據發送查詢語句。
? executeUpdate(String sql):只能向數據庫發送insert、update或delete語句
? addBatch(String sql):把多條sql語句放到一個批處理中。
? executeBatch():向數據庫發送一批sql語句執行。
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程序運行完后,切記要釋放程序在運行過程中,創建的那些與數據庫進行交互的對象,這些對象通常是ResultSet, Statement和Connection對象。
特別是Connection對象,它是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機。Connection的使用原則是盡量晚創建,盡量早的釋放。
為確保資源釋放代碼能運行,資源釋放代碼也一定要放在finally語句中。
這里,有一個完整的使用JDBC進行數據庫操作的程序以便大家理解使用JDBC操作數據庫的過程:
package csdn.java.thread; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo { /** * @param args */ publicstatic void main(String[] args) { Connectioncon = null; Statementst = null; ResultSetrs = null; Stringdriver ="com.mysql.jdbc.Driver"; Stringurl = "jdbc:mysql://localhost:3306/jdbc"; Stringpassword ="root"; Stringuser ="root"; try{ //加載驅動 Class.forName(driver); }catch (ClassNotFoundException e) { //TODO Auto-generated catch block e.printStackTrace(); } try{ //創建連接 con= DriverManager.getConnection(url, user, password); //創建語句對象 st= con.createStatement(); //創建sql語句 Stringsql = "select _id,name,sex,age from users"; //執行語句 rs= st.executeQuery(sql); //遍歷結果集 while(rs.next()){ intid = rs.getInt("_id"); Stringname = rs.getString("name"); Stringsex = rs.getString("sex"); intage = rs.getInt("age"); System.out.println(id+"..."+name+"..."+sex+"..."+age); } }catch (SQLException e) { //TODO Auto-generated catch block e.printStackTrace(); }finally{ if(!(rs==null)){ try{ rs.close(); }catch (SQLException e) { //TODO Auto-generated catch block e.printStackTrace(); } } if(!(st==null)){ try{ st.close(); }catch (SQLException e) { //TODO Auto-generated catch block e.printStackTrace(); } } if(!(con==null)){ try{ con.close(); }catch (SQLException e) { //TODO Auto-generated catch block e.printStackTrace(); } } } } }