搜索
您的当前位置:首页正文

commons-dbutils 使用

来源:二三娱乐

commons-dbutils 是什么

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

commons-dbutils 有什么用

  • 简化jdbc编码
  • 优化数据库结果集操作
  • 数据库连接池优化 数据库连接 dbutils优化数据库结果集

DBUtils 的三个核心对象

  • QueryRunner类
  • ResultSetHandler接口
  • DBUtils类
QueryRunner类
QueryRunner中提供对sql语句操作的API
它主要有三个方法:
    * query()用于执行select
        该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。

    * update()用于执行 insert update delete
    * batch() 批处理
ResultSetHandler接口
定义select操作后,怎样封装结果集。
以下 实现ResultSetHandler 接口类
  • ArrayHandler: 把结果集中的第一行数据转成对象数组。
  • ArrayListHandler: 把结果集中的每一行数据都转成一个数组,再存放在list中
  • BeanHandler: 把结果集中的第一行数据封装到一个对应的JavaBean实例中
  • BeanListHandler: 将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里
  • ColumnListHandler: 将结果集中某一列的数据存放到List中。
  • KeyedHandler(name):将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key。
  • MapHandler: 将结果集中的第一样数据封装到一个Map里,key是列明,value就是对应的值
  • MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
DBUtils类
它就是一个工具类,定义了关闭资源与事务处理的方法
  • close()方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。

  • closeQuietly()这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception

  • commitAndCloseQuietly() 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。

  • loadDriver() 这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。

代码示例
数据库连接池
public class C3P0Util {
    //得到一个数据源
    private static DataSource dataSource = new ComboPooledDataSource();
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("服务器错误");
        }
    }
    
    public static DataSource getDataSource() {
        return dataSource;
    }

    public static void setDataSource(DataSource dataSource) {
        C3P0Util.dataSource = dataSource;
    }

    public static void release(Connection conn, Statement stmt, ResultSet rs) {

        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }

}

//insert
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
qr.update("insert into tags(tag,name,money,author) value(?,?,?,?)", "乱码","否", 100.2045, "李浩");

//update 
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
qr.update("update tags set tag=? where id=?","90后",2);

//delete
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
qr.update("delete from tags where id=3");

//batch
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Object[][] params = new Object[10][];
for(int i=0;i<params.length;i++) {
    params[i]= new Object[]{"这是tag"+i,"李浩"+i,10+i,"小米"+i};
}
qr.batch("insert into tags(tag,name,money,author) value(?,?,?,?) ", params);

//select 结果集
ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Object[] arr = qr.query("select * from tags where id=5",new ArrayHandler());
for(int i=0;i<arr.length;i++) {
    System.out.println(arr[i]);
}

ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
  List<Object[]> datas = qr.query("select * from tags", new ArrayListHandler());
  for(Object[] data:datas) {
        for(int i=0;i<data.length;i++) {
            System.out.print(data[i]+"\t");
        }
        System.out.println("-------------------------------------");
  }

ColumnListHandler:取某一列的数据。封装到List中。  
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<Object> datas = qr.query("select * from tags", new ColumnListHandler(1));
for(Object data:datas) {
    System.out.println(data);
}

MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Map<String, Object> datas = qr.query("select * from tags", new MapHandler());
for(Map.Entry<String, Object> data:datas.entrySet()) { 
    System.out.println(data.getKey()+"  "+data.getValue());
}

MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<Map<String, Object>> datas = qr.query("select * from tags",new MapListHandler());
for(Map<String, Object> data2:datas) {
    for(Map.Entry<String, Object> data:data2.entrySet()) { 
        System.out.println(data.getKey()+"  "+data.getValue());
    }
    System.out.println("--------------------------------------");
}

ScalarHandler:适合取单行单列数据
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Object data = qr.query("select count(*) from tags",new ScalarHandler());
System.out.println(data);

BeanHandler:讲结果集中的第一行封装到一个对应的javabean实例中
QueryRunner qr =new QueryRunner(C3P0Util.getDataSource());
Tag tag = qr.query("select * from tags where id=6", new BeanHandler<Tag>(Tag.class));
System.out.println(tag);

BeanListHandler: 将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里 
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<Tag> datas = qr.query("select * from tags ",new BeanListHandler<Tag>(Tag.class));
for(Tag tag : datas) {
    System.out.println(tag);
}

KeyedHandler(name):将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Map<Object, Map<String, Object>> datas = qr.query("select * from tags ",new KeyedHandler(2));
for(Map.Entry<Object, Map<String,Object>> data2 : datas.entrySet()) {
    System.out.println("key "+data2.getKey());
    for(Map.Entry<String,Object> data:data2.getValue().entrySet()) {
        System.out.println(data.getKey() +"  "+ data.getValue());
    }
    System.out.println("------------------------------------");
}

2016.10.30

Top