`

DbUtils学习(一)

阅读更多
以前用惯了Hibernate,一下不用很不习惯,因为Hibernate的确为程序员省下了很多事。很多小的项目都在用Hibernate,暂且不说有没有跨数据库的特性,也不说对象关系映射是否重要,基本的SQL 动作处理也是一件很麻烦的事。
总结一下,至少有三方面比较麻烦:
1. 异常处理。如果直接用JDBC,几乎每个操作都要抛出几个异常,因此代码看起来很不优雅。
2. 创建的对象很多。大多数操作都要显示的建立statement,ResultSet对象,致使代码看起 来很长,其实这些都可以再封装。
3. JavaBean与ResultSet对象的转化。这是一个很枯燥的工作,而且这样的工作还会重复做很多次,严重影响了开发速度。

本来自己计划在有空的时候自己来尝试封装一下的,但哪知前人早把这些事做了,的确令自己汗颜。那就是commons的DbUtils组件。这个组件很小,做的事也不多,但几乎把上面几个问题都处理好了。因此只要花许时间学习一下就可以了,自己何必再去造轮子呢?

下面简单的介绍一下其用法,用JDBC开发,最好建立一件连接池,由于以前在博客里面也介绍过C3P0组件的用法,因此现在直接拿来用就行了。

环境:
commons-dbutils-1.2
junit4.5
c3p0-0.9.1.2
mysql-connector-java-5.1.7


由于DbUtils组件中有一个DbUtils类专门用来处理数据连接的关闭问题,因此以前的那个类也可以去掉一些代码,为了方便阅读,还是把它放在这里吧!

public class ConnectionPool {

	public static void destroy() throws SQLException {
		_instance._destroy();
	}
	public static Connection getConnection() throws SQLException {
		return _instance._getConnection();
	}
	public static Properties getProperties() {
		return _instance._props;
	}
	private ConnectionPool() {
		try {

			// Properties
			ClassLoader classLoader = getClass().getClassLoader();
			_props = new Properties();
			_props.load(classLoader
					.getResourceAsStream("connection-pool.properties"));

			_props.list(System.out);

			// Pooled data source

			String driverClass = _props.getProperty("driver.class");
			String jdbcUrl = _props.getProperty("jdbc.url");
			String user = _props.getProperty("user");
			String password = _props.getProperty("password");

			int minPoolSize = 5;
			try {
				minPoolSize = Integer.parseInt(_props
						.getProperty("min.pool.size"));
			} catch (Exception e) {
			}
			int maxPoolSize = 5;
			try {
				maxPoolSize = Integer.parseInt(_props
						.getProperty("max.pool.size"));
			} catch (Exception e) {
			}
			int acquireIncrement = 5;
			try {
				acquireIncrement = Integer.parseInt(_props
						.getProperty("acquire.increment"));
			} catch (Exception e) {
			}
			_cpds = new ComboPooledDataSource();

			_cpds.setDriverClass(driverClass);
			_cpds.setJdbcUrl(jdbcUrl);
			_cpds.setUser(user);
			_cpds.setPassword(password);

			_cpds.setMinPoolSize(minPoolSize);
			_cpds.setMaxPoolSize(maxPoolSize);
			_cpds.setAcquireIncrement(acquireIncrement);
		} catch (Exception e) {
			_log.error(e);
		}
	}
	private void _destroy() throws SQLException {
		DataSources.destroy(_cpds);
	}
	private Connection _getConnection() throws SQLException {
		return _cpds.getConnection();
	}
	private DataSource _getDataSource(){
		return _cpds;
	}
	public static DataSource getDataSource(){
		return _instance._getDataSource();
	}
	
	private static Log _log = LogFactory.getLog(ConnectionPool.class);
	private static ConnectionPool _instance = new ConnectionPool();
	private Properties _props;
	private ComboPooledDataSource _cpds;

}


更详细的说明可见以前的博客。
要进行基本的查询,也非常的容易,主要用到的对象是DbUtils,QueryRunner,ResultSetHandler

具体用法见如下代码:


.......................
       Connection conn = null;
	
	@Before
	public void init(){
		try {
			conn = ConnectionPool.getConnection();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Test
	public void testWithConnParamQuery() throws SQLException{
		String sql = "select * from user";
		QueryRunner query = new QueryRunner();
		ResultSetHandler bean = new BeanListHandler(User.class);
		
		@SuppressWarnings("unchecked")
		List<User> list = (List<User>) query.query(conn, sql, bean);
		
		for(User user:list){
			System.out.println(user.getName());
		}
	}
	
	@After
	public void close(){
		DbUtils.closeQuietly(conn);
	}
............


上面的代码相对直接用JDBC操作的确简化了很多,主要作用就是查询一个User对象列表。
值得注意的是,上面查询参数加入了conn对象,如果每次查询都要conn,可能也不太好。
所以QueryRunner还一个不需要conn参数的查询,但在创建QueryRunner对象的时候必须要加上一个DataSource对象,这也很简单,因为ComboPooledDataSource 类实现了DataSource接口,所以上面有一个返回DataSource的方法,直接拿来用即可:

..........
        @Test
	public void testNoConnParamQuery() throws SQLException{
		String sql = "select * from user";
		QueryRunner query = new QueryRunner(ConnectionPool.getDataSource());
		ResultSetHandler bean = new BeanListHandler(User.class);
		
		@SuppressWarnings("unchecked")
		List<User> list = (List<User>) query.query(conn, sql, bean);
		
		for(User user:list){
			System.out.println(user.getName());
		}
	}
..............


值得一提的是,query有几种形式:

query(Connection conn, String sql, ResultSetHandler rsh) 
query(Connection conn, String sql, ResultSetHandler rsh, Object[] params) query(String sql, ResultSetHandler rsh) 
query(String sql, ResultSetHandler rsh, Object[] params) 


如果需要加参数,只需要选择有参数的方法即可。当然对应的update方法与此方法完全类似,不毕多说。
分享到:
评论

相关推荐

    模仿DBUtils(自己模仿DBUtils写的简易DBUtils)

    DBUtils是Apache Commons库中的一个组件,它提供了一套简单易用的数据库操作API,用于简化Java中的数据库访问。在本项目中,你将找到一个自己编写的简易DBUtils实现,虽然它不是Apache官方的DBUtils,但其设计思想和...

    commons-dbutils.jar.rar

    **正文** `commons-dbutils.jar.rar` 是一个包含Apache Commons DBUtils库的不同版本的压缩文件,主要用于Java应用程序中的...无论是在学习还是在实际开发中,了解和掌握DBUtils都是提高数据库操作效率的重要一步。

    dbutils学习实例

    **dbutils学习实例** 在Java开发中,数据库操作是必不可少的一部分。DBUtils是Apache Commons库的一个组件,它提供了一个简洁的API,简化了数据库连接、查询以及结果集处理等任务,降低了开发人员处理JDBC的复杂性...

    commons-dbutils-1.3.zip

    Apache Commons DBUtils是一个Java库,它简化了与数据库交互的任务,是Java开发中常用的数据访问工具。...在1.3版本中,虽然不包含最新的特性或优化,但对于许多小型项目或学习用途,它仍然是一个可靠的选择。

    dbutils的jar包和源码

    - **ConnectionPool**: dbutils 也包含了一个简单的数据库连接池,尽管现代应用中通常会使用更复杂的连接池实现,如 C3P0 或 HikariCP,但 ConnectionPool 仍可用于学习和小型项目。 - **异常处理**: dbutils 使用...

    DBUtils数据库的使用

    DBUtils是Java编程环境中一个非常实用的数据库操作工具包,由Apache软件基金会...通过深入学习和实践DBUtils与SQLite的结合使用,开发者可以快速构建可靠的数据库应用,同时避免了大量重复的JDBC代码,提高了开发效率。

    commons-dbutils-1.4.jar

    《Apache Commons DBUtils详解及其在Java数据库操作中的应用》 ...在学习和使用DBUtils时,应重点关注其数据库连接管理、查询结果集处理、SQL执行安全性和批处理功能,这些都是在实际项目中非常实用且频繁用到的功能。

    dbutils-1.3架包和源码

    Apache Commons DBUtils是一个Java库,它为处理数据库连接提供了一个简单且有效的方法。这个库的主要目标是简化数据库操作,使得开发人员能够更专注于SQL查询和业务逻辑,而不是处理底层的数据库连接管理。DBUtils是...

    DbUtils的Jar包

    3. `dbutils-x.x.x-sources.jar`:提供了源代码,方便查看和学习内部实现。 4. 示例代码或帮助文档:可能包含一些示例程序或用户指南,帮助初学者快速上手。 通过这些文件,开发者可以轻松地将DbUtils集成到自己的...

    dbutils + oracle 增删改查批量插入示例

    总的来说,`dbutils + oracle 增删改查批量插入示例`是一个很好的学习资源,它帮助开发者掌握如何在Java项目中有效地进行数据库操作,尤其是在处理大数据量时,批量插入的优势尤为明显。通过理解和实践这个示例,...

    DButils 的源代码

    DButils 是一个非常实用的 Java 数据库连接工具包,它主要为 JDBC 提供了一些便捷的、高度封装的辅助类和方法,简化了数据库操作。HSQldb 是一个纯 Java 的关系型数据库管理系统,常用于测试和小型应用。在这个场景...

    dbutils数据库连接池

    在Python中,dbutils库提供了一种便捷的方式来实现这个功能。dbutils库通常与其他的数据库接口模块(如psycopg2)一起使用,以创建和管理数据库连接池。 首先,我们来详细了解一下`dbutils`库。它主要包含以下几个...

    DbUtils-1.7.zip

    - "commons-dbutils-1.7-src.zip"提供了DbUtils的源代码,开发者可以通过阅读源码了解其内部实现,学习如何处理数据库操作和异常。 - 源代码可以帮助开发者扩展DbUtils,或者根据需求定制自己的数据库访问工具。 ...

    commons-dbutils-1.6

    8. **API简洁**:DBUtils的API设计简洁明了,学习成本低,易于理解和使用。 在描述中提到的"这个压缩包包含commons-dbutils-1.6所需的jar包"表明,这个压缩文件包含了使用DBUtils 1.6版本所需的全部依赖,开发者只...

    DBUtils文档+源码

    DBUtils是Apache软件基金会下的一个开源Java库,它提供了一个简单且健壮的数据库连接工具。这个库的主要目的是简化数据库...通过深入学习和理解DBUtils的源码,我们可以更好地利用这个库,并提升我们的数据库编程能力。

    DButils使用实例

    DButils是Apache的一个开源项目,它是Java编程语言中用于数据库操作的一个实用工具库。这个库主要是为了解决JDBC(Java ...通过学习和掌握DButils的使用,开发者可以更专注于业务逻辑,而不是基础的数据库操作。

    开发类库DButils

    DButils 是一个由 Apache Software Foundation 开发的 Java 类库,用于简化数据库操作。它作为 JDBC(Java Database Connectivity)的一个辅助工具,提供了更加简洁、健壮的API,减轻了开发人员处理数据库连接、执行...

    dbutils框架

    Apache DBUtils(Database Utilities)是一个基于Java的开源数据库操作框架,它由Apache软件基金会提供,旨在简化数据库操作,提高开发效率。DBUtils的核心理念是通过提供一组实用工具类来减少数据库访问代码,使得...

Global site tag (gtag.js) - Google Analytics