1. 程式人生 > >案例1:使用JDBC訪問Oracle資料庫1

案例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);
		
	}
		
		
}