上一次的筆記中已經初步提到了,JDBC連接數據庫的基本六個步驟。
下面就簡單的分析一下JDBC的這六個步驟:
1.獲取連接Connection對象分析
a.獲取數據庫的三大要素
|-- URL:不同的數據庫系統(tǒng)的URL不相同,但是至少有如下的內容:
主協(xié)議:次協(xié)議:HOST(主機):PORT(端口):SID(庫名)
|-- USER:用戶名
|-- PASSWORD:密碼
b.DriverManager獲取連接的原理:
1
//驅動管理器類
2
class 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
/**//*迭代多由的驅動,并且一次與給定的URL進行匹配,如果成功則返回當前驅動的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
/**//*到此都沒有返回,說明沒有匹配成功,則拋出SQLException異常*/
26
throw new SQLException("no suitable driver");
27
}
28
}
2. Statement 調用靜態(tài)SQL
PreparedStatement 來執(zhí)行動態(tài)SQL,可以為SQL動態(tài)綁定參數。
如:同構SQL,SQL內容一樣參數不同。
1
select id,first_name from s_emp
2
where dept_id = ? and name like ?;
3
4
insert into t_user values(?,?,?,?);
5
-- 上面的這些情況就可以用setXXX的方法(綁定參數)來傳參數。
6
-- 例:
7
Connection con = ConnectionFactory.getConnection();
8
String sql = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
9
PreparedStatement pstm = con.PreparedStatement(sql);
10
//綁定參數
11
pstm.setInt(1,XXX);
12
pstm.setString(2,XXX);
13
. . .
3.CallableStatement用來調用存儲過程[procedure]
1
String sql = "{call insert_user(?,?)}"
2
CallableStatement cstm = con.prepareCall(sql);
3
//綁定參數
4
cstm.setString(1,"user");
5
cstm.setString(2,"password");
6
//執(zhí)行過程,此返回值表示受影響的記錄條數
7
int res = cstm.executeUpdate();
8
4.執(zhí)行SQL
1
statement:
2

3
executeQuery(selectSQL); => ResultSet
4
executeUpdate(dmlSQL); => int
5
execute(arbiSQL); => boolean
6

7
if(stm.execute(sql))
{
8
//為真,表示執(zhí)行select語句
9
ResultSet rs = stm.getResultSet();
10
}else
{
11
//為假,表示執(zhí)行非select語句
12
int res = stm.getUpdateCount();
13
}
5.處理結果集
1
ResultSet rs:
2
rs.next(); => boolean用于判斷結果集中是否還有可讀取的元素。
3
rs.getXXX(); get系列方法,用于讀去結果集中的元素。
6.釋放資源
1
Connection.close();
2
Statement.close();
3
ResultSet.close();
My Java study notes.