`

DBUtils使用详细示例

阅读更多
  用了好长一段时间JAVA,今天才知道有DBUtils这个东西。看了一下,使用方便,上手很快,是个不错的东西。

一、使用示例
package com.exam.test;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import junit.framework.TestCase;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.exam.db.DbManager;
import com.exam.util.BasicRowProcessorEx;

public class TestSomething extends TestCase {
	public void testDBUtilSelect() {
		Connection conn = DbManager.getInstance().getConnection();

		QueryRunner queryRunner = new QueryRunner();

		try {
			// 返回单行记录,使用Map
			System.out.println("使用Map处理单行记录!");
			Map<String, Object> map = queryRunner.query(conn,
					"select * from tab where rownum=1", new MapHandler(),
					(Object[]) null);

			for (Iterator<Entry<String, Object>> i = map.entrySet().iterator(); i
					.hasNext();) {
				Entry<String, Object> e = i.next();
				System.out.println(e.getKey() + "=" + e.getValue());
			}

			System.out.println("处理多行记录!");
			List<Map<String, Object>> list = queryRunner.query(conn,
					"select * from tab where rownum<=3", new MapListHandler(),
					(Object[]) null);

			for (Iterator<Map<String, Object>> li = list.iterator(); li
					.hasNext();) {
				System.out.println("--------------");
				Map<String, Object> m = li.next();
				for (Iterator<Entry<String, Object>> mi = m.entrySet()
						.iterator(); mi.hasNext();) {
					Entry<String, Object> e = mi.next();
					System.out.println(e.getKey() + "=" + e.getValue());
				}
			}

			System.out.println("使用Bean处理单行记录!");

			// com.exam.test.TestSomething.Tab
			Tab tab = queryRunner.query(conn,
					"select tname from tab where rownum=1",
					new BeanHandler<Tab>(Tab.class));
			System.out.println("tname=" + tab.getTname());
			System.out.println("tabtype=" + tab.getTabtype());

			System.out.println("使用Array处理单行记录!");
			Object[] array = queryRunner.query(conn,
					"select * from tab where rownum=1", new ArrayHandler());

			for (int i = 0; i < array.length; i++) {
				System.out.println(array[i]);
			}

			System.out.println("使用Array处理多行记录!");
			List<Object[]> arraylist = queryRunner
					.query(conn, "select * from tab where rownum<=3",
							new ArrayListHandler());

			for (Iterator<Object[]> itr = arraylist.iterator(); itr.hasNext();) {
				Object[] a = itr.next();
				System.out.println("--------------");
				for (int i = 0; i < a.length; i++) {
					System.out.println(a[i]);

				}
			}

			System.out.println("使用ColumnListHandler处理单行记录,返回其中指定的一列!");
			List<Object> colList = queryRunner.query(conn,
					"select * from tab where rownum=1", new ColumnListHandler(
							"tname"));
			for (Iterator<Object> itr = colList.iterator(); itr.hasNext();) {
				System.out.println(itr.next());
			}

			System.out
					.println("使用ScalarHandler处理单行记录,只返回结果集第一行中的指定字段,如未指定字段,则返回第一个字段!");
			Object scalar1 = queryRunner.query(conn, "select * from tab",
					new ScalarHandler("tname"));
			System.out.println(scalar1);
			Object scalar2 = queryRunner.query(conn,
					"select tname,tabtype from tab", new ScalarHandler());
			System.out.println(scalar2);

			// 使用自定义的行处理器
			// Map中的KEY可按输入顺序输出
			System.out.println("使用Map处理单行记录(使用自定义行处理器)!");
			Map<String, Object> linkedmap = queryRunner
					.query(
							conn,
							"select tabtype,tname,'wallimn' as programmer from tab where rownum=1",
							new MapHandler(new BasicRowProcessorEx()),
							(Object[]) null);

			for (Iterator<Entry<String, Object>> i = linkedmap.entrySet()
					.iterator(); i.hasNext();) {
				Entry<String, Object> e = i.next();
				System.out.println(e.getKey() + "=" + e.getValue());
			}

			// 使用自定义的行处理器
			// Map中的KEY可按输入顺序输出
			System.out.println("处理多行记录(使用自定义行处理器)!");
			List<Map<String, Object>> listLinedMap = queryRunner
					.query(
							conn,
							"select tabtype,tname,'wallimn' as programmer from tab where rownum<=3",
							new MapListHandler(new BasicRowProcessorEx()),
							(Object[]) null);

			for (Iterator<Map<String, Object>> li = listLinedMap.iterator(); li
					.hasNext();) {
				System.out.println("--------------");
				Map<String, Object> m = li.next();
				for (Iterator<Entry<String, Object>> mi = m.entrySet()
						.iterator(); mi.hasNext();) {
					Entry<String, Object> e = mi.next();
					System.out.println(e.getKey() + "=" + e.getValue());
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		DbUtils.closeQuietly(conn);
	}

	public void testDBUtilInsertDeleteUpdateSelect() {
		// 建一个简单的测试表,建表脚本如下
		// create table T_DBUTILTEST(
		// id integer,
		// name varchar2(255)
		// );
		Connection conn = DbManager.getInstance().getConnection();

		QueryRunner queryRunner = new QueryRunner(true);

		try {
			queryRunner.update(conn, "delete from T_DBUTILTEST");
			// queryRunner.update(conn, "truncate table T_DBUTILTEST");
			// 插一条
			for (int i = 0; i < 10; i++) {
				queryRunner.update(conn,
						"insert into T_DBUTILTEST (id,name) values (?,?)", i,
						"http://wallimn.iteye.com");
			}

			// 再插多条
			queryRunner.batch(conn,
					"insert into T_DBUTILTEST (id,name) values (?,?)",
					new Object[][] { { 11, "batch:wallimn@sohu.com" },
							{ 12, "batch:wallimn@sohu.com" } });

			// 删除示例
			queryRunner.update(conn, "delete from T_DBUTILTEST where id=1");
			queryRunner.update(conn, "delete from T_DBUTILTEST where id=?", 2);
			queryRunner.batch(conn, "delete from T_DBUTILTEST where id=?",
					new Object[][] { { 3 }, { 4 } });

			// 修改示例
			queryRunner.update(conn,
					"update T_DBUTILTEST set name = ? where id=?", "修改后的新值", 5);

			System.out.println("最终结果显示结果");
			List<Map<String, Object>> list = queryRunner.query(conn,
					"select name,id from T_DBUTILTEST", new MapListHandler(),
					(Object[]) null);

			for (Iterator<Map<String, Object>> li = list.iterator(); li
					.hasNext();) {
				System.out.println("--------------");
				Map<String, Object> m = li.next();
				for (Iterator<Entry<String, Object>> mi = m.entrySet()
						.iterator(); mi.hasNext();) {
					Entry<String, Object> e = mi.next();
					System.out.print(e.getValue());
					System.out.print(",");
				}
				System.out.println();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		DbUtils.closeQuietly(conn);
	}
}


二、自定义扩展
  如果用户想要依照存入Map的顺序显示内容,好像不能直接支持。看了看源码,自定义了一个扩展类。用法在前的代码中有示例。
package com.exam.util;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.dbutils.BasicRowProcessor;

/**
 * 用于apache的dbutil类的功能改进,当需要Map中的Key能按输入的顺序输出时,使用这个类来进行处理。简单改了一下基类。<br/>
 * 编码:wallimn 时间:2012-7-25 上午11:07:06<br/>
 * 版本:V1.0<br/>
 */
public class BasicRowProcessorEx extends BasicRowProcessor {

    private static class CaseInsensitiveLinkedHashMap extends HashMap<String, Object> {
        private final Map<String, String> lowerCaseMap = new LinkedHashMap<String, String>();
        private static final long serialVersionUID = -2848100435296897392L;

        /** {@inheritDoc} */
        @Override
        public boolean containsKey(Object key) {
            Object realKey = lowerCaseMap.get(key.toString().toLowerCase());
            return super.containsKey(realKey);
        }

        /** {@inheritDoc} */
        @Override
        public Object get(Object key) {
            Object realKey = lowerCaseMap.get(key.toString().toLowerCase());
            return super.get(realKey);
        }

        /** {@inheritDoc} */
        @Override
        public Object put(String key, Object value) {
            Object oldKey = lowerCaseMap.put(key.toLowerCase(), key);
            Object oldValue = super.remove(oldKey);
            super.put(key, value);
            return oldValue;
        }

        /** {@inheritDoc} */
        @Override
        public void putAll(Map<? extends String, ?> m) {
            for (Map.Entry<? extends String, ?> entry : m.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();
                this.put(key, value);
            }
        }

        /** {@inheritDoc} */
        @Override
        public Object remove(Object key) {
            Object realKey = lowerCaseMap.remove(key.toString().toLowerCase());
            return super.remove(realKey);
        }
    }
	@Override
	public Map<String, Object> toMap(ResultSet rs) throws SQLException {
        Map<String, Object> result = new CaseInsensitiveLinkedHashMap();
        ResultSetMetaData rsmd = rs.getMetaData();
        int cols = rsmd.getColumnCount();

        for (int i = 1; i <= cols; i++) {
            result.put(rsmd.getColumnName(i), rs.getObject(i));
        }

        return result;
	}

}
6
13
分享到:
评论
16 楼 lgh1992314 2017-06-09  
class DbUtil {
    private static String url = "jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8&useSSL=true";
    private static String username = "root";
    private static String password = "lgh123";

    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}
15 楼 wallimn 2015-08-06  
killpigman 写道
请问Dbutils 怎样操作 已存在的db 文件?

已存在的db文件是什么意思?
14 楼 killpigman 2015-08-04  
请问Dbutils 怎样操作 已存在的db 文件?
13 楼 wallimn 2015-04-06  
说不定 jdbctemplate 是DBUtil的翻版。
12 楼 穿围裙的程序员 2015-04-03  
这不就是spring jdbctemplate 的翻版么?
11 楼 di1984HIT 2015-02-27  
写的很好,谢谢啦
10 楼 wallimn 2014-12-04  
就是用JDBC或者从连接池中获取连接,是个通用的方法,因此代码里没有写。
9 楼 yexiongMYBH 2014-12-04  
兄弟,你这个DBManager是在哪里写的呢?比较好奇你是怎样去得到数据库的connection的。
8 楼 wallimn 2013-09-12  
呵呵,项目可能没有真正的负责人。
7 楼 freezingsky 2013-09-12  
刚到公司看了一下,之前公司的一些产品,里面在数据层的操作花样很多,项目是用spring+struts1+hibernate建立 的,看代码里面又有hiberante又有jdbctemple又有dbutils,我都 无语了。。。
6 楼 wang85lin 2013-06-13  
感谢,学习了。
5 楼 evanzzy 2012-07-27  
Spring有好几个组件,JdbcTemplate是其中的一个,需要和Spring结合使用,比DbUtils功能强,效率相同。
4 楼 wallimn 2012-07-26  
一直没有用过Spring,你说的那个可以单独用吗?
3 楼 evanzzy 2012-07-26  
lz可以试试Spring的JdbcTemplate,比这个更省事儿
2 楼 surpass_li 2012-07-26  
太好了,学习到新东西了,DBuinit还这些功能,谢谢
1 楼 ddrisme 2012-07-26  
mark  it
.good

相关推荐

    DbUtils应用开发例子--DbUtilsExample.zip

    Apache Common DbUtils是操作数据库的组件,对传统操作数据库的类(JDBC)进行二次封装,可以把结果集转化成List。 DbUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。 应用实践小结: 一、...

    commons_dbutils使用说明

    在实际应用中,一个典型的使用示例可能是这样的: ```java // 导入所需的包 import org.apache.commons.dbutils.*; // 加载 JDBC 驱动 DbUtils.loadDriver("com.mysql.jdbc.Driver"); // 创建 QueryRunner 实例 ...

    Apache DbUtils Demo示例

    在本示例中,我们将会探讨如何使用DbUtils进行数据库的连接、查询、更新、插入和删除操作。 1. **连接管理** DbUtils提供了一个`DbUtils`静态类,包含了一系列关于数据库连接的管理方法。例如,`connect(String ...

    dbutils dbutils dbutils dbutils

    # 使用示例 db = MyDatabase() conn = db.get_connection() cursor = conn.cursor() cursor.execute("SELECT * FROM mytable") rows = cursor.fetchall() ``` 在以上代码中,`PooledDB` 创建了一个连接池,每次需要...

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

    本示例着重介绍如何结合`dbutils`与Oracle数据库进行高效的数据处理。 首先,`dbutils`是Apache软件基金会提供的一个开源项目,它基于Java,提供了简单易用的API,使得开发者可以便捷地执行SQL语句,处理结果集,...

    Apache DBUtils使用总结

    以下是一个简单的示例,展示了如何使用 DBUtils 进行数据库操作: ```java import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons....

    DBUtils数据库的使用

    在"SQLiteDemo"这个文件中,可能包含了一个演示如何使用DBUtils与SQLite数据库交互的示例。通常,这样的示例会包括以下步骤: 1. 加载SQLite JDBC驱动,并创建数据库连接。 2. 使用DBUtils的QueryRunner实例执行SQL...

    commons-dbutils使用简单范例--简化jdbc编程

    以下是一个简单的DBUtils使用示例,展示如何执行一个查询并处理结果: ```java import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons....

    commons-dbutils-1.7.jar

    三、DBUtils的使用示例 1. 获取数据库连接: ```java BasicDataSource ds = new BasicDataSource(); ds.setUrl("jdbc:mysql://localhost:3306/test"); ds.setUsername("root"); ds.setPassword("password"); ...

    dbutils api

    本篇文章将深入探讨`dbutils` API的核心概念、主要功能以及使用方法。 ### 1. 核心概念 - **文件系统操作**: `dbutils.fs` 命名空间提供了对分布式文件系统的访问,支持HDFS、S3等存储服务。通过这个API,可以进行...

    C3P0和DButils

    以下是一个简单的示例,展示了如何在Java程序中使用C3P0和DBUtils: ```java import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons....

    dbutils

    **使用示例** 以下是一个基本的使用`dbutils` 查询数据库的例子: ```java import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons....

    commons-utils简化JDBC使用(文档+示例)

    接下来,我们看看"commons-dbutils的使用.pdf"这份文档,它会详细介绍DBUtils的API用法和最佳实践。文档通常会涵盖以下几个部分: 1. **基本使用**:介绍如何创建QueryRunner实例,以及如何执行简单的SQL查询和更新...

    -dbutils使用说明.docx

    在Java编程中,尤其是在处理数据库操作时,Apache Commons DBUtils库是一个非常实用的工具,它简化了JDBC(Java Database Connectivity)的使用。DBUtils提供了一种更安全、更易于管理的方式来进行数据库交互,避免...

    dbutils的jar包和源码

    - **异常处理**: dbutils 使用了统一的异常处理机制,所有与数据库交互相关的异常都被封装为 `DbUtils.DbException`,简化了错误处理流程。 **2. 使用 dbutils 执行 SQL** 使用 dbutils,你可以按照以下步骤执行 ...

    DbUtils的Jar包

    DbUtils是一个在Java开发中广泛使用的数据库操作工具库,它简化了JDBC(Java Database Connectivity)的使用,提供了更加简洁、易用的API接口。DbUtils由Apache软件基金会的Jakarta项目开发,属于Apache Commons系列...

    dbutils工具包和源文件

    **二、dbutils的使用示例** 1. **建立连接**: 首先需要配置JDBC驱动,并通过`DriverManager.getConnection()` 创建数据库连接。 2. **创建QueryRunner对象**: `QueryRunner runner = new QueryRunner(dataSource);...

    dbutils数据库连接池

    首先,我们来详细了解一下`dbutils`库。它主要包含以下几个组件: 1. **PooledDB**: 这是dbutils的核心部分,实现了连接池的功能。它可以根据预设的参数动态地创建和管理数据库连接,比如设置最大连接数,最小连接...

    使用dbutils操作数据库入门

    **使用dbutils操作数据库入门** 在Java开发中,与数据库的交互是不可或缺的一部分。DBUtils(Database Utilities)是由Apache组织提供的一个开源工具包,它简化了数据库操作,使得开发者能够更加便捷地执行SQL语句...

    python-dbutils 简单封装

    这个项目提供了一个简单封装的DBUtils示例,方便快速进行Python数据库操作。请确保已安装`pymysql`库。 ## 使用步骤 1. 导入`MyDbUtils`模块。 2. 创建`DBUtil`对象。 3. 调用`execute_sql`方法执行SQL。 4. 使用...

Global site tag (gtag.js) - Google Analytics