案例1:使用JDBC訪問Oracle資料庫1
一. 在java工程的src目錄下建立一個配置檔案 info.properties (注意:1.字尾名不要寫錯;2.檔案放在src目錄下,不要弄錯),在這個檔案中寫入如下程式碼。
//info.properties
driverClass=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=scott
password=tiger
oracle.jdbc.driver.OracleDriver:Oracle為開發人員提供的註冊的驅動類,不會載入的朋友請看我上一篇或上上篇文章。
jdbc: oracle:thin: @localhost:1521: orcl
協議 子協議 IP :埠號 資料庫
寫這個檔案的時候,我犯的錯誤是:url是憑我記憶賦值的,其中少寫了埠號 ,導致一開始就連線不上資料庫。
二:1.建立一個jdbcUtil類,在這個類裡將連線資料庫的引數從info.properties 檔案資料在靜態塊中載入進來,然後通過Class.forName()將DriverManager類載入到記憶體,然後通過getConnection()函式生成連線物件並返回,這裡的ResourceBundle類對於載入property型別的資料非常方便,建議使用。
2.然後寫一個closeAll()函式,用於將資源進行回收釋放。注意:這個函式首先判斷各引數是否為null,然後再呼叫其自身的close()函式並丟擲異常。
package jdbcCRUD; 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.ResourceBundle; public class jdbcUtil { private static String driverClass; private static String url; private static String user; private static String password; static{ ResourceBundle rb=ResourceBundle.getBundle("info"); driverClass=rb.getString("driverClass"); url=rb.getString("url"); user=rb.getString("user"); password=rb.getString("password"); try { Class.forName(driverClass); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws Exception{ Connection conn=DriverManager.getConnection(url,user,password); return conn; } public static void closeAll(ResultSet rs,PreparedStatement ps,Connection conn){ if(rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs=null; } if(ps!=null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } rs=null; } if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn=null; } } }
三. 由於這裡一個類對應於Oracle中的一張表,其引數名跟引數數量要保持一致,不易出錯。為簡單期間,這裡建立一個Department 類,對應於scott使用者下的dept表,因為其列只有三個,比較簡單。
這裡定義了三個變數,分別對應於表中的一列,並設定其get和set方法,方便賦值,並生成了toString()方法,方便列印。
package jdbcCRUD;
public class Department {
private int deptno;
private String dname;
private String loc;
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
@Override
public String toString() {
return "Department [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc
+ "]";
}
}
四.最後建立jdbcDao類,dao的意思是資料庫訪問物件(database access object) 。在這個類裡,首先利用jdbcUtil類的靜態函式獲得connection介面,然後獲得操作資料庫的PreparedStatement介面,然後利用ResultSet介面接收查詢到的記錄。
這裡最好不要用Statement介面,因為會有sql反射注入的問題,與之相比,PreparedStatement介面就不會有這個問題,而且更安全。 最後一定要記得關閉釋放資源,因為如果不關閉釋放資源,資料庫將一直處於連線狀態,別的使用者將無法訪問資料庫。
寫這個程式的時候,我忘記呼叫ResultSet 的next()方法了,失誤。
package jdbcCRUD;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
public class jdbcDao {
public static void main(String[] args) throws Exception {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
conn=jdbcUtil.getConnection();
ps=conn.prepareStatement("select DEPTNO,DNAME,LOC from dept where DNAME=? ");
ps.setString(1, "SALES");
rs=ps.executeQuery();
rs.next();
Department dept=new Department();
dept.setDeptno(rs.getInt("deptno"));
dept.setDname(rs.getString("dname"));
dept.setLoc(rs.getString("loc"));
System.out.println(dept);
jdbcUtil.closeAll(rs, ps, conn);
}
}