30.DBUtils工具使用

学习目标

  • 了解DBUtils常用的API
  • 能熟练使用DBUtils中的API

DBUtils工具介绍

为了更简单的使用JDBC,Apache组织提供了一个工具类库commons-dbutils ,它是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
DBUtils工具的核心是以下两个类:
org.apache.commons.dbutils.QueryRunner --BDManager
org.apache.commons.dbutils.ResultSetHandler—处理结果集

QueryRunner类

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

QueryRunner类提供了一个带参数的构造方法,该 方法以javax.sql.DataSource作为参数传递到QueryRunner的构造 方法中来获取Connection对象。

如: QueryRunner runner=new QueryRunner(C3P0Utils.getDataSource())

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 :

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

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

public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。

ResultSetHandler 接口

该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。

ResultSetHandler 接口的实现类

ArrayHandler:把结果集中的第一行数据转成对象数组。

ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。

BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

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

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

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

KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。

MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

案例演示

1.环境准备

1.1 数据库准备

数据库:
/创建chapter03数据库,然后在数据库中创建一个表user,具体语句如下/

CREATE DATABASE chapter03;
USE chapter03;
CREATE TABLE user(
id INT(3) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
password VARCHAR(20) NOT NULL
);

/向user表插入三条数据,具体语句如下/

INSERT INTO user(name,password)  VALUES('zhangsan','123456');
INSERT INTO user(name,password)  VALUES ('lisi','123456');
INSERT INTO user(name,password)  VALUES ('wangwu','123456');

/使用SELECT语句查询users表,SQL语句如下所示/

SELECT * FROM user;

1.2 jar包

将commons-dbutils-1.6.jar添加到项目中

1.3 C3p0Utils工具类

把原来的JDBCUtils工具类换成C3p0Utils工具类

public class C3p0Utils {
    private static DataSource ds;
    static {
        ds=new ComboPooledDataSource();
    }
    public static DataSource getDataSource(){
        return ds;
    }
}

该工具类创建的连接对象的打开,关闭,释放等都是通过C3p0连接池操作的,用户不用自己写。

1.4 编写User类

private int id;
	private String name;
	private String password;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

2.案例演示

2.1 BeanHandler实现类

BeanHandler实现类是将结果集中的数据封装到对应的javabean实例中,这是实际开发中最常用的结果集处理方法。

  public class ResultSetHandler1 {
    public static void main(String[] args) throws SQLException {
        // 创建QueryRunner对象
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        //sql语句
        String sql="select * from user where id=?";
        User user=(User) runner.query(sql,new BeanHandler(User.class),1);
        System.out.println("name:"+user.getName());
    }
}

2.2 BeanListHandler实现类

BeanListHanlder实现类:将每一行的数据都封装到javabean实例中,并将其存放到list中

public class ResultSetHandler2 {
    public static void main(String[] args) throws SQLException {
        // 创建QueryRunner对象
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        //sql语句
        String sql="select * from user";
        List<User> list=runner.query(sql,new BeanListHandler<>(User.class));
        for(User user:list){
            System.out.println("name:"+user.getName());
        }
    }
}

2.3 ScalarHandler实现类

ScalarHandler实现类:输出结果集中一行数据的指定字段值

public class ResultSetHandler3 {
    public static void main(String[] args) throws SQLException {
        // 创建QueryRunner对象
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        //sql语句
        String sql="select * from user where id=?";
        Object object=(Object) runner.query(sql,new ScalarHandler<>("name"),1);
        System.out.println(object);
    }
}

2.4 ArrayHandler实现类

ArrayHandler:把结果集中的第一行数据转成对象数组。

public class ResultSetTest1 {
    public static void main(String[] args) throws SQLException {
        String sql="select * from user where id=?";
        //该 方法以javax.sql.DataSource作为参数传递到QueryRunner的构造 方法中来获取Connection对象。
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        Object[] arr =(Object[]) runner.query(sql,new ArrayHandler(),1);
        for(int i=0;i<arr.length;i++){
           System.out.println(arr[i]);
        }
    }
}

2.5 ArrayListHandler实现类

ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中

public class ResultSetTest2 {
    public static void main(String[] args) throws SQLException {
        // 创建QueryRunner对象
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        //sql语句
        String sql="select * from user";
        List list=runner.query(sql,new ArrayListHandler());
        Object[] arr=(Object[]) list.get(0);
        Object[] arr1=(Object[]) list.get(1);
        Object[] arr2=(Object[]) list.get(2);
        for(int i=0;i<arr.length;i++)
        {
            System.out.print(arr[i]+", ");
        }
        for(int i=0;i<arr1.length;i++)
        {
            System.out.print(arr1[i]+", ");
        }
        for(int i=0;i<arr2.length;i++)
        {
            System.out.print(arr2[i]+", ");
        }
    }
}

2.6 MapHanlder 实现类

MapHanlder类将结果集数据存成Map映射

public class ResultSetHandler4 {
    public static void main(String[] args) throws SQLException {
        // 创建QueryRunner对象
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        //sql语句
        String sql="select * from user where id=?";
        Map map=(Map) runner.query(sql,new MapHandler(),1);
        System.out.println("map:"+map);
        System.out.println("name:"+map.get("name"));
    }

2.7 MapListHandler实现类

MapListHandler类成功将每一行结果集存成一个Map,并将所有Map存成list

public class ResultSetHandler5 {
    public static void main(String[] args) throws SQLException {
        // 创建QueryRunner对象
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        //sql语句
        String sql="select * from user";
        List list=runner.query(sql,new MapListHandler());
       for(int i=0;i<list.size();i++){
           System.out.println(list.get(i));
       }
    }
}

2.8 ColumnListHandler 实现类

当查询结果集中的一列数据时,可以使用ColumnListHandler类

public class ResultSetHandler6 {
    public static void main(String[] args) throws SQLException {
        // 创建QueryRunner对象
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        //sql语句
        String sql="select * from user";
        List list=runner.query(sql,new ColumnListHandler<>("name"));
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
}

2.9 KeyedHandler实现类

KeyedHandler类将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key(id)把每个Map再存放到一个Map里。

public class ResultSetHandler7 {
    public static void main(String[] args) throws SQLException {
        // 创建QueryRunner对象
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        //sql语句
        String sql="select * from user";
        Map<Object,Map<String,Object>> map=runner.query(sql,new KeyedHandler<>("id"));
        Map<String,Object> umap1=map.get(1);
        System.out.println("第一行map:"+umap1);
        System.out.println("第一行数据的name:"+umap1.get("name"));
    }
}

猜你喜欢

转载自blog.csdn.net/lcachang/article/details/82956826
今日推荐