`
z276356445t
  • 浏览: 152106 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

DbUtils学习

    博客分类:
  • Java
阅读更多
今天花了一晚上的时间来学习dbutils,其实一开始都不知道有这个东西,都是通过一师兄说的,说这东西挺好用,操作又简单,于是就怀揣着一颗好奇的心去学习了一下dbutils。本身dbutils就是对jdbc做了一层薄薄的封装,前段时间也学习过JdbcTemplate,自己做了一下比较,感觉这俩东西很相似,毕竟都是对JDBC简单的封装,但是自我感觉dbutils更简单,更易于操作,对jdbc封装的更薄

既然是使用别人的东西,当然得把它的东西加进来。其实很小,这个包又不依赖于其他包,就只有一个包而已,然后再加上我们自己还要使用到的一些到,既然是对数据库操作,数据库的驱动包当然不能少了,我这里使用的mysql,再加上一个log4j。


下面直接来看一下例子吧。为了更省事,我将DAO层又简单的封装了一层。首先提取一个DAO接口。
/**
 * 
 */
package org.byent.dao;

import java.util.List;
import java.util.Map;

/**
 * @author Z.ting 2011-8-10 下午07:57:27
 */
public interface Dao {

	public <T> List<T> findAll(Class<T> clazz);

	public <T> T findById(Class<T> clazz, int id);

	public long insert(String sql, Object... args);

	public long update(String sql, Object... args);

	public List<Map<String, Object>> executeQuery(String sql, Object... args);

	public long executeUpdate(String sql, Object... args);

	public void delete(String sql, Object... args);

	public int[] batchUpdate(String sql, Object[][] objs);

}


这里边就是定义一些CRUD的操作,大家对这个应该不陌生了。现在接口有了,当然需要写一个实现类来完成这个接口所定义的一些工作咯,下面来看下DAO的实现类。

/**
 * 
 */
package org.byent.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.log4j.Logger;
import org.byent.dao.Dao;

import com.mysql.jdbc.JDBC4Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

/**
 * @author Z.ting 2011-8-10 下午08:05:06
 */
public class DaoImpl implements Dao {

	private MysqlDataSource dataSource = new MysqlDataSource();

	private QueryRunner qryRun = null;

	private Logger logger = Logger.getLogger(getClass());

	private java.sql.DatabaseMetaData dbmb;

	public DaoImpl() {
		dataSource.setUrl("jdbc:mysql://localhost:3306/blog");
		dataSource.setUser("root");
		dataSource.setPassword("zhangting");
		qryRun = new QueryRunner(dataSource);
		dbmb = getDatabaseMetaData();
	}

	private java.sql.DatabaseMetaData getDatabaseMetaData() {
		Properties info = new Properties();
		info.setProperty("user", "root");
		info.setProperty("password", "zhangting");
		java.sql.DatabaseMetaData metaData = null;
		try {
			metaData = new JDBC4Connection("localhost", 3306, info, "blog", null).getMetaData();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return metaData;
	}

	@Override
	public <T extends Object> List<T> findAll(Class<T> clazz) {
		ResultSetHandler<List<T>> rsh = new BeanListHandler<T>(clazz);
		List<T> result = null;
		try {
			result = qryRun.query("select * from " + clazz.getSimpleName(), rsh);
			logger.debug("SQL: select * from " + clazz.getSimpleName());
		} catch (SQLException e) {
			logger.error("Can not this query table " + clazz.getSimpleName(), e);
		}
		return result;
	}

	@Override
	public <T> T findById(Class<T> clazz, int id) {
		ResultSetHandler<T> rsh = new BeanHandler<T>(clazz);
		T result = null;
		try {
			ResultSet rs = dbmb.getPrimaryKeys(null, null, clazz.getSimpleName());
			String primary_key = null;
			while (rs.next()) {
				primary_key = rs.getString("Column_name");
			}
			if (!"".equals(primary_key) || null != primary_key) {
				result = qryRun.query("select * from " + clazz.getSimpleName() + " where " + primary_key + "=?", rsh, new Object[] { id });
				logger.debug("SQL: select * from " + clazz.getSimpleName() + " where " + primary_key + "=" + id);
			} else {
				logger.error("This table " + clazz.getSimpleName() + " has not primary key");
				throw new SQLException("This table has not primary key");
			}
		} catch (SQLException e) {
			logger.error("Can not this query table " + clazz.getSimpleName(), e);
		}
		return result;
	}

	@Override
	public List<Map<String, Object>> executeQuery(String sql, Object... args) {
		MapListHandler rsh = new MapListHandler();
		List<Map<String, Object>> result = null;
		try {
			result = qryRun.query(sql, rsh, args);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public long insert(String sql, Object... args) {
		return executeUpdate(sql, args);
	}

	@Override
	public long update(String sql, Object... args) {
		return executeUpdate(sql, args);
	}

	@Override
	public void delete(String sql, Object... args) {
		executeUpdate(sql, args);
	}

	@Override
	public long executeUpdate(String sql, Object... args) {
		long id = 0;
		try {
			id = qryRun.update(sql, args);
		} catch (SQLException e) {
			logger.error("This table can not changed !", e);
		}
		return id;
	}

	@Override
	public int[] batchUpdate(String sql, Object[][] objs) {
		int[] ids = null;
		try {
			ids = qryRun.batch(sql, objs);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return ids;
	}
}


看见这个QueryRunner了吗,这个类就是我们应该控制的类。然后对数据库的一步步工作都由这个东西来帮我们完成了。

是不是突然觉得真的很简单?简简单单的一个调用就把一切工作都帮我们完成了,其实我们使用到的无非就是query、update、batch操作。

操作完成的结果都是由实现ResultSetHandler此接口的类来完成的。看一下我们都可以将结果包装成什么类型来返回给客户端吧。



看一下吧,都是我们常用到的容器类。实现一些常用的结果返回已经足够了。再来看一下它的core包。


BasicRowProcessor与BeanRowProcessor主要是将数据库的记录封装到各个容器与bean文件中。DbUtils主要就是完成了以前ResultSet,Connection,statement这些个的关闭啊,回滚啊。一些个我们以前写个简单查询就要噼里啪啦写一大堆的东西。现在没那么麻烦了,因为DbUtils已经帮我们完成了。

接下来再写个测试类来测试一下是否通过吧。
package org.byent.dao.impl.test;

import java.util.List;
import java.util.Map;

import junit.framework.Assert;

import org.byent.dao.Dao;
import org.byent.dao.impl.DaoImpl;
import org.byent.pojo.Sex;
import org.junit.Before;
import org.junit.Test;

public class DaoImplTest {

	private Dao dao;

	@Before
	public void testDaoImpl() {
		dao = new DaoImpl();
	}

	@Test
	public void testFindAll() {
		List<Sex> result = dao.findAll(Sex.class);
		Assert.assertEquals(result.size(), 6);
	}

	@Test
	public void testFindById() {
		Sex sex = dao.findById(Sex.class, 4);
		Assert.assertEquals(sex.getSex_mc(), "男");
	}

	@Test
	public void testExecuteQuery() {
		List<Map<String, Object>> result = dao.executeQuery("select * from sex where sex_id=?", new Object[] { 1 });
		Assert.assertEquals(result.get(0).get("sexId"), "女");
	}

	@Test
	public void testInsert() {
		long id = dao.insert("insert into sex (sex_mc) values (?)", new Object[] { "男" });
		Assert.assertNotNull(id);
	}

	@Test
	public void testUpdate() {
		long id = dao.update("update sex set sex_mc=? where sex_id=?", new Object[] { "男", 5 });
		Assert.assertEquals(id, 5);
	}

	@Test
	public void testDelete() {
		dao.delete("delete from sex where sex_id=?", new Object[] { 5 });
	}

	// @Test
	public void testExecuteUpdate() {

	}

	@Test
	public void testBatchUpdate() {
		Object[][] objs = new Object[][] { { "man" }, { "women" }, { "man" } };
		int[] ids = dao.batchUpdate("insert into sex (sex_mc) values(?)", objs);
		Assert.assertEquals(3, ids.length);
	}

}

亮绿灯了,表明测试已经通过。

PS:现在操作数据库的框架可真多啊,东西多了,学习起来还真是个麻烦的事,打好基础才是王道,现在所谓的持久化框架最终还是基于JDBC开发。效率高才是真的好。

看一下官方给的Example:http://commons.apache.org/dbutils/examples.html
然后自己再深入到源码看一下就一切都明白了。


  • 大小: 30.4 KB
  • 大小: 20.9 KB
  • 大小: 16.1 KB
分享到:
评论

相关推荐

    Dbutils学习源码总结

    apache下面有很多值得学习的开源项目,尤其是commons系列,在此,特封装了其组织下的dbutils根据,方便了喜欢使用sql开发的java朋友,里面有各种实用的封装类和对数据库操作的接口,欢迎下载!

    dbutils学习实例

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

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

    通过学习和实践这个简易DBUtils,你将深入理解数据库连接池的工作原理,掌握PreparedStatement的使用,熟悉数据库事务管理,以及了解如何在Java应用中封装和简化数据库操作。此外,这也有助于你理解Apache DBUtils的...

    commons-dbutils.jar.rar

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

    commons-dbutils-1.4.jar

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

    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代码,提高了开发效率。

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

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

    DbUtils的Jar包

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

    dbutils-1.3架包和源码

    源代码可以用于学习、调试和贡献到开源项目中。 标签"dbutils"和"jdbc"揭示了DBUtils的核心功能。DBUtils主要与JDBC接口协同工作,提供了一系列便捷的API来执行SQL查询、处理结果集、管理事务以及处理数据库连接。...

    DButils 的源代码

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

    commons-dbutils-1.6

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

    DbUtils-1.7.zip

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

    dbutils数据库连接池

    数据库连接池是数据库管理中的一个重要概念,它有效地管理和复用数据库连接,以提高数据库操作的效率和系统的资源利用率。...通过学习和实践,我们可以更好地理解和利用这些工具,优化我们的数据库应用。

    JDBC学习(九)dbUtils原理代码实例

    JDBC学习(九)dbUtils原理代码实例,包含三个demo:正常C3P0数据库池对数据库的增删改查操作;自己实现dbutils对数据库实现增删改查操作;使用apache的工具类dbutils对数据库增删改查操作。

    DButils使用实例

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

    dbutils1.6

    6. **源码分析**: 通过查看源码,开发者可以深入了解DBUtils如何封装和优化JDBC,学习其内部设计模式,如工厂模式、装饰器模式等。 7. **文档**: 提供的文档可能包括API文档、用户指南和示例,帮助开发者快速上手和...

Global site tag (gtag.js) - Google Analytics