在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一样。
分享到:
相关推荐
到如一些小脚本很少报错,但最近导入一个10+M的SQL脚本,却重复报错: Error occured at:2014-03-24 11:42:24 Line no.:85 Error Code: 2006 - MySQL server has gone away 最终找到原因,原来是MySQL导入大批量...
Excel是一种非常灵活的电子表格软件,用它可以存储各种数据,本节将对如何将Excel导入SQL Server2000数据库进行详细介绍。 开发环境:NET2.0 开发工具:vs2005 开发语言:c# 数据库:server2000
txt导入SQL C# 代码链接SQL数据库
sql server 导入超大SQL脚本文件.doc 说明
将DBF文件导入到SQL server 数据库,并且导出到本地的excel
MySQL导入sql文件
XML导入SQLServer工具,配置简单,支持大批量导入到SQLServer。
一个将excel文件导入到SQLServer表中的程序 一 双击Input.exe运行程序,将弹出一个窗口,这时请你在"数据库名"后面的 输入栏中输入数据库名(如果是千方百剂就是输入帐套名).你如果没对数 据库的登录进行特殊修改的...
excel导入SQL工具,可选择对应字段名.
SQL导入表与表之间导入SQL导入表与表之间导入SQL导入表与表之间导入SQL导入表与表之间导入SQL导入表与表之间导入SQL导入表与表之间导入SQL导入表与表之间导入
Excel数据导入SQL工具
阶段三:根据阶段一、阶段二导入的数据,将符合的附加工作簿内容写入SQL附加表中。 2、导入前请了解源EXCEL文档中以下几项: 导入前准备工作:打开EXCEL文档,了解主表名、主表在EXCEL文档中是第几个工作簿、主表中...
delphi EXCEL导入SQL源码
主要使用了接口以及简单工厂来实现将xml文件导入到sql数据库中!
自己写的java导入.sql文件到数据库,部署项目时可直接调用。内部包含源码。共享给大家,如有疑问,发邮件到 yichangjiang@sina.com 可与大家共同探讨。程序及说明在runjar目录下。
快速从现有数据库获得插入数据脚本,插入到其他库
Excel导入SQLserver源码_excel2sql
MySQL导入.sql文件及常用命令
excel导入sql小工具 可自行输入数据库地址,数据库名,表名,用户名密码
把Excel文档导入SqlServer数据库