DBUtils使用详细示例

原文地址:http://wallimn.iteye.com/blog/1606930

使用实例:

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;
importorg.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
importorg.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
importorg.apache.commons.dbutils.handlers.MapListHandler;
importorg.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 map = queryRunner.query(conn,
"select * from tab where rownum=1", new MapHandler(),
(Object[]) null);

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

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

for (Iterator> li = list.iterator();li
.hasNext();) {
System.out.println("--------------");
Map m = li.next();
for (Iterator> mi = m.entrySet()
.iterator(); mi.hasNext();) {
Entry 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.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处理多行记录!");
Listarraylist = queryRunner
.query(conn, "select * from tab where rownum<=3",
new ArrayListHandler());

for (Iteratoritr = 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处理单行记录,返回其中指定的一列!");
ListcolList = queryRunner.query(conn,
"select * from tab where rownum=1", newColumnListHandler(
"tname"));
for (Iteratoritr = colList.iterator(); itr.hasNext();) {
System.out.println(itr.next());
}

System.out
.println("使用ScalarHandler处理单行记录,只返回结果集第一行中的指定字段,如未指定字段,则返回第一个字段!");
Object scalar1 = queryRunner.query(conn, "select * fromtab",
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 linkedmap = queryRunner
.query(
conn,
"select tabtype,tname,'wallimn' as programmer from tab whererownum=1",
new MapHandler(new BasicRowProcessorEx()),
(Object[]) null);

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

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

for (Iterator> li = listLinedMap.iterator();li
.hasNext();) {
System.out.println("--------------");
Map m = li.next();
for (Iterator> mi = m.entrySet()
.iterator(); mi.hasNext();) {
Entry 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 tableT_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 whereid=1");
queryRunner.update(conn, "delete from T_DBUTILTEST whereid=?", 2);
queryRunner.batch(conn, "delete from T_DBUTILTEST whereid=?",
new Object[][] { { 3 }, { 4 } });

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

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

for (Iterator> li = list.iterator();li
.hasNext();) {
System.out.println("--------------");
Map m = li.next();
for (Iterator> mi = m.entrySet()
.iterator(); mi.hasNext();) {
Entry 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;
	}

}


1 对于数据表的读操作 他可以把结果转换成List Array Set等java集合 便于程序员操作; 2 对于数据表的写操作 也变得很简单(只需写sql语句) 3 可以使用数据源 使用JNDI 数据库连接池等技术来优化性能 重用已经构建好的数据库连接对象 而不像php asp那样 费时费力的不断重复的构建和析构这样的对象 DBUtils包括3个包: org apache commons dbutils org apache commons dbutils handlers org apache commons dbutils wrappers DBUtils封装了对JDBC的操作 简化了JDBC操作 可以少写代码 org apache commons dbutils DbUtils 关闭链接等操作 QueryRunner 进行查询的操作 org apache commons dbutils handlers ArrayHandler :将ResultSet中第一行的数据转化成对象数组 ArrayListHandler将ResultSet中所有的数据转化成List List中存放的是Object[] BeanHandler :将ResultSet中第一行的数据转化成类对象 BeanListHandler :将ResultSet中所有的数据转化成List List中存放的是类对象 ColumnListHandler :将ResultSet中某一列的数据存成List List中存放的是Object对象 KeyedHandler :将ResultSet中存成映射 key为某一列对应为Map Map中存放的是数据 MapHandler :将ResultSet中第一行的数据存成Map映射 MapListHandler :将ResultSet中所有的数据存成List List中存放的是Map ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object org apache commons dbutils wrappers SqlNullCheckedResultSet :对ResultSet进行操作 改版里面的 StringTrimmedResultSet :去除ResultSet中中字段的左右空格 Trim ">1 对于数据表的读操作 他可以把结果转换成List Array Set等java集合 便于程序员操作; 2 对于数据表的写操作 也变得很简单(只需写sql语句) 3 可以使用数据源 使用JNDI 数据库连接池等技术来优化性能 重用已经构建好的 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值