学习目标
- 了解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"));
}
}