学科分类
目录
Java Web

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集合中,将集合中的所有对象数组打印出来(即数据表中所有的数据)。

点击此处
隐藏目录