zoukankan      html  css  js  c++  java
  • DBUtiles中的简单使用(QueryRunner和ResultSetHandler的手动实现)

    DBUtiles是一个很好的处理JDBC的工具类。(DbUtils is a small set of classes designed to make working with JDBC easier )

    DBUtiles中的QueryRunner和ResultSetHandler的手动实现

    其中比较常用的就是QueryRunner类和ResultSetHandler接口。通过它们可以很方便的实现JDBC的功能。

    QueryRunner类,有四个构造方法,其中有的构造方法可以接受一个DataSource

    例如:QueryRunner runner = new QueryRunner(new ComboPooledDataSource());

    当我们获得QueryRunner的实例对象时,就能通过QueryRunner类的方法方便的操作数据库。QueryRunner类主要有三类方法,batch()方法,query()方法,update()方法。

    例如:

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. QueryRunner runner=new QueryRunner(new ComboPooledDataSource());  
    2.         runner.update("insert into account values(null,?,?)","e",888);  
    3.         runner.update("update account set money=0 where name=?", "e");  

    查询的方法稍微麻烦一点,因为我们需要对查询到的结果集进行设置。通常需要把结果集ResultSet封装到JavaBean或者集合或者数组中。

    查看一个方法:  <T> T   query(String sql, ResultSetHandler<T> rsh, Object... params) 

    这里第一个参数是sql语句字符串,第二个参数是一个实现了ResultSetHandler接口的类对象,第三个参数是Object类型的可变参数。返回值是一个T类型。

    如果我们用的eclipse或者MyEclipse 鼠标放到ResutlSetHandlet上面,按F2,会有针对T的说明。<T> the target type the input ResultSet will be converted to.

    意思是,T 代表 ResultSet结果集要装入的目标类型。也就是我们前面提到的数组,集合,甚至javabean.

     

    下面用一段代码来实现把结果集装入一个List数组中。其中Account是一个javaBean,符合account表。

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. public static List test2() throws Exception{  
    2.         QueryRunner runner = new QueryRunner(new ComboPooledDataSource());  
    3.         return runner.query("select * from account where name=?",new ResultSetHandler<List<Account>>(){  
    4.             public List<Account> handle(ResultSet rs) throws SQLException {  
    5.                 List<Account> list = new ArrayList<Account>();  
    6.                 while(rs.next()){  
    7.                     Account acc = new Account();  
    8.                     acc.setId(rs.getInt("id"));  
    9.                     acc.setName(rs.getString("name"));  
    10.                     acc.setMoney(rs.getDouble("money"));  
    11.                     list.add(acc);  
    12.                 }  
    13.                   
    14.                 return list;  
    15.             }  
    16.         } , "a");  
    17.     }  

    接下来,我们用两段代码来模拟QueryRunner和ResultSetHandler的实现原理。

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. package cn.itheima.dbutils;  
    2.   
    3. import java.sql.Connection;  
    4. import java.sql.ParameterMetaData;  
    5. import java.sql.PreparedStatement;  
    6. import java.sql.ResultSet;  
    7. import java.sql.SQLException;  
    8. import java.util.ArrayList;  
    9. import java.util.List;  
    10.   
    11. import javax.sql.DataSource;  
    12.   
    13. import cn.itheima.domain.Account;  
    14.   
    15. import com.mchange.v2.c3p0.ComboPooledDataSource;  
    16.   
    17. public class MyQueryRunner {  
    18.     private DataSource source = null;  
    19.     public MyQueryRunner(DataSource source) {  
    20.         this.source = source;  
    21.     }  
    22.       
    23.     //查询原理:利用MyResourceHandler处理利用sql和objs拼写出来的sql语句查询出来的resultSet,处理  
    24.     public <T> T query(String sql,MyResultSetHandler<T> handler,Object ...objs){  
    25.         Connection conn = null;  
    26.         PreparedStatement ps = null;  
    27.         ResultSet rs = null;  
    28.         try {  
    29.             conn = source.getConnection();  
    30.             ps = conn.prepareStatement(sql);  
    31.             ParameterMetaData metaData = ps.getParameterMetaData();  
    32.             for(int i=1;i<=metaData.getParameterCount();i++){  
    33.                 ps.setObject(i, objs[i-1]);  
    34.             }  
    35.               
    36.             rs = ps.executeQuery();  
    37.             return handler.handle(rs);  
    38.               
    39.         } catch (Exception e) {  
    40.             e.printStackTrace();  
    41.             throw new RuntimeException();  
    42.         } finally {  
    43.             if (rs != null) {  
    44.                 try {  
    45.                     rs.close();  
    46.                 } catch (SQLException e) {  
    47.                     e.printStackTrace();  
    48.                 } finally {  
    49.                     rs = null;  
    50.                 }  
    51.             }  
    52.             if (ps != null) {  
    53.                 try {  
    54.                     ps.close();  
    55.                 } catch (SQLException e) {  
    56.                     e.printStackTrace();  
    57.                 } finally {  
    58.                     ps = null;  
    59.                 }  
    60.             }  
    61.             if (conn != null) {  
    62.                 try {  
    63.                     conn.close();  
    64.                 } catch (SQLException e) {  
    65.                     e.printStackTrace();  
    66.                 } finally {  
    67.                     conn = null;  
    68.                 }  
    69.             }  
    70.         }  
    71.   
    72.     }  
    73.       
    74.       
    75.     public int update(String sql,Object ...objs){  
    76.         Connection conn  = null;  
    77.         PreparedStatement ps = null;  
    78.         try{  
    79.             conn = source.getConnection();  
    80.             ps = conn.prepareStatement(sql);  
    81.             ParameterMetaData metaData = ps.getParameterMetaData();  
    82.             for(int i=1;i<=metaData.getParameterCount();i++){  
    83.                 ps.setObject(i, objs[i-1]);  
    84.             }  
    85.               
    86.             return ps.executeUpdate();  
    87.         }catch (Exception e) {  
    88.             e.printStackTrace();  
    89.             throw new RuntimeException();  
    90.         }finally{  
    91.             if(ps!=null){  
    92.                 try {  
    93.                     ps.close();  
    94.                 } catch (SQLException e) {  
    95.                     e.printStackTrace();  
    96.                 }finally{  
    97.                     ps = null;  
    98.                 }  
    99.             }  
    100.             if(conn!=null){  
    101.                 try {  
    102.                     conn.close();  
    103.                 } catch (SQLException e) {  
    104.                     e.printStackTrace();  
    105.                 }finally{  
    106.                     conn = null;  
    107.                 }  
    108.             }  
    109.         }  
    110.     }  
    111. }  

    MyResultSetHandler接口

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. package cn.itheima.dbutils;  
    2.   
    3. import java.sql.ResultSet;  
    4. import java.sql.SQLException;  
    5.   
    6. public interface  MyResultSetHandler <T>{  
    7.     T handle(ResultSet rs)throws SQLException;  
    8. }  

    当然,实际应用中没有这么麻烦。因为DBUtils已经帮我们实现了很多ResultSetHandler的实现类。通过这些类可以很方便的对结果集进行封装。

     

    ResultSetHandler的实现类

     

     

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
      1. //1.ArrayHandler 将查询结果每一行转换为一个数组对象返回  
      2.         //ResultSetHandler implementation that converts a ResultSet into an Object[]. This class is thread safe.  
      3.         Object[] objs = runner.query("select * from account where name=?",new ArrayHandler() , "c");  
      4.         System.out.println(objs);  
      5.           
      6.         //2.ArrayListHandler 将查询结果的每一行转换为一个Object[]数组,然后装入一个ArrayList集合  
      7.         //ResultSetHandler implementation that converts the ResultSet into a List of Object[]s. This class is thread safe.  
      8.         List<Object[]> list = runner.query("select * from account",new ArrayListHandler() );  
      9.         System.out.println(list);  
      10.   
      11.         //手动实现ArrayListHandler的功能  
      12.   
      13.         public static List test2() throws Exception{  
      14.         QueryRunner runner = new QueryRunner(new ComboPooledDataSource());  
      15.         return runner.query("select * from account where name=?",new ResultSetHandler<List<Account>>(){  
      16.             public List<Account> handle(ResultSet rs) throws SQLException {  
      17.                 List<Account> list = new ArrayList<Account>();  
      18.                 while(rs.next()){  
      19.                     Account acc = new Account();  
      20.                     acc.setId(rs.getInt("id"));  
      21.                     acc.setName(rs.getString("name"));  
      22.                     acc.setMoney(rs.getDouble("money"));  
      23.                     list.add(acc);  
      24.                 }  
      25.                 return list;  
      26.             }  
      27.         } , "a");  
      28.     }  
      29.           
      30.         //3.BeanHandler,将查询结果的第一行转换为一个JavaBean对象返回  
      31.         //ResultSetHandler implementation that converts the first ResultSet row into a JavaBean. This class is thread safe.  
      32.         Account acc = runner.query("select * from account where name=?",new BeanHandler<Account>(Account.class) , "c");  
      33.         System.out.println(acc);  
      34.           
      35.         //4.BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。  
      36.         //ResultSetHandler implementation that converts a ResultSet into a List of beans. This class is thread safe.  
      37.         List<Account> acclist = runner.query("select * from account",new BeanListHandler<Account>(Account.class) );  
      38.         System.out.println(acclist);  
      39.           
      40.         //5.MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。  
      41.         //ResultSetHandler implementation that converts the first ResultSet row into a Map. This class is thread safe.  
      42.         Map map = runner.query("select * from account",new MapHandler() );  
      43.         System.out.println(map);  
      44.           
      45.         //6.MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List  
      46.         //ResultSetHandler implementation that converts a ResultSet into a List of Maps. This class is thread safe  
      47.         List<Map<String, Object>> maplist = runner.query("select * from account",new MapListHandler() );  
      48.         System.out.println(maplist);  
      49.           
      50.         //7.ColumnListHandler:将结果集中某一列的数据存放到List中。  
      51.         //ResultSetHandler implementation that converts one ResultSet column into a List of Objects. This class is thread safe.  
      52.         List<Object> columnList = runner.query("select * from account",new ColumnListHandler(2) );  
      53.         System.out.println(columnList);  
      54.           
      55.         //8.KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。  
      56.         //ResultSetHandler implementation that returns a Map of Maps. ResultSet rows are converted into Maps which are then stored in a Map under the given key.  
      57.         Map<Object, Map<String, Object>> keymap = runner.query("select * from account",new KeyedHandler("id") );  
      58.         System.out.println(keymap);  
      59.           
      60.         //9.ScalarHandler: 单值查询  
      61.         //ResultSetHandler implementation that converts one ResultSet column into an Object. This class is thread safe.  
      62.         //select count(*) from account;  
      63.         Long count = (Long)runner.query("select count(*) from account",new ScalarHandler(1) );  
      64.         System.out.println(count);  
  • 相关阅读:
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分
    1025 反转链表 (25 分
    1024 科学计数法 (20 分
    1023 组个最小数 (20 分)
    将命令的输出保存到文件
    使用与管理控制台历史
    度量命令执行时间
    检查最后运行命令的状态
  • 原文地址:https://www.cnblogs.com/Syria/p/6349531.html
Copyright © 2011-2022 走看看