亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用Java構造Intranet范例查詢系統

2019-11-18 13:16:45
字體:
來源:轉載
供稿:網友

  一、范例查詢
  我們的終極目標是一個能夠滿足所有潛在用戶的Intranet。為此,我們必須提高Intranet用戶訪問數據庫的靈活性,一種可能的方案是采用所謂的即席查詢(Ad-hoc Query)。
  
  “即席”兩個字在這里的含義是“不作非凡預備地,隨意、自由地”。即席查詢答應用戶象數據庫治理員一樣,自由地訪問數據庫。也許,最靈活的方式是讓用戶在Web頁面的文本輸入框中直接輸入SQL命令,然后由應用發送該SQL命令查詢數據庫。然而,雖然這種方式很靈活,但要實施得好很困難,存在許多問題。
  
  首先,這種方式不安全。假如不對用戶進行大量的培訓,不在應用中對用戶輸入的SQL命令進行嚴格的檢驗,用戶可能有意無意地破壞系統運行。另外,即使進行了培訓,要求用戶總是能夠構造出高效的SQL查詢也不切實際。
  
  然而,這些問題并不能完全阻礙我們構造出有效的Intranet即席查詢系統。一般地,Intranet內的用戶比網絡之外的用戶可信度高。為此,我們可以采用靈活性稍差但仍不失高效的方案——范例查詢(Query-By-Example,QBE)。范例查詢的使用簡單、靈活,不需要對用戶進行大量的培訓,同時它也比直接使用SQL的方式更安全。
  
  在范例查詢系統中,我們提供給用戶的界面與數據庫結構之間有著密切的對應關系。每一個查詢項目有一個相應的用戶界面控件。例如,假設有一個雇員信息數據庫,我們用一個列表框答應用戶選擇雇員所在的部門,用一個文本框答應用戶輸入薪金范圍限制查詢結果。
  
  二、數據庫抽象
  對于一些程序員來說,數據庫操作有時就象是一堆散亂的連接字符串、SQL命令和結果集。java的面向對象特色可以讓數據源具有更好的可治理性。接下來我們將用Java技術構造一個瀏覽器界面的QBE系統。這個系統以幾個核心類為基礎,核心類答應jsp頁面在更高的層次上操作數據庫,避免大量地編寫底層SQL代碼。
  
  數據庫最基本的元素之一是表。在數據庫中,表是數據記錄的容器,比如用來容納雇員名字和薪水信息。下面的DBTable類描述的就是數據庫里面的表。DBTable類的公用方法負責處理最底層的細節。比如,addChildTable方法用來建立表的父-子關系,addConstraint方法用來過濾表的輸出。
  
  【Listing 1:DBTable.java,描述數據庫的表】
  
  
  import java.util.*;
  public class DBTable {
   String pkey;    // 主鍵
   String name;    // 表的名字
   Vector columns;   // 結果集包含的列
   Hashtable col_desc; // 各個列的描述
   Vector children;  // 子表
   Vector constraints; // 所有約束
   /* 創建一個新的、未經初始化的表*/
   PRotected DBTable() {
  columns   = new Vector();
  children  = new Vector();
  constraints = new Vector();
  col_desc = new Hashtable();
   }
   /* 創建一個新的表,指定名字和主鍵*/
   public DBTable(String name, String pkey) {
  this();
  this.name = name;
  this.pkey = pkey;
   }
   /* 返回主鍵 */
   public String getPrimaryKey() {
  return pkey;
   }
   /* 創建一個新的約束,設置它的值,
  * 并把它加入表的約束列表
  */
   public void addConstraint(String column,
      int op, String value) {
  Constraint c = new Constraint();
  c.column = column;
  c.op   = op;
  c.value = value;
  constraints.add(c);
   }
   /* 把結果集限制為單個記錄的簡便方法 */
   public void constrainByPrimaryKey(String value) {
  addConstraint(pkey, Constraint.EQ, "'" + value + "'");
   }
   /* 添加一個列 */
   public void addColumn(String column,
           String description) {
  columns.add(column);
  col_desc.put(column, description);
   }
   /* 添加一個子表,通過外鍵建立關系 */
   public void addChildTable(DBTable table, String fkey) {
  children.add(table);
  addConstraint(this.pkey, Constraint.EQ,
        table.name + "." + fkey);
   }
   /* 搜索當前表以及(遞歸地搜索)所有子表,
  * 尋找指定的列,返回該列的描述 */
   public String findColumnDescription(String column) {
  String result = (String) col_desc.get(column);
  if (result != null) { // 已經找到指定的列
   return result;
  } else {
   // 在所有子表中搜索該列
   Enumeration e = children.elements();
   while (e.hasMoreElements()) {
    DBTable child = (DBTable) e.nextElement();
    result = child.findColumnDescription(column);
    if (result != null) { // 已經找到!
     return result;
    }
   }
   return null; // 在所有表中都無法找到指定的列
  }
   }
   /* 搜索當前表以及(遞歸地搜索)所有子表,
  * 檢查指定的列是否是一個主鍵 */
   public boolean isPrimaryKey(String column) {
  if (pkey.equals(column)) { // 已經找到指定的列
   return true;
  } else {
   // 搜索所有子表
   Enumeration e = children.elements();
   while (e.hasMoreElements()) {
    DBTable child = (DBTable) e.nextElement();
    if (child.isPrimaryKey(column)) { // 已經找到!
     return true;
    }
   }
   return false;
  }
   }
  }
  
  單獨的DBTable類其實沒有什么實際用途,它只是一種抽象的描述,既沒有建立底層的數據庫連接,也沒有任何SQL命令。為發揮DBTable類的作用,我們必須定義一個DBTable類的子類,在子類中利用DBTable類定義的方法訪問數據庫服務器。
  
  下面就是DBTable類的子類SQLDBTable.java:
  
  【Listing 2:SQLDBTable,擴展DBTable提供SQL和JDBC支持】
  
  import java.sql.*;
  import java.util.*;
  public class SQLDBTable extends DBTable {
   /* 構造函數 */
   public SQLDBTable(String name, String pkey) {
  super(name, pkey);
   }
   /* 生成一個SQL命令 */
   public String generateSQL() {
  /* 獲得SQL命令中出現的所有表的一個清單 */
  Vector tables = new Vector();
  findTables(tables);
  /* 獲得所有列的一個清單 */
  Vector columns = new Vector();
  findColumns(columns);
  /* 獲得必須在WHERE子句中出現的所有約束
   * 的一個清單
   */
  Vector where = new Vector();
  findConstraints(where);
  /* 創建一個容納SQL命令的StringBuffer */
  StringBuffer sql = new StringBuffer("SELECT ");
  sql.append(delimitedList(", ", columns.elements()));
  sql.append(" FROM ");
  sql.append(delimitedList(", ", tables.elements()));
  if (where.size() > 0) {
   sql.append(" WHERE ");
   sql.append(delimitedList(" AND ", where.elements()));
  }
  return sql.toString();
   }
   /* 利用一個JDBC連接提取結果記錄,
  * 注重:調用者必須關閉結果集的
  * Statement對象
  */
   public ResultSet fetchRows(Connection conn)
  throws Exception
   {
  String sql = generateSQL();
  /* 創建Statement(可能拋出SQLExeception異常)*/
  Statement stmt = conn.createStatement();
  /* 返回結果集 */
  return stmt.executeQuery(sql);
   }
   /* 這是一個從主鍵以外的各個列獲取數據的簡便
  * 方法。它在下列情形下使用:當你不想讓用戶看到主鍵時。
  *關于使用該方法的例子,請參見HtmlSelectListMaker.java。
  */
   public Enumeration getDisplayData(ResultSet rs) throws SQLException
   {
  ResultSetMetaData rmd = rs.getMetaData();
  Vector result = new Vector();
  for(int i = 0; i < rmd.getColumnCount(); i++) {
   String column = rmd.getColumnName(i + 1);
   if (isPrimaryKey(column)) {
    continue;
   }
   result.addElement( rs.getString(column) );
  }
  return result.elements();
   }
   /* 該方法生成帶分界符的列表,僅供內部使用。
  * 用來為SQL命令生成空格或逗號分隔的列表。
  */
   private String delimitedList(String delim, Enumeration e)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产自产在线观看永久| 2019国产精品自在线拍国产不卡| 精品久久久久久亚洲国产300| 欧美性猛交xxxx黑人| 亚洲精品白浆高清久久久久久| 久久久欧美一区二区| 国产欧美在线播放| 亚洲精品福利视频| 国产精品免费久久久久久| 国语自产精品视频在免费| 久久精品影视伊人网| 午夜精品久久久久久久男人的天堂| 国产91精品青草社区| 成人午夜小视频| 欧美壮男野外gaytube| 成人黄色免费在线观看| 精品一区二区三区电影| 欧美一区二区色| 久久久www成人免费精品张筱雨| 国产成人精品视| 亚洲精品suv精品一区二区| 国产91亚洲精品| 热久久美女精品天天吊色| 亚洲激情在线观看视频免费| 黄色一区二区在线| 亚洲黄色片网站| 精品亚洲夜色av98在线观看| 欧美成人免费在线观看| 久久久久久久久久婷婷| 日本最新高清不卡中文字幕| 国产美女精彩久久| 欧美激情精品久久久久久久变态| 国产精品亚洲网站| 欧美性xxxx18| 俺去了亚洲欧美日韩| 亚洲国产日韩欧美在线图片| 97热精品视频官网| 日韩精品免费在线| 66m—66摸成人免费视频| 日韩av不卡在线| 伊人一区二区三区久久精品| 日韩美女视频在线观看| 国模吧一区二区三区| 日韩av在线免费观看一区| 亚洲人成网站色ww在线| 欧美亚洲在线播放| 欧美网站在线观看| 精品美女永久免费视频| 成人a在线观看| 成人网在线观看| 一本大道久久加勒比香蕉| 91亚洲国产精品| 成人免费观看49www在线观看| 91亚洲国产成人久久精品网站| 成人免费看吃奶视频网站| 国产精品88a∨| 大桥未久av一区二区三区| 日韩精品高清视频| 日韩美女视频在线观看| 欧美另类第一页| 国产精品盗摄久久久| 亚洲精品v天堂中文字幕| 91精品久久久久久久久不口人| 欧美日韩国产在线看| 亚洲精品视频在线观看视频| 日韩中文字幕第一页| 国产精品色视频| 九色精品免费永久在线| 久久综合久久美利坚合众国| 日韩人在线观看| 97国产精品人人爽人人做| 成人乱色短篇合集| 美女少妇精品视频| 欧美电影第一页| 国产日韩精品电影| 亚洲自拍另类欧美丝袜| 欧美日韩国产在线看| 日本欧美一二三区| 欧美大全免费观看电视剧大泉洋| 亚洲欧美变态国产另类| 日本成人黄色片| 午夜精品久久久久久久久久久久| 久久精品欧美视频| 国产91精品最新在线播放| 国产91在线高潮白浆在线观看| 日韩在线欧美在线| 永久免费毛片在线播放不卡| 成人国产精品免费视频| 国产精品69久久久久| 成人黄色av网站| 91精品久久久久久久久久入口| 亚洲电影免费观看高清完整版在线观看| 国产精品久久av| 亚洲欧美在线免费观看| 欧美日韩国产综合视频在线观看中文| 国产欧美日韩丝袜精品一区| 精品欧美国产一区二区三区| 精品亚洲一区二区三区| 久久久久亚洲精品| 国产不卡视频在线| 国产亚洲综合久久| 欧美裸体xxxx| 亚洲国产精品久久久久秋霞蜜臀| 色偷偷88888欧美精品久久久| 91在线免费观看网站| 色老头一区二区三区在线观看| 亚洲精品999| 国产精品视频最多的网站| 国产免费成人av| 国产999精品久久久| 中文字幕日韩精品在线| 日本aⅴ大伊香蕉精品视频| 久久综合久中文字幕青草| 国产欧美亚洲精品| 日韩精品极品在线观看播放免费视频| 久久精品国产成人| 国产精品久久久久久网站| 日韩美女中文字幕| 国产精品福利网| 欧美日韩国产页| 亚洲美女中文字幕| 日本亚洲欧美三级| 日韩成人av网址| 亚洲国产成人在线视频| 日本不卡视频在线播放| 久久99国产综合精品女同| 成人一区二区电影| 精品久久久久久久久久久久久久| 精品成人av一区| xxx成人少妇69| 久久久久国产精品免费网站| 亚洲第一区第二区| 亚州欧美日韩中文视频| 中文字幕亚洲色图| 欧美不卡视频一区发布| 欧美视频第一页| 91黑丝在线观看| 中日韩美女免费视频网站在线观看| 98精品国产高清在线xxxx天堂| 亚洲激情视频在线| 国产精品成人观看视频国产奇米| 国产日韩中文字幕在线| 中文字幕在线视频日韩| 亚洲天堂免费观看| 亚洲色图综合网| 成人国产亚洲精品a区天堂华泰| 欧美在线精品免播放器视频| 中文字幕欧美精品在线| 亚洲风情亚aⅴ在线发布| 97超碰国产精品女人人人爽| 久久伊人91精品综合网站| 久久综合伊人77777尤物| 亚洲成色999久久网站| 91爱爱小视频k| 国产在线98福利播放视频| 爽爽爽爽爽爽爽成人免费观看| 国外成人在线播放| 欧美激情精品久久久久| 亚洲高清福利视频| 国产精品三级在线| 欧美日韩国产精品一区| 亚洲第一二三四五区| 欧美福利小视频| 欧美另类暴力丝袜|