日期:2014-05-16  浏览次数:20485 次

commons-dbutils轻量级JDBC数据库规范
    业内流行这么一句话:"三流公司卖产品;二流公司卖服务;一流公司卖标准."
    标准就是规范,所以开发中,最难的不是具体功能的实现,而是制定一个开发规范,大家共同去遵守.废话不说了,直接进入正题^-^
一 介绍
    commons是apache旗下一个著名的开源项目.他提供了很多方便使用的工具类.今天之所以把标题命名为,是因为相对于方便的工具来说,commons-dbutils的更大意义在于JDBC的开发规范.这样增强了代码的可读性和维护性.本文的出发点也是从规范说起,捎带着一些常用的方法.
    commons-dbutils是一个轻量级的JDBC开发框架.里面只是一些非常简单的封装.下面笔者先介绍几个常用的类和接口.
    1)org.apache.commons.dbutils.DbUtils.java
这个类提供了数据库初始化和关闭相关的初始操作.包括资源的开关,驱动的加载.事务回滚等常用操作。
    public static void closeQuietly(Connection conn, Statement stmt,
            ResultSet rs) {
        try {
            closeQuietly(rs);
        } finally {
            try {
                closeQuietly(stmt);
            } finally {
                closeQuietly(conn);
            }
        }
    }
这个方法,提供了对Connection,Statement/PrepareStatement,ResultSet的关闭操作.只需要一行代码,就可以安全的关闭.其中具体的细节,大家可以更深入的阅读源代码.
    public static void commitAndClose(Connection conn) throws SQLException {
        if (conn != null) {
            try {
                conn.commit();
            } finally {
                conn.close();
            }
        }
    }
    这个接口是先提交,后关闭.
    2)org.apache.commons.dbutils.QueryRunner.java
			Object[][] params = new Object[vars.size()][5];
			Var var = new Var();
			int count = 0;
			String sql = "";
			count = vars.size();
			// 组装参数
			for (int i = 0; i < count; i++) {
				var = vars.get(i);
				params[i][0] = var.getDate_Time();
				params[i][1] = var.getId();
				params[i][2] = var.getValue_t();
				params[i][3] = var.getDate_Time();
				params[i][4] = var.getId();
			}
			// 执行批处理
			sql = "insert into vardata(time,name,data) select ?,?,? from dual where not exists (select * from vardata where time=? and name=?)";
			run.batch(sql, params);
上面是一个批处理的例子,这个类提供了相当强大的查询功能,可以类似ORM一样,使用查询.
二 项目应用
    1)背景:本人正在从事的项目中,有个数据采集的功能.在SQL SERVER 2005中,只存在1个表,表中有2个字段.这个表只有185条纪录.每天纪录代表一个变量.2个字段分别为name,value.想必读者一看就能明白字段的含义.为了保证硬件设备WINCC的性能,所以他不会把数据累积到SQL SERVER 2005中,而只是刷新185条记录.所以数据库中,永远只有185条数据.因此我们需要实现个功能,每5秒钟到SQL SERVER 2005中,拿到全部数据,保存在一个可以累积历史数据的库中来.本项目中,我们选择MySQL5.1.49,通过对时间字段分区,实现了大量数据高性能的需求.下面笔者只演示commons-dbutils相关的部分,其中MySQL的数据库结构,也被笔者简化.
    2)环境:
数据库:
MySQL 5.1.49
JDK环境:
6.0.21
数据源:
commons-dbcp
commons-pool
    3)数据库:
CREATE DATABASE `test`; 
CREATE TABLE `icerecord` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `value_t` float(10,5) DEFAULT '0.00000', 
  `Date_Time` varchar(50) DEFAULT '', 
  PRIMARY KEY (`id`) 
) ; 
INSERT INTO `icerecord` VALUES (1,100,'2010-07-31'); 
INSERT INTO `icerecord` VALUES (2,200,'2010-07-30'); 
INSERT INTO `icerecord`