`

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方法与此方法完全类似,不毕多说。
分享到:
评论

相关推荐

    Apache Dbutils +springmvc 框架demo代码

    commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。 springmvc与springmvc 整合demo

    commons-dbutils-1.6.zip

     commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢...

    Apache Dbutils JDBC 框架demo代码

    commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司...

    java学习笔记之DBUtils工具包详解

    下面小编就为大家分享一篇java学习笔记之DBUtils工具包详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    mysql spring c3p0/dbcp/dbUtils工具支持包

    [Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包 [JavaMail]-收发邮件支持包 [Java_MySQL_jar]Java访问数据库需要的包 [Spring]基于Spring框架的Web应用演示(附带cglib...

    基于计算机视觉和机器学习的人脸检测及人脸识别系统源码+数据资料.zip

    OpenCV2:OpenCV2是一个跨平台计算机视觉和机器学习软件库。 LayUI:layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用。且是国人开发,...

    基于JavaDruid+MySQL实现一个订餐管理系统源码+项目说明.7z

    ②餐桌预定服务 ③工作人员管理服务 ④结账流水服务 2、主要技术: 本项目使用了javaDruid、MySQL、JDBC、MySQL数据库连接池Druid、commons-dbutils等技术,commons-dbutils 是 Apache 组织提供的一个开源 ...

    Java的学习之路,学习JavaEE以及框架时候的一些项目,结合博客和源码,让你受益匪浅,适合Java初学者和刚入门开始学框架者

    [Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包 [JavaMail]-收发邮件支持包 [Java_MySQL_jar]Java访问数据库需要的包 [Spring]基于Spring框架的Web应用演示(附带...

    day_45_bookstore.rar

    本Java视频教程案例是尚硅谷JavaWEB学习完成后的一个总结性案例,由讲师在第45、46、47天带领学员一起完成。 该案例把 JavaWEB 之前学习的大部分技术融合到一起,具体内容涉及:JavaSE、SQL、JDBC、DBUtils、C3P0、...

    2009年博客系统项目

    学习完成Java SE、Java Web基础内容后,由刘老师带领同学手把手开发的第一个Java Web项目,项目中主要使用了:Java SE、JSP、Servlet、Tomcat、MySQL、PowerDesigner、starUML、Dreamweaver、数据库连接池、Commons ...

    ApachDbUtilsTest.java

    commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的...

    ApachDbUtils常见方法.docx

    commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的...

    javaweb博客网站

    1.用的struts2,数据库用的Oracle11g,DAO用的DBUtils,富文本用的百度的UEditor 2.界面风格是仿照博客园的,其实就是扒下来的,所以html有点乱,将就看吧 3.数据库没设计好,外键直接引用的主键属性,所以没做级联...

    MyBatis第一天课堂笔记.docx

    学习过的持久层框架:DBUtils , Hibernate Mybatis就是类似于hibernate的orm持久层框架。 为什么学Mybatis? 1. 目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用Mybatis的公司比hibernate要多。...

    Java基于MVC模式的一个简单购物车实例源码+使用说明.zip

    【资源介绍】 Java基于MVC模式的一个简单购物车实例源码+使用说明.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于...| DBUtils.java | 对数据库操作进行封装

    基于JavaWeb的网上电子购物城项目,实现展示商品、购买商品、提交订单、持久化保存到数据库等基本功能+源代码+文档说明+数据库

    一个基于JavaWeb的网上电子城项目,这个项目可以熟悉MVC开发模式,方便以后学习SSM等技术 使用技术 IDE:Eclipse 数据库:MySQL 数据源:C3P0 JDBC 工具:DBUtils 前端框架:Bootstrap Ajax 解决方案:jQuery + ...

    基于Java语言的Servlet技术完成的图书管理系统源码+部署教程.zip

    本项目是本人在大三阶段,学习完了Java Web相关的知识点,为了对知识点进行总结和更好的掌握,编写的一款基于Java语言,Servlet、Jsp、MySQL等技术的实现的图书借阅管理系统。也是本人第一款独立完成能够实现其功能...

    study:在线学习系统

    学习在线学习系统这里是一个在线学习系统初期技术栈是普通的servlet + jsp + dbutils + c3p0运行需要修改自己的数据库信息在c3p0的配置文件中数据库表在所带的sql文件中需要在自己的C盘创建文件夹FileDir

    day01_eesy_01mybatis.zip

    学习笔记——mybatis的起步(1) 1.什么是框架? 他是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高...

    QueryRunner使用

    QueryRunner使ET ,为了帮助我们更高效的学习工作,从JDBC的繁重代码中解脱出来,详尽介绍了一个简化JDBC操作的组件——DBUtils

Global site tag (gtag.js) - Google Analytics