資料庫存取方式
大致上可分成下面6個步驟
- 將資料庫驅動程式載入JVM
- 建立Connection物件
- 撰寫SQL
- 建立PreparedStatement物件,設定參數
- 執行SQL,取得資料
- 關閉連線及資料庫連線
範例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// 1.將資料庫驅動程式載入JVM
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 2.建立Connection物件
String url = "jdbc:oracle:thin:@10.100.2.30:1521:pstest";
String user = "test";
String password = "test";
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
// exit system if no connection object
}
// 3.撰寫SQL
String sql = "select * from users where userid = ?";
try {
// 4. 建立PreparedStatement,設定參數
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "A12345678");
// 5. 執行SQL取得資料
ResultSet rs = ps.executeQuery();
if (rs.next()) {
System.out.println(rs.getString("name"));
}
// 6. 關閉連線
rs.close();
ps.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
幾點注意一下
- 一個 try…catch 只對應一個例外情況,或者會造成相同類型的例外才包裹在一起,例如當Class.forName在物件載入JVM時有可能會發生ClassNotFoundException,那麼單獨對此行程式進行catch即可。try…catch內如果有太多的程式,那當錯誤發生時很難看出錯誤的位置,也會失去原本try…catch的本意。
- 執行SQL的物件有Statement及PreparedStatement,後者可防止SQL injection的情況,不過要撰寫的程式碼會比較多,兩者可以交替使用。若使用PreparedStatement,參數型態為字串時,不必在SQL內特別加上引號,用setString時就會自動補上。setXXXXX型態的index從 1 開始。
