Apache—DBUtils简介

来源:互联网 发布:安卓应用下载知乎 编辑:程序博客网 时间:2024/06/05 08:48

一、commons-dbutils简介

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

API介绍:
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
工具类

org.apache.commons.dbutils.DbUtils。

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
commons-dbutilsAPI介绍:
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
工具类
org.apache.commons.dbutils.DbUtils

二、QueryRunner类使用讲解

  该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
  QueryRunner类提供了两个构造方法:

  • 默认的构造方法
  • 需要一个 javax.sql.DataSource 来作参数的构造方法。
  • 需要一个 javax.sql.DataSource 来作参数的构造方法。

2.1、QueryRunner类的主要方法

一、public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:

执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。

二、public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 

几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。

三、public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException :

执行一个不需要置换参数的查询操作。

class MyRsultSetHandler implements ResultSetHandler{


@Override
public Object handle(ResultSet resultSet) throws SQLException {
  List<Customer>customers=new ArrayList<>();
  
while(resultSet.next()){
    Integer id=resultSet.getInt(1);
    String name=resultSet.getString(2);
    String email=resultSet.getString(3);
    Date birth=resultSet.getDate(4);
    Customer customer=new Customer(id, name, email, birth);
    customers.add(customer);
   }
return customers;
}
}
/**
* QueryRuner的Query方法的返回值取决于其ResultSetHandler参数的
* handle()方法的返回值。
*/

@Test
public void testQuery(){
//1.创建QueryRunner的实现类
QueryRunner queryRunner=new QueryRunner();
Connection connection=null;

try {
String sql="SELECT customers_id,customers_name,customers_email,customers_birth FROM customers";
connection=new ConnTest().getconnection();

//new MyRsultSetHandler() ;
//可以执行类中的方法
   Object obj=queryRunner.query(connection, sql, new MyRsultSetHandler());
  
   System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
}finally{
ConnTest.release(connection, null, null);
}

}


四、public int update(Connection conn, String sql, Object[] params) throws SQLException:

/**
 * 测试QueryRunner类的update方法
 * 该方法可以 insert、delete、update
 */
@Test
   public void testQueryRunnerUpdate(){
//1.创建QueryRunner的实现类
QueryRunner queryRunner=new QueryRunner();
    //2.使用其update方法
String sql="DELETE FROM customers WHERE customers_id=?";
Connection connection=null;
try {
connection=new ConnTest().getconnection();
queryRunner.update(connection, sql, 5);
} catch (Exception e) {
e.printStackTrace();
}finally{
ConnTest.release(connection, null, null);
}
   }

用来执行一个更新(插入、更新或删除)操作。
五、public int update(Connection conn, String sql) throws SQLException:

用来执行一个不需要置换参数的更新操作。




看源代码的意图是:教你如何的处理这一问题的方法,思维很重要。



Value '0000-00-00' can not be represented as java.sql.Date:

解决办法:

数据库中摸个字段的值是0000-00-00。应该是这样吧


确实是这个原因。。。表中读数据中有一个字段的值是0000-00-00该成2012-05-11就好了。。。

三、ResultSetHandler接口使用讲解

  该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。
  ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)
3.1、ResultSetHandler接口的实现类

ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

ColumnListHandler:将结果集中某一列的数据存放到List中。

BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

举例说明:

/**
 * BeanListHandler:把结果集转化为一个List,该List不为null
 * 但可能为空集合(size()方法返回0)
 * 若sql语句的确定能够查询到记录,List中存在创建
 * BeanListHandler传入到Class对象对应的对象
 */
@Test
public void testBeanListHandler(){
Connection connection=null;
QueryRunner queryRunner=new QueryRunner();
try {
String sql="SELECT customers_id,customers_name,customers_email,customers_birth FROM customers";
connection=new ConnTest().getconnection();
List<Customer>customers=queryRunner.query(connection, sql,new BeanListHandler(Customer.class));
System.out.println(customers);
} catch ( Exception e) {
e.printStackTrace();
}finally{
ConnTest.release(connection, null, null);
}
}

KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

/*
* MapListHandler:将结果集转化为一个Map的list
* Map对应查询一条记录:键:sql查询的猎命(不是雷的别明年)
* 而MapListHandler:返回的多条记录对应的Map的集合
*/
@Test
public void testMapListHandler(){
Connection connection=null;
QueryRunner queryRunner=new QueryRunner();
try {
String sql="SELECT customers_id,customers_name,customers_email,customers_birth FROM customers";
connection=new ConnTest().getconnection();

List<Map<String, Object>> result=queryRunner.query(connection, sql,new MapListHandler());
System.out.println(result);
} catch ( Exception e) {
e.printStackTrace();
}finally{
ConnTest.release(connection, null, null);
}
}



@Test
public void testScalarHandler(){

Connection connection=null;
QueryRunner queryRunner=new QueryRunner();
try {
String sql="SELECT customers_name FROM customers where customers_id=?";
connection=new ConnTest().getconnection();

Object result=queryRunner.query(connection, sql,new ScalarHandler(),7);
System.out.println(result);
} catch ( Exception e) {
e.printStackTrace();
}finally{
ConnTest.release(connection, null, null);
}
}


0 0