ArrayHandler和ArrayListHandler
前面的学习中了解了ArrayHandler 和ArrayListHandler类可以将把结果集中的第一行数据转成对象数组。接下来,通过代码实现来学习如何使用ArrayHandler和ArrayListHandler以及两者的区别。具体步骤如下:
(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表,执行结果如下所示:
mysql> SELECT * FROM user;
+----+----------+----------+
| id | name | password |
+----+----------+----------+
| 1 | zhangsan | 123456 |
| 2 | lisi | 123456 |
| 3 | wangwu | 123456 |
+----+----------+----------+
3 rows in set (0.01 sec)
(2)在Eclipse中创建一个名为chapter03的Java工程
首先将JDBC处理事务与数据连接池c3p0数据源小节中例2的c3p0-config.xml文件复制到src目录下,第一章中例1-6的JDBCUtils.java复制到cn.itcast.jdbc.utils包下。注意,一定要将c3p0-config.xml中的数据库名称改为chapter03,同时读者还应该将mysql数据库驱动jar包、c3p0相关jar包以及DBUtils工具的jar包添加到工程的classpath路径下。
为了演示使用ResultSetHandler提供的不同的实现类,首先在cn.itcast.jdbc.example.dao包下创建类BaseDao,写一个通用的查询方法。具体实现方式如例1所示。
例1 BaseDao.java
1 package cn.itcast.jdbc.example.dao;
2 import java.sql.Connection;
3 import java.sql.PreparedStatement;
4 import java.sql.ResultSet;
5 import java.sql.SQLException;
6 import org.apache.commons.dbutils.ResultSetHandler;
7 import cn.itcast.jdbc.utils.JDBCUtils;
8 public class BaseDao {
9 // 优化查询
10 public static Object query(String sql, ResultSetHandler<?> rsh,
11 Object... params) throws SQLException {
12 Connection conn = null;
13 PreparedStatement pstmt = null;
14 ResultSet rs = null;
15 try {
16 // 获得连接
17 conn = JDBCUtils.getConnection();
18 // 预编译sql
19 pstmt = conn.prepareStatement(sql);
20 // 将参数设置进去
21 for (int i = 0; params != null && i < params.length; i++)
22 {
23 pstmt.setObject(i + 1, params[i]);
24 }
25 // 发送sql
26 rs = pstmt.executeQuery();
27 // 让调用者去实现对结果集的处理
28 Object obj = rsh.handle(rs);
29 return obj;
30 } catch (Exception e) {
31 e.printStackTrace();
32 }finally {
33 // 释放资源
34 JDBCUtils.release(rs, pstmt, conn);
35 }
36 return rs;
37 }
38 }
BaseDao类创建完成后,在cn.itcast.jdbc.example.dao包下创建类ResultSetTest1,编写一个方法testArrayHandler()来演示ArrayHandler类的用法,具体实现方式如例2所示。
例2 ResultSetTest1.java
1 package cn.itcast.jdbc.example.dao;
2 import java.sql.SQLException;
3 import org.apache.commons.dbutils.handlers.ArrayHandler;
4 public class ResultSetTest1 {
5 public static void testArrayHandler() throws SQLException {
6 BaseDao basedao=new BaseDao();
7 String sql="select * from user where id=?";
8 Object[] arr=
9 (Object[]) basedao.query(sql,new ArrayHandler(),new Object[]{1});
10 for(int i = 0; i < arr.length; i++){
11 System.out.print(arr[i] + ", ");
12 }
13 }
14 public static void main(String[] args) throws SQLException {
15 testArrayHandler();
16 }
17 }
运行ResultSetTest1类,执行结果如图1所示。
图1 运行结果
在例2中,ArrayHandler类将结果集中id为1的一行转化成对象数组,并将数组循环打印出来。由图1可以看出,成功打印出了id为1的数据。
接下来创建类ResultSetTest2,写一个方法testArrayListHandler()来演示ArrayListHandler类的使用方法,具体如例3所示。
例3 ResultSetTest2.java
1 package cn.itcast.jdbc.example.dao;
2 import java.sql.SQLException;
3 import java.util.List;
4 import org.apache.commons.dbutils.handlers.ArrayListHandler;
5 public class ResultSetTest2 {
6 public static void testArrayListHandler() throws SQLException {
7 BaseDao basedao=new BaseDao();
8 String sql="select * from user";
9 List list = (List) basedao.query(sql,new ArrayListHandler());
10 Object[] arr = (Object[]) list.get(0);
11 Object[] arr1 = (Object[]) list.get(1);
12 Object[] arr2 = (Object[]) list.get(2);
13 for(int i = 0; i < arr.length; i++){
14 System.out.print(arr[i] + ", "); }
15 for(int i = 0; i < arr1.length; i++){
16 System.out.print(arr1[i] + ", "); }
17 for(int i = 0; i < arr2.length; i++){
18 System.out.print(arr2[i] + ", ");
19 }
20 }
21 public static void main(String[] args) throws SQLException {
22 testArrayListHandler();
23 }
24 }
运行ResultSetTest2类,执行结果如图2所示。
图2 运行结果
由输出结果可以看出,ArrayListHandler类可以将每一行的数据都转成一个对象数组,并存放到List集合中,将集合中的所有对象数组打印出来(即数据表中所有的数据)。