熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

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

2022-06-13   來源: Java核心技術 

  利用Java開發數據庫應用系統時經常需要在用戶界面上顯示查詢結果由於SUN公司提供的JDKx開發工具包不是可視化的集成開發環境(IDE)能象DelphiVB那樣方便地把查詢結果在DBGrid等表格中顯示出來因此只能靠自己編寫代碼來實現
   在實際應用中我們可以利用VectorJTableAbstractTableModel等三個類較好地解決這一問題以下詳細介紹一下實現方法
  類Vector類JTable及類AbstractTableModel簡介
   類Vector
   類Vector是Java的歷史集合類隸屬於javautil包它包裝了異構鏈表和數組雜合體具有以下兩個特點
   ()向量是異構的不要求每個元素的類型相同向量中可以混合多種對象類型
   ()向量是數組雜合體因為它們可以在增加元素時動態增大
   其異構性正好符合數據庫記錄中屬性類型不一的特點而其動態性也正好符合數據庫查詢時結果集記錄個數不定的特點
   類Vector定義如下
  public class Vector extends AbstractList
  implements List Cloneable Serializable{…}
   實現了向量成員的查找新增刪除等方法add(Object obj)可方便地加入一個對象get(int index)可方便地得到向量中的一個對象remove(Object obj)則可方便地刪除向量中一個對象
   類JTable
   JTable組件是Swing組件中比較復雜的小件隸屬於javaxswing包它能以二維表的形式顯示數據類JTable定義如下
  public class JTable extends JComponent
  implements TableModelListener
  Scrollable TableColumnModelListener
  ListSelectionListener
  CellEditorListener Accessible{…}
   類JTable在顯示數據時具有以下特點
   ()可定制性可以定制數據的顯示方式和編輯狀態
   ()異構性可以顯示不同類型的數據對象甚至包括顏色圖標等復雜對象
   ()簡便性可以以缺省方式輕松地建立起一個二維表
   其可定制性可滿足不同用戶和場合的要求異構性也正好符合數據庫訪問結果集中屬性類型不一的特點類JTable提供了極為豐富的二維表格操作方法如設置編輯狀態顯示方式選擇行列等在此不一一贅述
   使用類JTable顯示數據之前必須根據情況生成定制模型單元繪制器或單元編輯器類AbstractListModel用來定制用戶自己的數據模型這個類在後面要介紹TableCellRenderer接口用來定制單元繪制器TableCellEditor接口用來定制單元編輯器這兩個接口主要用於顏色對象的處理上在示例中沒有用到不做過多說明
   類AbstractTableModel
   類AbstractTableModel是一個抽象類沒有完全實現不能實例化使用時必須在程序中實現方法它隸屬於javaxswingtable 類定義如下
  public abstract class AbstractTableModel extends Object
  implements TableModel Serializable{…}
   類AbstractTableModel提供了TableModel接口中絕大多數方法的缺省實現TableModel接口定義了JTable 的基礎數據結構用戶要生成自己的數據模型本來可以通過實現TableModel接口中所有方法來滿足要求但管理聽眾表的功能對於所有數據模型是共同的所以在javaxswingtable中又定義了類AbstractTableModel來處理這個工作它既管理聽眾表又為生成TableModelEvents事件並委托給聽眾提供了便利
   要想生成一個具體的TableModel作為AbstractTableMode的子類至少必須實現下面三個方法
  public int getRowCount();
  public int getColumnCount();
  public Object getValueAt(int row int column);
   至此我們可以建立一個簡單二維表(×實現方法如下TableModel dataModel = new AbstractTableModel() {
  public int getColumnCount() { return ; }
  public int getRowCount() { return ;}
  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數據庫名為workerdbf具有以下字段
  字段名 類型
  Wno(職工號) VARCHAR
  Wname(職工名) VARCHAR
  Sex(性別) VARCHAR
  Birthday(出生日期) DATE
  Wage(工資) FLOAT
   要連接此數據庫需使用javasql包中的類DriverManager此類是用於管理JDBC驅動程序的實用程序類它提供了通過驅動程序取得連接注冊撤消驅動程序設置登記和數據庫訪問登錄超時等方法具體連接方法如下
   第一步定位裝入和鏈接SybDriver類driver=comsybasejdbcSybDriver;
  SybDriver sybdriver=(SybDriver)
  ClassforName(driver)newInstance();
   第二步注冊SybDriver類
  DriverManagerregisterDriver(sybdriver);
   第三步取得連接(SybConnection)對象引用
  user=sa;
  password=;
  url=jdbc:sybase:Tds::/WORKER;
  SybConnection connection=
  (SybConnection)DriverManagergetConnection (urluserpassword);
   建立完連接後即可通過Statement接口進行數據庫的查詢與更改 實現方法
   限於篇幅在此只給出核心代碼包引入界面處理變量定義等部分不再介紹第一步對象聲明
  AbstractTableModel tm;
  //聲明一個類AbstractTableModel對象
  JTable jg_table;//聲明一個類JTable對象
  Vector vect;//聲明一個向量對象
  JScrollPane jsp;//聲明一個滾動槓對象
  String title[]={職工號職工名
  性別出生日期工資};
  //二維表列名
   第二步定制表格
   實現抽象類AbstractTableModel對象tm中的方法
  vect=new Vector();//實例化向量
  tm=new AbstractTableModel(){
  public int getColumnCount(){
  return titlelength;}//取得表格列數
  public int getRowCount(){
  return vectsize();}//取得表格行數
  public Object getValueAt(int rowint column){
  if(!vectisEmpty())
  return
  ((Vector)vectelementAt(row))elementAt(column);
  else
  return null;}//取得單元格中的屬性值
  public String getColumnName(int column){
  return title[column];}//設置表格列名
  public void setValueAt
  (Object valueint rowint column){}
  //數據模型不可編輯該方法設置為空
  public Class getColumnClass(int c){
  return getValueAt(c)getClass();
  }//取得列所屬對象類
  public boolean isCellEditable(int rowint column){
  return false;}//設置單元格不可編輯為缺省實現
  };
   定制表格
  jg_table=new JTable(tm);//生成自己的數據模型
  jg_tablesetToolTipText(顯示全部查詢結果);
  //設置幫助提示
  jg_tablesetAutoResizeMode(JTableAUTO_RESIZE_OFF);
  //設置表格調整尺寸模式
  jg_tablesetCellSelectionEnabled(false);
  //設置單元格選擇方式
  jg_tablesetShowVerticalLines(true);//
  設置是否顯示單元格間的分割線
  jg_tablesetShowHorizontalLines(true);
  jsp=new JScrollPane(jg_table);//給表格加上滾動槓
   第三步顯示查詢結果
   連接數據庫第二部分已給出
   數據庫查詢
  Statement stmt=connectioncreateStatement();
  ResultSet rs=stmtexecuteQuery
  (select * from worker);
   顯示查詢結果
  vectremoveAllElements();//初始化向量對象
  tmfireTableStructureChanged();//更新表格內容
  while(rsnext()){
  Vector rec_vector=new Vector();
  //從結果集中取數據放入向量rec_vector中
  rec_vectoraddElement(rsgetString());
  rec_vectoraddElement(rsgetString());
  rec_vectoraddElement(rsgetString());
  rec_vectoraddElement(rsgetDate());
  rec_vectoraddElement(new Float(rsgetFloat()));
  vectaddElement(rec_vector);
  //向量rec_vector加入向量vect中
  }
  tmfireTableStructureChanged();
  //更新表格顯示向量vect的內容
  
  
  
   若要實現示圖中記錄前翻後翻的效果有兩種方法
  如果軟件環境支持JDBC可直接利用rsprevoius()和rsnext()獲得記錄然後通過類JTextField中的setText()方法顯示出各個字段值
  如果不支持JDBC則可利用向量Vector按行取出JTable中數據自定義一個指針用來記錄位置當指針加取出上一行數據放入Vector中顯示指針減取出下一行數據顯示顯示方法同上
   需要說明的是代碼中沒有給出捕捉例外的部分如SQLException實際應用中必須給出此外有些系統中
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26092.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.