- 浏览: 1898937 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
jquery打印指定的div -
GentlemanQc:
...
quartz系列(二)spring3.2.5与quartz2.1.7集群版集成简要说明 -
静夜独窗:
你好,能说一下server.xml增加的配置是怎么影响性能的吗 ...
tomcat7.0性能优化-挑战极限精简版 -
beyondfengyu:
beyondfengyu 写道如果每个客户进程的时间不同步,时 ...
java并发(二十二)分布式锁 -
beyondfengyu:
如果每个客户进程的时间不同步,时间超前的进程是不是更容易得到锁 ...
java并发(二十二)分布式锁
业内流行这么一句话:"三流公司卖产品;二流公司卖服务;一流公司卖标准."
标准就是规范,所以开发中,最难的不是具体功能的实现,而是制定一个开发规范,大家共同去遵守.废话不说了,直接进入正题^-^
一 介绍
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
二 项目应用
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)数据库:
4)代码
DBBase类中演示了如何通过commons-dbutils来操纵数据源.其中应用了类似ORM的思想.List vars = DBBase.getInstance().queryForOList(sql, null, Var.class);这行代码使用时需要注意:
1)Var与数据库中的表icerecord是映射关系,但名字不需要一样;
2)Var中的属性和类型,要与数据库中的字段类型保持一致;
3)Var中的属性要用标准的getter和setter.
具备了上述3个条件,调用queryForOList方法后,commons-dbutils会自动将查询结果进行封装成List.
笔者也进行了对比实验,使用commons-dbutils封装对象,比自行getter&setter的效率高出20倍.传统方法查询后(185条记录)自行封装,需要370毫秒,而使用commons,仅需要23毫秒.
下面也包含了Var类.所有代码经过本人亲自运行测试.希望对大家有所帮助.
总结,这是一个轻量级架构,功能肯定没有JPA和Hibernate强大,仅适用于JDBC编写的应用.同时他更重要的意义是规范.请读者们根据具体项目,选择最适合项目框架进行应用.而不要生搬硬套本代码到那些不适合commons-dbutils的项目中.^-^
而且dbcp和pool的连接池组件都没有用到,还提供下载,博主不要误导朋友们了。
只是核心原理,并不设计具体项目的商业机密
不涉及细节 没什么泄密可言
只是核心原理,并不设计具体项目的商业机密
标准就是规范,所以开发中,最难的不是具体功能的实现,而是制定一个开发规范,大家共同去遵守.废话不说了,直接进入正题^-^
一 介绍
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` VALUES (3,300,'2010-07-29'); INSERT INTO `icerecord` VALUES (4,400,'2010-07-28'); INSERT INTO `icerecord` VALUES (5,500,'2010-07-27'); INSERT INTO `icerecord` VALUES (6,600,'2010-07-26');
4)代码
DBBase类中演示了如何通过commons-dbutils来操纵数据源.其中应用了类似ORM的思想.List vars = DBBase.getInstance().queryForOList(sql, null, Var.class);这行代码使用时需要注意:
1)Var与数据库中的表icerecord是映射关系,但名字不需要一样;
2)Var中的属性和类型,要与数据库中的字段类型保持一致;
3)Var中的属性要用标准的getter和setter.
具备了上述3个条件,调用queryForOList方法后,commons-dbutils会自动将查询结果进行封装成List.
笔者也进行了对比实验,使用commons-dbutils封装对象,比自行getter&setter的效率高出20倍.传统方法查询后(185条记录)自行封装,需要370毫秒,而使用commons,仅需要23毫秒.
下面也包含了Var类.所有代码经过本人亲自运行测试.希望对大家有所帮助.
package test.common.db; import java.sql.SQLException; import java.util.List; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; public class DBBase { private static DBBase dbBase; private static QueryRunner run; private DataSource dataSource; public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } private DBBase() { } private void init() { dbBase = this; run = new QueryRunner(dataSource); } public static DBBase getInstance() { return dbBase; } /** * eg: select count(1) from user * * @param sql * @param params * @return */ public int count(String sql, Object[] params) { Object o = getAnAttr(sql, params); if (o instanceof Integer) { return (Integer) o; } if (o instanceof Long) { Long l = (Long) o; return l.intValue(); } String s = (String) o; try { return Integer.parseInt(s); } catch (NumberFormatException e) { return 0; } } /** * 获得第一个查询第一行第一列 * * @param sql * @param params * @return */ public Object getAnAttr(String sql, Object[] params) { showSql(sql); Object s = null; try { s = run.query(sql, new ScalarHandler(1), params); } catch (SQLException e) { e.printStackTrace(); } return s; } /** * 查询返回单个对象 * * @param sql * @param clazz * @return */ public T queryForObject(String sql, Object param[], Class clazz) { T obj = null; try { showSql(sql); obj = (T) run.query(sql, new BeanHandler(clazz), param); } catch (SQLException e) { e.printStackTrace(); } return obj; } /** * 查询返回list对象 * * @param sql * @param clazz * @return */ public List queryForOList(String sql, Object[] param, Class clazz) { List obj = null; try { showSql(sql); obj = (List) run.query(sql, new BeanListHandler(clazz), param); } catch (SQLException e) { e.printStackTrace(); } return obj; } /** * 保存返回主键 * * @param sql * @param param * @return */ public int storeInfoAndGetGeneratedKey(String sql, Object[] param) { int pk = 0; try { showSql(sql); run.update(sql, param); pk = ((Long) run.query("SELECT LAST_INSERT_ID()", new ScalarHandler(1))).intValue(); } catch (SQLException e) { e.printStackTrace(); } return pk; } /** * 更新 * * @param sql * @return */ public int update(String sql, Object[] param) { int i = 0; try { showSql(sql); i = run.update(sql, param); } catch (SQLException e) { e.printStackTrace(); } return i; } private void showSql(String sql) { System.out.println(sql); } public static void main(String[] args) { DataSource ds = setupDataSource(); DBBase db = new DBBase(); db.setDataSource(ds); db.init(); // 聚合函数查询结果 String sql = "select count(*) from IceRecord"; int result1 = db.count(sql, null); System.out.println("聚合函数查询结果:" + result1); // 通过List封装 sql = "select * from IceRecord"; List vars = DBBase.getInstance().queryForOList(sql, null, Var.class); for (Var var : vars) { System.out.println("通过List封装:" + var.getId() + " " + var.getValue_t() + " " + var.getDate_Time()); } // 插入数据 sql = "insert into IceRecord(value_t) values(?)"; int pk = DBBase.getInstance().storeInfoAndGetGeneratedKey(sql, new Object[] { 1 }); System.out.println("/插入数据:" + pk); // 按条件查询数据 sql = "select Date_Time from IceRecord where id =?"; String result2 = (String) DBBase.getInstance().getAnAttr(sql, new Object[] { 1 }); System.out.println("按条件查询数据:" + result2); } // 初始化数据源 private static DataSource setupDataSource() { BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUsername("root"); ds.setPassword("147258369"); ds.setUrl("jdbc:mysql://127.0.0.1:3306/test"); return ds; } /* 运行结果: select count(*) from IceRecord 聚合函数查询结果:7 select * from IceRecord 通过List封装:1 100.0 2010-07-31 通过List封装:2 200.0 2010-07-30 通过List封装:3 300.0 2010-07-29 通过List封装:4 400.0 2010-07-28 通过List封装:5 500.0 2010-07-27 通过List封装:6 600.0 2010-07-26 通过List封装:7 1.0 insert into IceRecord(value_t) values(?) /插入数据:8 select Date_Time from IceRecord where id =? 按条件查询数据:2010-07-31 */ }
package test.common.db; public class Var { private int id; private float value_t; private String Date_Time; public int getId() { return id; } public void setId(int id) { this.id = id; } public float getValue_t() { return value_t; } public void setValue_t(float valueT) { value_t = valueT; } public String getDate_Time() { return Date_Time; } public void setDate_Time(String dateTime) { Date_Time = dateTime; } }
总结,这是一个轻量级架构,功能肯定没有JPA和Hibernate强大,仅适用于JDBC编写的应用.同时他更重要的意义是规范.请读者们根据具体项目,选择最适合项目框架进行应用.而不要生搬硬套本代码到那些不适合commons-dbutils的项目中.^-^
- commons-dbcp-1.4-bin.zip (1.6 MB)
- 下载次数: 263
- commons-dbcp-1.4-src.zip (1 MB)
- 下载次数: 122
- commons-dbutils-1.3-bin.zip (543 KB)
- 下载次数: 145
- commons-dbutils-1.3-src.zip (130.8 KB)
- 下载次数: 109
- commons-pool-1.5.4-bin.zip (991.7 KB)
- 下载次数: 112
- commons-pool-1.5.4-src.zip (532.9 KB)
- 下载次数: 113
评论
8 楼
hilly
2011-03-03
hilly 写道
此文来自:
http://wnick.iteye.com/blog/694137
是不是啊?
http://wnick.iteye.com/blog/694137
是不是啊?
而且dbcp和pool的连接池组件都没有用到,还提供下载,博主不要误导朋友们了。
7 楼
hilly
2011-03-03
此文来自:
http://wnick.iteye.com/blog/694137
是不是啊?
http://wnick.iteye.com/blog/694137
是不是啊?
6 楼
清晨阳光
2010-08-02
count方法的判断有点麻烦了,可以直接转换为java.lang.Number类型。最后取number.intValue()。Number是Integer,Long等等的父类。
5 楼
itstarting
2010-08-01
以为有点惊喜,嗯
4 楼
JavaEye4Cwy
2010-08-01
只是介绍一下 commons-dbutils 而已,居然扯到规范也就算了,还扯到机密去了,莫名其妙……
3 楼
笑我痴狂
2010-08-01
85977328 写道
lyb520320 写道
现做项目,不怕泄密?
只是核心原理,并不设计具体项目的商业机密
不涉及细节 没什么泄密可言
2 楼
85977328
2010-08-01
lyb520320 写道
现做项目,不怕泄密?
只是核心原理,并不设计具体项目的商业机密
1 楼
lyb520320
2010-07-31
现做项目,不怕泄密?
发表评论
-
commons-pool-1.6.0对象池技术
2013-05-19 23:15 29411.6和1.5最大的区别是支持泛型,编程比较方便 池的大小是 ... -
httpcomponents-client-4.2.4专业的HTTP客户端封装
2013-05-15 08:57 4268在Java领域,谈到网络编程,可能大家脑海里第一反应就是 ... -
commons-net-3.2网络协议的客户端
2013-05-15 08:47 1445Commons项目中封装了各种网络协议的客户端,支持的协议包括 ... -
commons-math-2.1数学运算小工具
2013-05-14 09:13 2097这个工具比较简单,因此不多介绍。直接看段代码吧。 packa ... -
commons-fileupload-1.2.1文件上传
2013-05-13 19:19 1612在servlet3.0之前,文件上传不是很好用,好多地方都需要 ... -
commons-collections-3.2.1数组处理工具包
2013-05-13 14:07 2004该jar包封装了很多关于数组的操作,非常方便。西面给出几个示例 ... -
commons-codec-1.8常用的编码方法
2013-05-13 13:53 2279用来处理常用的编码方法的工具类包,例如DES、SHA1、MD5 ... -
commons-logging-1.1.1日志接口用法
2011-02-11 22:56 3898前言 通过commons-logging-1.1 ... -
commons-email-1.2的初步应用
2011-01-06 20:34 2795需要包 commons-email-1.2.jar mail. ... -
Commons-configuration-1.6设置属性文件(xml,properties)
2010-08-07 08:49 3682Commons-configuration-1.6 主要用来读 ... -
commons-cli-1.2 java启动参数工具包
2010-08-06 11:23 5109CLI 即Command Line Interface,也就是 ... -
Commons-lang-2.5 字符串处理
2010-08-06 11:21 22721) StringUtils 如果 str 为null或者&q ... -
commons-beanutils-1.8.3 动态设置属性
2010-08-05 09:18 2734commons beanutils-动态设置属性 beanut ... -
Commons-lang-2.5 数组相关用法
2010-08-05 09:16 2661废话少说,直接运行看^!^ 看不懂你抽死我~,~ packa ... -
commons-io输入输出操作
2010-07-30 15:34 1613commons是apache下,最著名的框架之一.他收 ... -
commons-dbcp数据库连接池技术
2010-07-15 11:07 4877工作中,遇到了应 ...
相关推荐
它不是ORM框架,如Hibernate或MyBatis,但作为轻量级的工具库,它在处理简单的数据访问任务时表现出色,特别是在那些不希望引入复杂ORM层的项目中。通过结合使用DBUtils和其他Apache Commons库,如Commons DBCP...
总的来说,"commons-dbutils-1.5"是一个轻量级的数据库操作工具,适合那些需要快速、简单数据库访问的项目。它的设计思想和功能在当时(2007年发布)是非常先进的,至今仍然在许多小型项目中广泛使用。如果你正在...
《Apache Commons DBUtils详解》 Apache Commons ...此外,随着Java技术的发展,现代框架如Spring JDBC和MyBatis等提供了更为全面的数据库操作支持,但DBUtils因其轻量级和易用性,仍然在很多项目中被广泛使用。
它是一个轻量级的框架,基于Java JDBC API,旨在使数据库编程变得更加简单和健壮。这个"commons-dbutils-1.3"版本是该库的一个早期版本,但仍然在许多项目中广泛使用,因为它提供了一些核心功能,比如查询结果的处理...
这个"commons-dbutils-1.7-src.zip"压缩包包含了DBUtils 1.7版本的源代码,这对于理解和学习这个轻量级框架的内部工作原理非常有帮助。 DBUtils的核心设计理念是简化JDBC编程,避免常见的错误,如资源管理(如...
8. **轻量级**:DBUtils不是一个完整的ORM框架,它不依赖于任何特定的持久化模型,因此非常轻便,适合各种项目集成。 在1.2版本中,可能包括了如下特性: - 兼容性:与当时的主流JDBC驱动兼容,如MySQL、Oracle、...
DBUtils的核心理念是提供一个简单且轻量级的工具集,用于处理基础的数据库访问任务,比如执行SQL查询、更新语句,以及管理数据库连接。在1.3版本中,它已经相当成熟并被广泛使用,尤其是在那些不需要复杂ORM框架的...
- 由于DBUtils是一个轻量级库,它的依赖较少,主要依赖于JDBC API,因此在项目中引入非常方便,不会增加太多额外的体积。 10. **使用示例**: - 创建数据库连接: ```java Connection conn = DBUtils.get...
Commons-dbutils是Apache软件基金会提供的一个轻量级Java数据库工具库,它是对JDBC API的一种简化封装。DbUtils主要功能包括数据库连接池管理、结果集处理以及异常处理等,通过它,开发者可以更高效、更安全地执行...
Commons DbUtils作为一款轻量级的JDBC封装工具,在不影响性能的前提下极大地简化了数据库操作的复杂度,提升了开发效率。无论是对于初学者还是有经验的开发者来说,都是一个值得学习和使用的优秀工具。通过本文的...
最后,"commons-logging-1.2-bin.zip"是Apache Commons Logging库,它是一个轻量级的日志接口,允许开发者在不修改代码的情况下更换不同的日志实现,如log4j、java.util.logging等。 在Java应用程序中使用这些连接...
DbUtils是Apache软件基金会开发的一个开源Java库,它是一个轻量级的数据库操作工具,用于简化Java中的数据库访问。在标题“DbUtils-1.7.zip”中,我们可以看出这是DbUtils的1.7版本的压缩包。这个版本可能包含了...
Apache Commons DBUtils是Apache软件基金会的一个子项目,其设计目标是作为Java应用程序与关系型数据库进行交互的轻量级工具。DBUtils的核心理念是通过提供一些实用的静态方法来帮助处理数据库操作,减轻开发者的...
Apache Commons DBUtils是一个轻量级的Java数据库连接工具库,它是Apache软件基金会的一个开源项目。它简化了数据库操作,为开发者提供了简单易用的API,使得处理JDBC(Java Database Connectivity)变得更加方便。...
由于其轻量级的特性,DBUtils不会创建许多后台对象,这也有助于提升数据库操作的性能。 5. 透明操作:DBUtils在背后并没有进行复杂的操作,它仅仅是执行查询并处理结果。开发者能够很容易地理解DBUtils的内部工作...
3. dbUtils:这是一个轻量级的Java数据库操作工具,由Apache组织提供。dbUtils主要简化了JDBC编程,通过提供一个QueryRunner类和ResultSetHandler接口,使得数据库的增删改查操作变得简单。它可以帮助开发者避免编写...
总之,DBUtils作为一款轻量级的数据库操作工具,极大地简化了Java开发中与数据库交互的过程,同时提高了系统的稳定性和效率。在实际项目中,结合合适的数据库连接池,它能成为你高效处理数据库任务的好帮手。
DbUtils库主要基于Java的JDBC(Java Database Connectivity)API,它提供了一层轻量级的抽象,减少了编写数据库交互代码的复杂性。以下是一些关于DbUtils的关键知识点: 1. **QueryRunner**: QueryRunner是DbUtils...
DBUtils提供了`BasicDataSource`类,这是一个轻量级的数据源实现。它可以管理数据库连接池,提供连接的获取和释放,避免了手动关闭连接可能导致的资源泄露问题。使用`BasicDataSource`可以方便地设置数据库URL、...