Java的資料庫應用

來源:互聯網
上載者:User
資料|資料庫 利用Java開發資料庫應用系統時,經常需要在使用者介面上顯示查詢結果。由於SUN公司提供的JDK1.x開發套件不是可視化的整合式開發環境(IDE),不能象Delphi、VB那樣方便地把查詢結果在DBGrid等表格中顯示出來。因此,只能靠自己編寫代碼來實現。
在實際應用中,我們可以利用Vector、JTable、AbstractTableModel等三個類較好地解決這一問題。以下,詳細介紹一下實現方法。

一、 類Vector、類JTable及類AbstractTableModel簡介:

1、 類Vector:
類Vector是Java的曆史集合類,隸屬於java.util包。它封裝了異構鏈表和數組雜合體,具有以下兩個特點:
* 向量是異構的,不要求每個元素的類型相同,向量中可以混合多種物件類型;
* 向量是數組雜合體,因為它們可以在增加元素時動態增大。
其異構性正好符合資料庫記錄中屬性類型不一的特點,而其動態性也正好符合資料庫查詢時,結果集記錄個數不定的特點。
類Vector定義如下:
public class Vector extends AbstractList
implements List , Cloneable , Serializable{…}
實現了向量成員的尋找、新增、刪除等方法。如:add(Object obj)可方便地加入一個對象;get(int index)可方便地得到向量中的一個對象;remove(Object obj)則可方便地刪除向量中一個對象。

2、 類JTable:
JTable組件是Swing組件中比較複雜的小件,隸屬於javax.swing包,它能以二維表的形式顯示資料。類JTable定義如下:
public class JTable extends JComponent
implements TableModelListener, Scrollable, TableColumnModelListener,
ListSelectionListener, CellEditorListener, Accessible{…}
類JTable在顯示資料時具有以下特點:
* 可定製性:可以定製資料的顯示方式和編輯狀態;
* 異構性:可以顯示不同類型的資料對象,甚至包括顏色、表徵圖等複雜物件;
* 簡便性:可以以預設方式輕鬆地建立起一個二維表。
其可定製性可滿足不同使用者和場合的要求,異構性也正好符合資料庫訪問結果集中屬性類型不一的特點。類JTable提供了極為豐富的二維表格操作方法,如設定編輯狀態、顯示方式、選擇行列等,在此不一一贅述。
使用類JTable顯示資料之前,必鬚根據情況產生定製模型、單元繪製器或單元編輯器。類AbstractListModel用來定製使用者自己的資料模型,這個類在後面要介紹。TableCellRenderer介面用來定製單元繪製器,TableCellEditor介面用來定製單元編輯器,這兩個介面主要用於顏色對象的處理上,在樣本中沒有用到,不做過多說明。

3、 類AbstractTableModel:
類AbstractTableModel是一個抽象類別,沒有完全實現,不能執行個體化,使用時必須在程式中實現方法。它隸屬於javax.swing.table 。類定義如下:
public abstract class AbstractTableModel extends Object
implements TableModel, Serializable{…}
類AbstractTableModel提供了TableModel介面中絕大多數方法的預設實現。TableModel介面定義了JTable 的基礎資料結構。使用者要產生自己的資料模型,本來可以通過實現TableModel介面中所有方法來滿足要求,但管理聽眾表的功能對於所有資料模型是共同的,所以在javax.swing.table中又定義了類AbstractTableModel來處理這個工作。它既管理聽眾表,又為產生TableModelEvents事件並委託給聽眾提供了便利。
要想產生一個具體的TableModel作為AbstractTableMode的子類,至少必須實現下面三個方法:
public int getRowCount();
public int getColumnCount();
public Object getvalueAt(int row, int column);
至此,我們可以建立一個簡單二維表(5×5),實現方法如下:
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() { return 5; }
public int getRowCount() { return 5;}
public Object getvalueAt(int row, int col) { return new Integer(row*col); }
};
JTable table = new JTable(dataModel);
JScrollPane scrollpane = new JScrollPane(table);
二、 資料庫及其串連方法簡介:
樣本採用Sybase資料庫系統,資料庫存放在資料庫伺服器中。路徑為:D:\WORKER,資料庫名為:worker.dbf。具有以下欄位:
欄位名
類型
Wno(職工號)
VARCHAR
Wname(職工名)
VARCHAR
Sex(性別)
VARCHAR
Birthday(出生日期)
DATE
Wage(工資)
FLOAT
要串連此資料庫,需使用java.sql包中的類DriverManager。此類是用於管理JDBC驅動程式的公用程式類。它提供了通過驅動程式取得串連、註冊,撤消驅動程式,設定登記和資料庫訪問登入逾時等方法。具體串連方法如下:
第一步:定位、裝入和連結SybDriver類;
driver="com.sybase.jdbc.SybDriver";
SybDriver sybdriver=(SybDriver)Class.forName(driver).newInstance();
第二步:註冊SybDriver類;
DriverManager.registerDriver(sybdriver);
第三步:取得串連(SybConnection)對象引用。
user="sa";
password="";
url="jdbc:sybase:Tds:202.117.203.114:5000/WORKER";
SybConnection connection=(SybConnection)DriverManager.getConnection
(url,user,password);
建立完串連後,即可通過Statement介面進行資料庫的查詢與更改。

三、 實現方法:
限於篇幅,在此只給出核心代碼,包引入、介面處理、變數定義等部分不再介紹。
第一步:對象聲明。
AbstractTableModel tm;//聲明一個類AbstractTableModel對象
JTable jg_table;//聲明一個類JTable對象
Vector vect;//聲明一個向量對象
JScrollPane jsp;//聲明一個滾動杠對象
String title[]={"職工號","職工名","性別","出生日期","工資"};
//二維表列名
第二步:定製表格。
1、實現抽象類別AbstractTableModel對象tm中的方法:
vect=new Vector();//執行個體化向量
tm=new AbstractTableModel(){
public int getColumnCount(){
return title.length;}//取得表格列數
public int getRowCount(){
return vect.size();}//取得表格行數
public Object getvalueAt(int row,int column){
if(!vect.isEmpty())
return
((Vector)vect.elementAt(row)).elementAt(column);
else
return null;}//取得儲存格中的屬性值
public String getColumnName(int column){
return title[column];}//設定表格列名
public void setvalueAt(Object value,int row,int column){}
//資料模型不可編輯,該方法設定為空白
public Class getColumnClass(int c){
return getvalueAt(0,c).getClass();
}//取得列所屬對象類
public boolean isCellEditable(int row,int column){
return false;}//設定儲存格不可編輯,為預設實現
};
2、定製表格:
jg_table=new JTable(tm);//產生自己的資料模型
jg_table.setToolTipText("顯示全部查詢結果");//設定協助提示
jg_table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//設定表格調整尺寸模式
jg_table.setCellSelectionEnabled(false);//設定儲存格選擇方式
jg_table.setShowVerticalLines(true);//設定是否顯示儲存格間的分割線
jg_table.setShowHorizontalLines(true);
jsp=new JScrollPane(jg_table);//給表格加上滾動杠
第三步:顯示查詢結果。
1、 串連資料庫:第二部分已給出。
2、 資料庫查詢:
Statement stmt=connection.createStatement();
ResultSet rs=stmt.executeQuery("select * from worker");
3、 顯示查詢結果:
vect.removeAllElements();//初始化向量對象
tm.fireTableStructureChanged();//更新表格內容
while(rs.next()){
Vector rec_vector=new Vector();
//從結果集中取資料放入向量rec_vector中
rec_vector.addElement(rs.getString(1));
rec_vector.addElement(rs.getString(2));
rec_vector.addElement(rs.getString(3));
rec_vector.addElement(rs.getDate(4));
rec_vector.addElement(new Float(rs.getFloat(5)));
vect.addElement(rec_vector);//向量rec_vector加入向量vect中
}
tm.fireTableStructureChanged();//更新表格,顯示向量vect的內容
例圖如下:

若要實現示圖中記錄前翻、後翻的效果,有兩種方法:
一、如果軟體環境支援JDBC2.0,可直接利用rs.prevoius()和rs.next()獲得記錄,然後通過類JTextField中的setText()方法,顯示出各個欄位值。
二、如果不支援JDBC2.0,則可利用向量Vector按行取出JTable中資料。自訂一個指標,用來記錄位置。當指標加1時,取出上一行資料放入Vector中顯示;指標減1時,取出下一行資料顯示。顯示方法同上。
需要說明的是:代碼中沒有給出捕捉例外的部分,如SQLException,實際應用中必須給出。此外,有些系統中,文本域中的漢字不一定能正確顯示,需藉助其它方法實現。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.