`
canonical
  • 浏览: 366377 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[导入]SQL类:一件事一句话

阅读更多

在witrix平台中访问数据库最直接的方法是使用edu.thu.db.SQL类。基本用法如下:
//  设定数据库连接参数, 连接可以通过java.sql.DriverManager 和

//javax.sql.DataSource等多种方式建立,并支持数据库连接缓冲池。
TransactionMode db = new TransactionMode("default"); // 设定数据库连接参数
SQL sql = SQL.begin().select().field("id")
                     .from().table("other_table")
      .where().like("name","a%");
   .end();
int n = SQL.begin().select().countAll()
                   .from().table("my_table")
       .where().gt("value", new Integer(3)) // value > 3
            .and().in("type", new String[]{"a","b"})  // type in ('a','b')
         .and().in("data_id",sql)  // data_id in (select id from other_table where name like 'a%')
      .end().query(db).intValue();

在SQL类的设计中体现了三个设计原则:
1. 正交化的流式设计
2. 参数对象化
3. bug-free设计

首先,SQL类将构造SQL语句,连接数据库以及查询结果类型转换分解成了三个正交的部分。
在一般的数据库编程中,我们需要如下访问方式:
String sql = "select count(*) from my_table where value > ?";
Connection conn = getConnection();
PreparedStatement stmt = null;
try{
     PreparedStatement stmt = conn.prepareStatement(sql);
  stmt.setParameter(1, valueLimit);
  ResultSet rs = stmt.executeQuery();
  rs.next();
  int ret = rs.getInt(1);
  // ...
}finally{
 try{
  if(stmt != null)
   stmt.close();
 }catch(Exception e){
     e.printStackTrace();
 }

 try{
  conn.close();
 }catch(Exception e){
     e.printStackTrace();
 }
}

从 以上的例子中,我们可以注意到,在普通JDBC编程中,设置SQL语句的参数,建立数据库连接,取得结果集中的结果并转化为合适的格式这三者之间是交织在 一起的。特别是打开连接需要配对的关闭连接语句,造成整个程序的流程不是线性的, 因为我们不能说建立连接之后就可以不再管连接的事情了,我们必须记住在做完所有其他事情之后还要关闭连接。    通过一系列的封装对象,SQL类实现了一种正交化的流式设计,其分解模式如下:
      SQL.begin().拼接SQL语句.end().建立连接并运行SQL语句.转化结果()
注意在SQL语句执行之后是不需要显式关闭连接的。

SQL类的第二个设计要点是参数对象化。在witrix平台中,实际运行SQL语句的引擎函数是
 IDbEngine.execute(String sqlText, List sqlParameters, int resultType, int concurrency);
这 里sqlText, sqlParameters等都是参数,但是在应用中构造这些参数的过程很复杂,并且非常灵活,一般的Util类(静态Utility函数)无法提供有效 的简化。 所以构造SQL语句这个过程不是通过util类完成的,而是通过一个专用的SqlBuilder对象。SQL的基本思想是将sql语句纳入java程序框 架,使得sql语句成为程序中可控制的部分。首先SQL类将sql文本与sql参数封装为一个完整的对象,使得sql语句的重用成为可能。其次, SqlBuilder类通过一种可控制的方式构造sql语句(所有的关键字都对应于一个函数),整个过程与直接书写sql文本类似,但函数封装使得我们能 够在同一行上指定sql文本中用到的参数,而不是象jdbc里那样,集中指定参数。同时SqlBuilder支持面向java语言的扩展,如直接支持 java集合类型等,从而大大简化了sql语句的构造,因为一般sql拼接中最混乱的部分就是牵涉到循环与判断。
  参数对象化的方法还可以应用于那些具有大量缺省参数的地方。在SQL类中,如果我们希望以scroll insensitive的方式选出数据,调用方式如下:
  SQL.begin().select().star()
             .from().table("my_table")
   .end().scrollable(true).list(db,3,100);
如果我们希望利用Statement.cancel()特性,我们可以指定cancelMonitor参数
   SQL.begin()....end().cancelMonitor(monitor).query(db).listValue();

SQL 类的第三个设计要点是bug-free。jdbc中最常出现的错误是忘记关闭连接造成资源泄漏,在SQL类中,连接只在需要时才从缓冲池中获取,当数据库 操作完成(无论成功或失败)时,数据库连接会被自动关闭(或返回连接池),并自动处理提交和回滚的情况。整个程序代码中一般没有需要显式关闭连接的要求, 从而极大的降低了资源泄漏的几率,避免了这个错误的出现。这就如同java没有要求程序员显式释放内存,从而在绝大多数情况下避免了memory leak的bug一样。
分享到:
评论
2 楼 canonical 2008-03-02  
我习惯的做法是充分发掘现有技术形式的价值。
1 楼 jindw 2008-03-01  
似曾相识,我以前也想在代码生成的时候,将hql编译成类似这种方式的类,
不过,我当时更多的想法是编译成静态类,以便利用ide的语法检查。

相关推荐

    MySQL导入sql脚本错误:2006 解决方法

    到如一些小脚本很少报错,但最近导入一个10+M的SQL脚本,却重复报错: Error occured at:2014-03-24 11:42:24 Line no.:85 Error Code: 2006 - MySQL server has gone away 最终找到原因,原来是MySQL导入大批量...

    sql server 导入超大SQL脚本文件

    SQL Server 导入超大 SQL 脚本文件 SQL Server 是一种关系型数据库管理系统,广泛应用于各种行业。...osql 工具是 SQL Server 提供的一个非常有用的工具,可以帮助我们快速导入超大 SQL 脚本文件和执行 SQL 语句。

    excel数据导入SQL server 2000:for delphi 7

    SQL: WideString; begin // 创建连接 Connection := TADOConnection.Create(nil); Connection.ConnectionString := 'Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName...

    Excel导入SQLserver源码

    Excel是一种非常灵活的电子表格软件,用它可以存储各种数据,本节将对如何将Excel导入SQL Server2000数据库进行详细介绍。 开发环境:NET2.0 开发工具:vs2005 开发语言:c# 数据库:server2000

    MySQL导入.sql文件及常用命令

    例如,假设我们有一个名为 `db.sql` 的.sql 文件,位于 `D:/myprogram/database/` 路径下,我们可以使用以下命令来导入该文件: ``` mysql> source d:/myprogram/database/db.sql; ``` 这将执行 `db.sql` 文件中的...

    excel导入SQL工具

    Excel导入SQL工具是一种实用软件,主要用于将Excel表格数据高效、便捷地导入到SQL数据库中。这类工具极大地简化了数据管理过程,特别是在处理大量结构化数据时,能够避免手动输入的繁琐工作,提高工作效率。 首先,...

    Excel数据导入SQL工具

    - **批量导入**:一次性将大量数据导入数据库,减少手动操作。 - **错误处理**:检测并处理导入过程中的错误,如数据不匹配、超长字段等。 - **进度跟踪**:显示导入进度,让用户了解操作状态。 - **自动化脚本*...

    navicat怎么导入sql文件.docx

    6. **完成导入**:当所有SQL语句都成功执行后,Navicat会显示一条消息提示导入完成。现在,你可以检查新数据库中是否已经按照SQL文件的内容创建了相应的表,并填充了数据。 在导入过程中,需要注意以下几点: - **...

    Excel导入SQLserver源码_excel2sql.zip

    这个压缩包文件"Excel导入SQLserver源码_excel2sql.zip"很可能包含了一个程序或脚本,用于自动化从Excel文件批量导入数据到SQL Server的过程。通常,这样的工具会使用编程语言如Python、C#、VB.NET或PowerShell来...

    Oracle导入SQL脚本执行和常用命令大全

    Oracle 导入 SQL 脚本执行和常用命令大全是一个非常重要的知识点,对于 Oracle 数据库的开发和维护人员来说非常有用。在本篇文章中,我们将介绍 Oracle 导入 SQL 脚本执行的方法和常用的命令大全。 一、Oracle 导入...

    SQL Server数据导入SQLite工具

    总的来说,“SQL Server数据导入SQLite工具”是一个集成了解析、转换、导入和验证等多步骤的复杂系统。它简化了两个不同数据库系统之间的数据迁移,使开发者和管理员能够更便捷地在SQL Server和SQLite之间切换,满足...

    Excel数据导入到SQLServer数据库中

    在IT行业中,数据管理和操作是核心任务之一,而Excel与SQL Server之间的数据交互是一个常见的需求。Excel作为一种便捷的数据处理工具,常用于数据整理和分析,而SQL Server则是一个强大的关系型数据库管理系统,适用...

    Access或者Excel数据导入SQL

    4. 选择要导入的表,并决定是否将数据直接插入SQL Server,还是创建一个新的表并导入数据。 5. 完成设置后,点击“完成”以开始数据导入过程。 对于Excel数据导入SQL,操作也相对简单: 1. 打开Excel工作簿,保存...

    delphi EXCEL导入SQL源码

    本主题聚焦于使用Delphi编程语言实现Excel数据的导入到SQL数据库的过程。Delphi,作为一个强大的RAD(快速应用开发)工具,以其高效的VCL组件库闻名,允许开发者便捷地处理各种数据操作。 首先,我们需要理解的是...

    XlsToSql;Excel导入SqlServer工具

    XlsToSql是一款专门设计用于将Excel数据高效、便捷地导入到SqlServer的工具,它的出现极大地简化了这个过程。该工具的最新版本为xlstosql.3.9-patch.exe,用户只需将其下载并放置在指定的文件目录下运行,即可开始...

    phpmyadmin导入sql数据库文件教程

    本文将详细介绍如何通过PHPMyAdmin导入现有的SQL文件,帮助初学者顺利地完成这一过程。 #### 环境准备 在开始导入数据库之前,请确保满足以下条件: 1. **PHP环境**: 已经安装并配置好PHP环境。 2. **MySQL服务**: ...

    excel导入sql server数据库源码

    本主题涉及的核心知识点是如何将Excel中的数据导入到SQL Server数据库中,以及实现这一过程的源码。 1. Excel与SQL Server的关系: Excel是一种电子表格应用程序,适合小型数据集的管理和分析,而SQL Server是一个...

    客户端将Excel导入SQL Server C#源码下载

    在IT行业中,将Excel数据导入SQL Server是一项常见的任务,尤其在数据分析、报表生成以及数据库管理等领域。本资源提供了一个C#编程实现的解决方案,允许用户在客户端直接将Excel文件的数据导入库中。以下是对这个C#...

    SQL导入表与表之间导入

    SQL导入是指将数据从外部文件或另一数据库导入到当前数据库中的过程。在进行SQL导入时,可能需要处理多个表之间的数据关系。 #### 二、表与表之间的依赖关系 当数据库中有多个表时,这些表之间可能存在某种形式的...

    excel数据导入sql工具

    一个将excel文件导入到SQLServer表中的程序 一 双击Input.exe运行程序,将弹出一个窗口,这时请你在"数据库名"后面的 输入栏中输入数据库名(如果是千方百剂就是输入帐套名).你如果没对数 据库的登录进行特殊修改的...

Global site tag (gtag.js) - Google Analytics