序言
資料庫,程式員永遠要面對的開發環節。其重要性不言而喻。我從學習vb,delphi,再到java,資料庫的技術接踵而至,odbc,ado,bde,jdbc,jdo,hibernate,還有好多吧。記得圖形化編程中,多半使用控制項開發,比如datasource,非常方便。而Java什麼都是class的風格,在資料庫上依然體現得淋漓盡致。
我從今天開始要邊學這些資料庫技術,邊寫些筆記。今天推出最熟悉的JDBC
一 JDBC(Java DataBase Connectivity)
在物件導向的資料庫面前,JDBC是不是老了?我們今天還有必要學習JDBC嗎?作為新人的你也許會這麼問。首先,關係型資料庫的資格和輩分在江湖上無人能撼動,就算它吃老本兒也要些許年,而我們現在要用資料庫,這是事實。其次JDBC在訪問關係型資料庫的技術中,是出色的一個傢伙。因為它不僅可以支援我們經常用到的那些種類繁多的資料庫(即與供應商無關),而且還可以實現跨平台開發(即與平台無關)。
最重要的是,JDBC開發很簡單,也很普遍。
不同的資料庫廠商為JDBC提供了特定的驅動,因此,我們開始jdbc的第一步就是面對Driver的開發。
JDBC Drever--DriverManager
裝載:
1 使用 -Dproperty=value參數傳遞命令列選項給Java應用程式
Java -Djdbc.drivers=jdbc.odbc.JdbcOdbcDriver queryDB
2 使用Class類的靜態方法forName()
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“);
Class.forName(”COM.imaginary.sql.msql.MsqlDriver”); //mSQL
註冊:
Oracle Driver例子
Class.forName(“oracle.jdbc.driver.OracleDriver“);
java.sql.DriverManager.registerDriver(new oracle.jdbc.driverOracleDriver());
開啟:
Connection DriverManager.getConnection(url,userid,password);
con.close();
url的一般形式:jdbc:適當子協議://驅動程式特定的組件(機器名、連接埠、資料庫名稱);
jdbc:適當子協議:@驅動程式特定的組件(機器名、連接埠、資料庫名稱);
擷取資料:
String sql=“select * from onetable“;
Statement statement=con.createStatement();
ResultSet results=statement.executeQuery(sql);
statement.colse();
擷取動態SQL資料::
Stringsql=select name from idtable where id=?”;
PreparedStatement prepStatement=con.prepareStatement(sql);
prepStatement.setString(1,a_id);
ResultSet rs=prepStmt.executeQuery();
RowSet獨立處理問題:
String sql=“select * from onetable“;
RowSet rs=new CachedRowSet(); //JDBCRowSet 需要和資料庫永久串連,CachedRowSet不需要
rs.setCommand(sql);
rs.setUrl(url);
rs.setUsername(userid);
rs.setPassword(password);
rs.execute();
...
rs.close();
結果集ResultSet 是否可以滾動:
由DatabaseMetaData對象決定所用的JDBCs是否支援可滾動ResultSet,它的一個方法supportsReseltSetType用來測試:
DatabaseMetaData dbMD=connection.gtMetaData();
Boolean okiedoie=md.supportsResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE);
if (okiedoie){
Statement statement=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
}
TYPE_SCROLL_SENSITIVE表示ResultSet可滾動並對其它對象引起的資料庫變化敏感
CONCUR_UPDATABLE表示ResultSet可以在結果集中被更新
JDBC中繼資料
中繼資料是關於資料的資料。
DatebaseMetaData對象能夠提供關於特定資料庫的結構的資訊。
ResultSetMetaData
JDBC資料來源
使用Driver方式開發時,url是寫死的,給維護帶來許多不便。為瞭解決這一問題,JDBC2.0採用了利用JNDI映射實際資料來源--DataSource的方式。
在接觸資料來源之前,先來介紹一下JNDI吧。
JNDI全稱 Java Naming and Directory Interface。是為標準化對目錄和命名服務的訪問而設計的。
這些服務包括:NIS/NIS+,LDAP(Lightweight Directory Access Protocol),RMI(Java Remote Method Invocation)的reiregistry,CORBA Common Object Service(COS)名字服務 NDS、DNS、Windows註冊表等等
命名服務(naming service)是電腦系統中的一個準系統。命名服務是將名字和電腦中的一個對象相關聯,通過名字可以方便地找到對應的對象。例如,電腦中的檔案系統就包含了一個命名服務,你可以通過檔案名稱找到對應的檔案對象。
目錄服務(directory service)是命名服務的延伸,目錄服務不只儲存對象和對象名的匹配,而且儲存這個對象的各種屬性,你可以對這些屬性進行查詢、修改、增加、刪除操作。
JNDI結構包括兩組API:
JNDI API(Application Programming Interface),Java應用程式通過JNDI API訪問各種命名目錄服務。
JNDI SPI(Service Provider Interface),JNDI SPI使得各種命名目錄服務透明地加入到JNDI結構中。
JNDI Context
Context是一系列命名到對象綁定的集合,它提供瞭解析(即返回對象的尋找操作)。其他動作包括:名稱的綁定和取消綁定,列出綁定的名稱。注意到一個內容物件的名稱可以綁定到有同樣的命名規範的另一個內容物件。這稱之為子上下文。Context提供以下主要介面訪問命名服務:
bind(Name name, Object obj) 建立一個命名到一個對象的匹配關係,也叫綁定
lookup(String name) 通過命名尋找其對應的對象
rebind(Name name, Object obj) 重新綁定一個命名到對象,覆蓋原來的綁定
unbind(Name name) 解除這個命名到其匹配對象的綁定關係
... ...
為了用名稱從命名服務或目錄中取得或解析對象,使用Context的lookup方法:
Object obj=contxt.lookup(name)。
JDBC資料來源--DataSource
配置資料來源(Tomcat為例)
server.xml:
<Context path= docBase= debug= reloadable=>
<Resource name=JNDI名 auth=Container或Application type= 類名/> <!--Container-容器管理 Application-Web應用管理-->
<ResoureParams name=JNDI名 >
<parameter>
<name>username</name>
<value>Eric Han</value>
</parameter>
...
</ResoureParams>
</Context>
web.xml:
<resource-ref>
<descrtiption>引用資源說明</descrtiption>
<res-ref-name>引用資源的JNDI名</res-ref-name>
<res-type>引用資源的類名</res-type>
<res-auth>管理者</res-auth><!--Container-容器管理 Application-Web應用管理-->
</resource-ref>
訪問資料來源
Context ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup(”jdbc/one_mapping”);
Connection con=ds.getConnection();