JDBC (Java Data Base Connectivity, java數據庫連接) 是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。
儘管JDBC在JAVA語言層面實現了統一,但不同數據庫仍舊有許多差異。爲了更好地實現跨數據庫操作,於是誕生了Hibernate項目,Hibernate是對JDBC的再封裝,實現了對數據庫操作更寬泛的統一和更好的可移植性。
創建一個以JDBC連接數據庫的程序,包含7個步驟:
1、加載JDBC驅動程序:
在連接數據庫之前,首先要加載想要連接數據庫的驅動到JVM(Java虛擬機),PostgreSQL數據庫的JDBC庫爲postgresql-(VERSION).jdbc.jar,具體比如postgresql-9.3-1102.jdbc4.jar,在安裝PostgreSQL 9的時候可以選擇下載安裝。
通過java.lang.Class類的靜態方法 forName(String className) 實現。
例如:
Class.forName("org.postgresql.Driver");
注意,方法裏邊單獨這麼寫Eclipse會提示如下,這是throws和throw的區別,兩種拋出異常方法都可以。
採用throw(也就是Surround with try/catch)的完整語句如下
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
加載失敗時(比如沒有引入postgresql-(VERSION).jdbc.jar),控制檯報錯如下
<span style="color:#ff0000;">java.lang.ClassNotFoundException</span>: org.postgresql.Driver
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at jijian.test.dao.BaseDao.getConnection(BaseDao.java:10)
at jijian.test.dao.NewStudentDao.save(NewStudentDao.java:18)
at jijian.test.dao.test.main(test.java:17)
成功加載後,會將Driver類的實例註冊到DriverManager類中。
2、提供JDBC連接的URL
連接URL定義了連接數據庫時的協議、子協議、數據源標識。
書寫形式:協議:子協議:數據源標識
協議:在JDBC中總是以jdbc開始
子協議:橋連接的驅動程序
數據源標識:標記找到數據庫來源的地址與連接端口
例如:(PostgreSQL的連接URL)
String url = "jdbc:postgresql://10.18.11.234:5432/itnms";
3、創建數據庫的連接
要連接數據庫,需要向java.sql.DriverManager請求並獲得Connection對象,該對象就代表一個數據庫的連接。
使用DriverManager的getConnection(String url, String username, String password)方法傳入指定的欲連接的數據庫的路徑、數據庫的用戶名和密碼來獲得。
例如:
String url = "jdbc:postgresql://10.18.11.234:5432/itnms";
String username = "itnms";
String password = "itnms";
try {
Connection con = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
備註:上邊的創建連接的方法可以寫爲
public static Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://10.18.11.234:5432/itnms";
String username = "itnms";
String password = "itnms";
Connection con = DriverManager.getConnection(url, username, password);
return con;
}
4、創建一個Statement
要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分爲以下3種類型:
1、執行靜態SQL語句。通過Statement實例實現。
2、執行動態SQL語句。通過PreparedStatement實例實現。
3、執行數據庫存儲過程。通過CallableStatement實例實現。
5、執行SQL語句
Statement接口提供了三種執行SQL語句的方法:executeQuery、executeUpdate、execute
1、ResultSet executeQuery(String sqlString):執行查詢數據庫的SQL語句,返回一個結果集(ResultSet)對象。
2、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等。
3、boolean execute(String sqlString):用於執行返回多個結果集、多個更新計數或二者組合的語句。
具體實現的代碼:
ResultSet rs = st.executeQuery("SELECT * FROM ...");
int rows = st.executeUpdate("INSERT INTO ...");
boolean flag = st.execute(String sql);
6、處理結果
兩種情況:
1、執行更新返回的是本次操作影響到的記錄數。
2、執行查詢返回的是一個ResultSet對象。
ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些行中數據的訪問。
使用結果集(ResultSet)對象的訪問方法獲取數據:
while(rs.next()) {
String name = rs.getString("name");
String pass = rs.getString(1); //此方法比較高效
//列是從左到右編號的,並且從列1開始
}
7、關閉JDBC對象
操作完成以後要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲明順序相反:
1、關閉記錄集
2、關閉聲明
3、關閉連接
如下:
public static void close(ResultSet rs, Statement st, Connection con) throws SQLException {
if(rs != null) {
rs.close();
}
if(st != null) {
st.close();
}
if(con != null) {
con.close();
}
}