ResultSetHandler子类的使用

  • 运用ResultSetHandler的子类能够实现简单的查询操作,不同的子类功能有所不同。
  • 它们均是作为QueryRunner类的<T> T query(String sql, ResultSetHandler<T> rsh)方法中的参数出现。
  • 下面展示了传入不同子类对象起到不同查询作用的代码示例。
  • 下面是示例均实现了查询的功能,通过QueryRunner类中的<T> T query(String sql, ResultSetHandler<T> rsh)方法。当然除了进行查询操作,QueryRunner类中的int update(String sql, Object... params)方法还能够实现增删改的操作。
/*
本次案例需要的jar包如下:
c3p0-0.9.1.2.jar用来实现连接池(数据源)的jar包
commons-dbutils-1.4.jar本次功能实现的核心jar包
hamcrest-core-1.3.jar是Junit中缺失部分
junit-4.12.jar用来进行单元测试
mysql-connector-java-5.0.8-bin.jar用来连接MySQL数据库
*/
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

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.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import entity.User;//这里还需要一个实体类User

public class TestResultSetHandler {
    @Test//ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
    public void tese1() throws SQLException{
        //获取QueryRunner对象,运用带参构造方法。传入的参数是DataSource子类对象
        //传入的参数实际上为new ComboPooledDataSource(),这是c3p0对DataSource的实现类
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Object[] arr  = qr.query("select * from users", new ArrayHandler());

        for (Object o : arr) {
            System.out.println(o);
        }
    }

    @Test//ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
    public void tese2() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Object[]> query = qr.query("select * from users", new ArrayListHandler());

        for (Object[] os : query) {
            for (Object o : os) {
                System.out.println(o);
            }
            System.out.println("--------------");
        }
    }

    @Test //ColumnListHandler:取某一列的数据。封装到List中。
    public void tese3() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Object> list = qr.query("select name,password from users", new ColumnListHandler(2));

        for (Object o : list) {
            System.out.println(o);
        }
    }

    @Test //KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
    public void tese4() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Map<Object,Map<String,Object>> map = qr.query("select * from users", new KeyedHandler(2));

        for (Map.Entry<Object, Map<String,Object>> m : map.entrySet()) {
            System.out.println(m.getKey());
            for (Map.Entry<String, Object> mm : m.getValue().entrySet()) {
                System.out.println(mm.getKey()+"\t"+mm.getValue());
            }
            System.out.println("---------------------");
        }

    }

    @Test//MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
    public void tese5() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Map<String,Object> map = qr.query("select * from users where id=?", new MapHandler(),3);

        for (Map.Entry<String, Object> m : map.entrySet()) {
            System.out.println(m.getKey()+"\t"+m.getValue());
        }

    }

    @Test//MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
    public void tese6() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Map<String,Object>> list = qr.query("select * from users", new MapListHandler());

        for (Map<String, Object> map : list) {
            for (Map.Entry<String, Object> m : map.entrySet()) {
                System.out.println(m.getKey()+"\t"+m.getValue());
            }
            System.out.println("---------------");
        }
    }

    @Test //ScalarHandler:适合取单行单列数据
    public void tese7() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Object o = qr.query("select count(*) from users", new ScalarHandler(1));
        System.out.println(o);
    }

    @Test //BeanHandler:将取出来的数据封装到User对象中,只取一条记录
    public void tese8() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        User user = qr.query("select * from users where id=?", new BeanHandler<User>(User.class),2);
        System.out.println(user);
    }

    @Test //BeanListHandler:将取出来的数据封装到User对象List中,可以取多条记录
    public void tese9() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<User> list = qr.query("select * from users", new BeanListHandler<User>(User.class));

        for(User u : list){
            System.out.println(u);
        }
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值