1. gzyueqian
      18529173453
      首頁 > 新聞中心 > > 正文

      Java數據庫編程中查詢結果的表格式輸出

      更新時間: 2007-05-23 10:58:15來源: 粵嵌教育瀏覽量:1309


        【內容摘要】本文較為詳細地介紹了在Java數據庫編程中,利用表格輸出查詢結果的方法;并對所涉及的類給以了簡要說明。
        【關鍵字】類、對象、接口
        【作者簡介】男,26歲,陜西財經學院研究生,師從陳逢吉教授,從事金融信息系統方面的研究。

        利用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,實際應用中必須給出。此外,有些系統中,文本域中的漢字不一定能正確顯示,需借助其它方法實現。

      【參考資料】
      1、《Java2從入門到精通》,[美]John Zukowski著,電子工業出版社;
      2、《Java2開發指南》,電子工業出版社;

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲天堂网免费在线观看 | 日本在线视频一二三区 | 在线人成地址在线观看 | 最新国产区在线 | 亚洲欧美国产va在线播放 | 亚洲天堂国产视频 |