轉(zhuǎn)載請(qǐng)注明出處:
http://www.blogjava.net/nake/
???自從
?
java
?
發(fā)布的第一個(gè)版本開(kāi)始就已經(jīng)包含
?
JDBC
?
了。目前已經(jīng)有
?
10
?
個(gè)年頭了。
?
JDBC4.0
將要被打包到
?
java6.0
?
里(
?
java SE?
是
?
J2SE
?
新的名字)。它展現(xiàn)設(shè)計(jì)的重大提升和提供更加豐富的
?
API
?
,更加重視簡(jiǎn)易開(kāi)發(fā)和提高生產(chǎn)力
?
。
??????? 本文將討論一些 ? JDBC ? 在改善設(shè)計(jì)和提高性能上的重要的變化。但是不能列舉每一個(gè)變化。
注解和泛型
我想你已經(jīng)了解了包含在 ? JAVA 5.0? 的注解( ? annotations ? ) ? 和泛型( ? generic? 也有翻譯范型)。 ? JDBC4.0 ? 也引進(jìn)了注解和泛型 ? DataSet ? ,這使得執(zhí)行 ? sql ? 語(yǔ)句和 ? SQL ?? DML ? ( ? data manipulation ?? language ? ) ? 定義變的簡(jiǎn)單。
??????? 在新的 ? API ? 里定義了一套 ? Query ? 和 ? DataSet ? 接口。 ? Query ? 接口定義了一套方法,這些方法描述了 ? SQL ? 的 ? select? 和 ? update ? 語(yǔ)句。而且詳細(xì)介紹了結(jié)果集如何綁定為一個(gè) ? DataSet ? 的。因?yàn)榉盒退? ? DataSet ? 是可以帶參數(shù)的。因此可以說(shuō) ? DataSet ? 接口是類型安全的( ? type-saft ? ) .
所有
?
Query
?
接口都要從
?
BaseQuery
?
接口繼承。可以通過(guò)
?
Connection.createQueryObject()
?
或者
?
DataSource.createQueryObject()
?
得到
Query
對(duì)象。
一個(gè)
DataSet
接口都繼承
java.util.List
。
?
??
DataSet
?
是有列概念的數(shù)據(jù)集,能從
?
Query
?
接口得到,并且可以帶有參數(shù)。
?
DataSet
?
可以在連接和斷開(kāi)連接的情況下使用。從而
?
DataSet
實(shí)現(xiàn)了
?
ResultSet
?
(連接)
?
或者
?
??
CachedRowSet
?
(可以斷開(kāi)連接)。因?yàn)?
DataSet
是
java.util.List
的子接口,所以可以通過(guò)
java.util.Iterator
來(lái)訪問(wèn)每一行。
DataSet
?
接口可以帶系統(tǒng)或者用戶自己定義的類作為參數(shù)。通過(guò)兩種方法你可以實(shí)現(xiàn):構(gòu)造函數(shù)或者
?
JavaBeans?
對(duì)象,任何一個(gè)辦法都能達(dá)到將用戶自定義的類綁定到結(jié)果集的列里。但是在其它支持
?
JavaBeans
?
的框架里,用
?
JavaBeans?
對(duì)象的實(shí)現(xiàn)就顯更加容易使用。
下面簡(jiǎn)單舉例說(shuō)明如何通過(guò)新的 ? API ? 創(chuàng)建和運(yùn)行 ? SQL? 查詢。用用戶自定義的類來(lái)定義結(jié)果集。(拷貝時(shí)候小心有制表符)
pubic class Employee {
?
?? private int employeeId;
?
?? private String firstName;
?
?? private String lastName;
?
?? public int getEmployeeId() {
?
??????return employeeId;
?
?? }
?
???
?? public setEmployeeId(int employeeId) {
?
??????this.employeeId = employeeId;
?
?? }
?
?? public String getFirstName() {
?
??????return firstName;
?
?? }
?
?? public setFirstName(String firstName) {
?
??????this.firstName = firstName;
?
?? }
?
?? pubic String lastName() {
?
??????return lastName;
?
?? }
?
?? public setLastName(String lastName) {
?
??????this.lastName = lastName;
?
?? }
?
}
interface EmployeeQueries extends BaseQuery {
?
?? @Select (sql="SELECT employeeId, firstName, lastName FROM employee")
?
?? DataSet<Employee> getAllEmployees ();
?
?? @Update (sql="delete from employee")
?
?? int deleteAllEmployees ();
?
}
?
Connection con = ...
?
EmployeeQueries empQueries = con.createQueryObject (EmployeeQueries.class);
?
DataSet<Employee> empData = empQueries.getAllEmployees ();
?
異常處理的增強(qiáng):
1. ??????? 為 ? SQLException ? 分為兩類? transient? 和 ? non-transient ? 。
2. ??????? 支持連鎖的異常。
3. ??????? 繼承了 ? Iterable ? 接口。
因?yàn)槔^承了 Iterable? 所以你可以這樣寫(xiě):
catch(SQLException ex) {
?
?? for(Throwable t : ex) {
?
??????System.out.println("exception:" + t);
?
?? }
?
}
?
?
最后,注:hibernate 3.5已經(jīng)添加了對(duì)JDBC4的支持
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
