下面就簡(jiǎn)單的分析一下JDBC的這六個(gè)步驟:
1.獲取連接Connection對象分析
a.獲取數據庫的三大要素
|-- URL:不同的數據庫系統的URL不相同,但是至少有如下的內容:
主協(xié)議:次協(xié)議:HOST(主機):PORT(端口):SID(庫名)
|-- USER:用戶(hù)名
|-- PASSWORD:密碼
b.DriverManager獲取連接的原理:
1//驅動(dòng)管理器類(lèi)
2class DriverManager{
3 static Vector<Driver> drivers = new Vector<Driver>();
4 public static void registerDriver(Driver d){
5 driver.add(d);
6 }
7/** *//**獲取連接的方法*/
8 public static Connection getConnection(String url,String user,String pwd) throws SQLException{
9 Properties info = new Properties();
10 info.setProperty("user",user);
11 info.setProperty("password",pwd);
12 return getConnection(url,info);
13 }
14 public static Connection getConnection(String url,Properties info)throws SQLException{
15/**//*迭代多由的驅動(dòng),并且一次與給定的URL進(jìn)行匹配,如果成功則返回當前驅動(dòng)的Connection對象*/
16 Iterator<Driver> iter = drivers.iterator();
17 while(iter.hasNext()){
18 Driver d = iter.next();
19 if(匹配(url,d)){
20 return d.connect(url,info);
21 }else{
22 continue;
23 }
24 }
25/**//*到此都沒(méi)有返回,說(shuō)明沒(méi)有匹配成功,則拋出SQLException異常*/
26 throw new SQLException("no suitable driver");
27 }
28} 2. Statement 調用靜態(tài)SQL
PreparedStatement 來(lái)執行動(dòng)態(tài)SQL,可以為SQL動(dòng)態(tài)綁定參數。
如:同構SQL,SQL內容一樣參數不同。
1select id,first_name from s_emp
2where dept_id = ? and name like ?;
3
4insert into t_user values(?,?,?,?);
5-- 上面的這些情況就可以用setXXX的方法(綁定參數)來(lái)傳參數。
6-- 例:
7Connection con = ConnectionFactory.getConnection();
8String sql = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
9PreparedStatement pstm = con.PreparedStatement(sql);
10//綁定參數
11pstm.setInt(1,XXX);
12pstm.setString(2,XXX);
13. . . 3.CallableStatement用來(lái)調用存儲過(guò)程[procedure]
1String sql = "{call insert_user(?,?)}"
2CallableStatement cstm = con.prepareCall(sql);
3//綁定參數
4cstm.setString(1,"user");
5cstm.setString(2,"password");
6//執行過(guò)程,此返回值表示受影響的記錄條數
7int res = cstm.executeUpdate();
8 4.執行SQL
1statement:
2
3 executeQuery(selectSQL); => ResultSet
4 executeUpdate(dmlSQL); => int
5 execute(arbiSQL); => boolean
6
7 if(stm.execute(sql)){
8 //為真,表示執行select語(yǔ)句
9 ResultSet rs = stm.getResultSet();
10 }else{
11 //為假,表示執行非select語(yǔ)句
12 int res = stm.getUpdateCount();
13 } 5.處理結果集
1ResultSet rs:
2 rs.next(); => boolean用于判斷結果集中是否還有可讀取的元素。
3 rs.getXXX(); get系列方法,用于讀去結果集中的元素。 6.釋放資源
1Connection.close();
2Statement.close();
3ResultSet.close();