摘要:目前數據庫的應用非常普遍,在應用程序的開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì )涉及到訪(fǎng)問(wèn)數據庫。Java使用JDBC技術(shù)進(jìn)行數據庫的訪(fǎng)問(wèn)。查詢(xún)是數據庫的操作中較為頻繁的一種操作,返回的結果有時(shí)可能是很多條記錄的結果集,用戶(hù)在瀏覽和處理時(shí)不方便,常常會(huì )用到分頁(yè)處理功能。
關(guān)鍵詞:JDBC數據庫;驅動(dòng)程序;結果集
中圖分類(lèi)號:TP311文獻標識碼:A文章編號:1009-3044(2007)06-11511-01
1 JDBC技術(shù)
JDBC(Java Database Connectivity)是Sun提供的一套數據庫編程接口A(yíng)PI函數,由Java語(yǔ)言編寫(xiě)的類(lèi)和接口組成。JDBC為數據庫開(kāi)發(fā)人員提供了一個(gè)標準的API,使用Java編程語(yǔ)言和JDBC結合編寫(xiě)的應用程序,無(wú)須考慮要為不同的平臺編寫(xiě)不同的應用程序。真正實(shí)現“Write Once,Run Everywhere!”。
2 JDBC編程實(shí)現
使用JDBC技術(shù)進(jìn)行數據庫訪(fǎng)問(wèn)時(shí),Java應用程序通過(guò)JDBC API和JDBC驅動(dòng)程序管理器之間進(jìn)行通信,JDBC驅動(dòng)程序管理器以?xún)煞N方式和最終的數據庫進(jìn)行通信:一是使用JDBC-ODBC橋驅動(dòng)程序的間接方式,另一種是使用JDBC驅動(dòng)程序的直接方式。
下面以JDBC驅動(dòng)程序的直接方式為例,說(shuō)明Java語(yǔ)言與SQL Server2000連接的JDBC編程的全過(guò)程:
(1)加載驅動(dòng)程序
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
(2)通過(guò)DriverManager到得一個(gè)與數據庫連接的句柄
private static String url="jdbc:microsoft:sqlserver://localhost:1433;databasename=xxxx ";
Connection con = DriverManager.getConnection(url, user,password);
(3)通過(guò)連接句柄綁定要執行的語(yǔ)句
Statement stmt = con.createStatement();
(4)接收執行結果
ResultSet rs=stmt.executeQuery(sql);
或ResultSet rs=stmt.executeUpdate(sql);
(5)對結果進(jìn)行處理
調用get XXX()方法對獲取結果中的值。
(6)關(guān)閉與數據庫的連接
rs.close();
stmt.close();
con.close();
3 JDBC編程結果集分頁(yè)顯示
在ResultSet類(lèi)中提供了一套數據的分頁(yè)處理功能。
3.1 技術(shù)要點(diǎn)
(1)createStatement()方法:
public Statement createStatement()
獲取默認連接聲明,沒(méi)有指針操作
public Statement createStatement(int resultSetType,int resultSetConcurrency)
resultSetType決定結果集類(lèi)型的滾動(dòng)方式,它的取值為:ResultSet.TYPE_FORWARD_ONLY、Result.TYPE_SCROLL_INSENSITIVE和ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency決定是否可以用結果集更新數據庫。它的取值為:Result.CONCUR_READ_ONLY 、Result.CONCUR_UPDATETABLE
(2)ResultSetMetaData結果集元對象類(lèi)
結果集元數據通過(guò)使用getMetaData()來(lái)獲得結果集元對象。ResultSetMetaData結果集元對象類(lèi)的方法:
getColumnCount()
getColumnName(int index)
getColumnTypeName(int index)
3.2 建立數據庫
在SQL Server 2000下建立一個(gè)名為book的數據庫,在book數據庫下建立一個(gè)圖書(shū)信息表bookInfo,表的結構為:bookInfo(no,bookname,author,price,public)
3.3 Java源程序
為了使得程序具有一定的通用性和靈活性,將要顯示的號碼和每頁(yè)的大?。宽?yè)的記錄數)由命令行輸入。即命令行參數arg[0]代表pageno,參數arg[1] 代表pagesize。源程序JDBCScrollDisplay.java如下:
import java.sql.*;
public class JDBCScrollDisplay{
private static String url="jdbc:microsoft:sqlserver://localhost:1433;databasename=book";
private static String username="sa";
private static String password="sa";
public Connection conn(){
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection(url, username, password);
return con;
}
catch(SQLException e1){
System.out.println("can't connection db:"+e1);
return null;
}
catch (Exception e2) {
System.out.println("Failed to load JDBC driver.");
return null;
}
}
public void query(Connection con, String sql,int pageNo,int pageSize){
try{
if(con==null){
throw new Exception("database connection can't use!");
}
if(sql==null){
throw new Exception("check your parameter: 'sql'! don't input null!");
}
int rowCount; //記錄總數
int pageCount; //總頁(yè)數
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql); //執行查詢(xún)
ResultSetMetaData rmeta = rs.getMetaData();//獲得數據字段個(gè)數
int numColumns = rmeta.getColumnCount();
rs.last();
rowCount = rs.getRow();
pageCount = (rowCount +pageSize-1)/pageSize; //計算總頁(yè)數
if(pageNo> pageCount) pageNo=pageCount; //調整待顯示的頁(yè)碼
if(pageCount >0){
rs.absolute((pageNo-1)*pageSize+1); //將記錄指針定位到待顯示頁(yè)的第一條記錄上
int i = 0;
while(i){
for(int j = 0;j< numColumns;j++)
{
String sTemp = rs.getString(j+1);
System.out.print(sTemp+" ");
}
i++;
rs.next();
System.out.println("");
}
}
}
catch(Exception e){
System.out.println("query error:"+e);
}
}
public void demo(int pageNo,int pageSize){
try{
JDBCScrollDisplay jd = new JDBCScrollDisplay();
Connection con = jd.conn();
String sql = "select * from bookInfo order by no";
jd.query(con,sql,pageNo,pageSize);
con.close();}
catch(SQLException se){ System.out.println(se);}
catch(Exception e){System.out.println(e);}}
public static void main(String[] arg){
JDBCScrollDisplay jsd = new JDBCScrollDisplay();
int pageno = Integer.parseInt(arg[0]);
int pagesize = Integer.parseInt(arg[1]);
jsd.demo(pageno,pagesize);}}
4 結束語(yǔ)
JDBC是Java的一個(gè)標準SQL數據庫訪(fǎng)問(wèn)接口,它為數據庫應用開(kāi)發(fā)人員、數據庫前臺工具開(kāi)發(fā)人員提供一種標準的應用程序設計接口。開(kāi)發(fā)人員只需使用JDBC提供的類(lèi),調用這些類(lèi)的方法,即可對數據庫進(jìn)行訪(fǎng)問(wèn),而無(wú)需關(guān)心所使用的具體是什么數據庫系統。在實(shí)際的使用中經(jīng)常會(huì )遇到要提供可滾動(dòng)的結果集,只需要在使用分頁(yè)數據時(shí)先聲明是一個(gè)可移動(dòng)的SQL語(yǔ)句。上例可以任何應用在對數據庫做任意操作的基礎上,再分頁(yè)顯示。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。