动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.Java对战.NET,战争与和平的游戏.
.认识了解“J2ME”.
.非java.util.zip,使用ant.jar制.
.怎样在Beblogic中使用BeanShell.
.Struts生成Word下载.
.WebLogic 7.0平台:灵活适应环境.
.简单介绍.Net远程方法调用研究.
.CORBA对象生命周期之实现和内存管.
.java使用ant来编译.
.2006Java技术的回顾与展望.
.jsq(SQL测试工具).
.LOG2E 属性.
.Java----介绍三个集合容器库.
.用JAVA实现Undo、Redo,Copy、Pas.
.无需 JCE 用底层 API 实现开发 R.
.Java新手上路大全(初学者必看).
.Web 服务代理组件创建 JSF Web 服.
.学习使用J2EE Web应用的事件功能.
.java2html_0.8alpha二进制发布版.
.用java实现一个简单的序列化的例.

用Java构造Intranet范例查询系统

发表日期:2008-1-5 |



  一、范例查询
  我们的终极目标是一个能够满足所有潜在用户的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)
上一篇:创建通过 WDO访问数据的 JSF 应用程序(1) 人气:348
下一篇:切勿忽视软件集成中的软知识 人气:403
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号