zoukankan      html  css  js  c++  java
  • DbUtils类基本使用

    一、commons-dbutils简介 

      commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

      commons-dbutilsAPI介绍:

    • org.apache.commons.dbutils.QueryRunner
    • org.apache.commons.dbutils.ResultSetHandler

      工具类

    • org.apache.commons.dbutils.DbUtils

    二、QueryRunner类使用讲解

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

    • 默认的构造方法
    • 需要一个 javax.sql.DataSource 来作参数的构造方法。

    2.1、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:用来执行一个不需要置换参数的更新操作。

    2.2、使用QueryRunner类实现CRUD

    复制代码
      1 package me.gacl.test;
      2 
      3 import java.util.Date;
      4 import java.util.List;
      5 import java.io.File;
      6 import java.io.FileReader;
      7 import java.io.IOException;
      8 import java.sql.SQLException;
      9 import javax.sql.rowset.serial.SerialClob;
     10 import me.gacl.domain.User;
     11 import me.gacl.util.JdbcUtils;
     12 import org.apache.commons.dbutils.QueryRunner;
     13 import org.apache.commons.dbutils.handlers.BeanHandler;
     14 import org.apache.commons.dbutils.handlers.BeanListHandler;
     15 import org.junit.Test;
     16 
     17 /**
     18 * @ClassName: DBUtilsCRUDTest
     19 * @Description:使用dbutils框架的QueryRunner类完成CRUD,以及批处理
     20 * @author: 孤傲苍狼
     21 * @date: 2014-10-5 下午4:56:44
     22 *
     23 */ 
     24 public class QueryRunnerCRUDTest {
     25 
     26     /*
     27      *测试表
     28      create table users(
     29          id int primary key auto_increment, 
     30          name varchar(40),
     31          password varchar(40), 
     32          email varchar(60), 
     33          birthday date 
     34      );
     35      */
     36     
     37     @Test
     38     public void add() throws SQLException {
     39         //将数据源传递给QueryRunner,QueryRunner内部通过数据源获取数据库连接
     40         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     41         String sql = "insert into users(name,password,email,birthday) values(?,?,?,?)";
     42         Object params[] = {"孤傲苍狼","123", "gacl@sina.com", new Date()};
     43         //Object params[] = {"白虎神皇","123", "gacl@sina.com", "1988-05-07"};
     44         qr.update(sql, params);
     45     }
     46     
     47     @Test
     48     public void delete() throws SQLException {
     49 
     50         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     51         String sql = "delete from users where id=?";
     52         qr.update(sql, 1);
     53 
     54     }
     55 
     56     @Test
     57     public void update() throws SQLException {
     58         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     59         String sql = "update users set name=? where id=?";
     60         Object params[] = { "ddd", 5};
     61         qr.update(sql, params);
     62     }
     63 
     64     @Test
     65     public void find() throws SQLException {
     66         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     67         String sql = "select * from users where id=?";
     68         Object params[] = {2};
     69         User user = (User) qr.query(sql, params, new BeanHandler(User.class));
     70         System.out.println(user.getBirthday());
     71     }
     72 
     73     @Test
     74     public void getAll() throws SQLException {
     75         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     76         String sql = "select * from users";
     77         List list = (List) qr.query(sql, new BeanListHandler(User.class));
     78         System.out.println(list.size());
     79     }
     80 
     81     /**
     82     * @Method: testBatch
     83     * @Description:批处理
     84     * @Anthor:孤傲苍狼
     85     *
     86     * @throws SQLException
     87     */ 
     88     @Test
     89     public void testBatch() throws SQLException {
     90         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     91         String sql = "insert into users(name,password,email,birthday) values(?,?,?,?)";
     92         Object params[][] = new Object[10][];
     93         for (int i = 0; i < 10; i++) {
     94             params[i] = new Object[] { "aa" + i, "123", "aa@sina.com",
     95                     new Date() };
     96         }
     97         qr.batch(sql, params);
     98     }
     99     
    100     //用dbutils完成大数据(不建议用)
    101     /***************************************************************************
    102      create table testclob
    103      (
    104          id int primary key auto_increment,
    105          resume text
    106      );
    107      **************************************************************************/
    108     @Test
    109     public void testclob() throws SQLException, IOException{
    110         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
    111         String sql = "insert into testclob(resume) values(?)";  //clob
    112         //这种方式获取的路径,其中的空格会被使用“%20”代替
    113         String path  = QueryRunnerCRUDTest.class.getClassLoader().getResource("data.txt").getPath();
    114         //将“%20”替换回空格
    115         path = path.replaceAll("%20", " ");
    116         FileReader in = new FileReader(path);
    117         char[] buffer = new char[(int) new File(path).length()];
    118         in.read(buffer);
    119         SerialClob clob = new SerialClob(buffer);
    120         Object params[] = {clob};
    121         runner.update(sql, params);
    122     }
    123 }
    复制代码

    三、ResultSetHandler接口使用讲解

      该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。
      ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)

    3.1、ResultSetHandler接口的实现类

    • ArrayHandler:把结果集中的第一行数据转成对象数组。
    • ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
    • BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
    • BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
    • ColumnListHandler:将结果集中某一列的数据存放到List中。
    • KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
    • MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
    • MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

    3.2、测试dbutils各种类型的处理器

    复制代码
      1 package me.gacl.test;
      2 
      3 import java.sql.SQLException;
      4 import java.util.Arrays;
      5 import java.util.List;
      6 import java.util.Map;
      7 import me.gacl.util.JdbcUtils;
      8 import org.apache.commons.dbutils.QueryRunner;
      9 import org.apache.commons.dbutils.handlers.ArrayHandler;
     10 import org.apache.commons.dbutils.handlers.ArrayListHandler;
     11 import org.apache.commons.dbutils.handlers.ColumnListHandler;
     12 import org.apache.commons.dbutils.handlers.KeyedHandler;
     13 import org.apache.commons.dbutils.handlers.MapHandler;
     14 import org.apache.commons.dbutils.handlers.MapListHandler;
     15 import org.apache.commons.dbutils.handlers.ScalarHandler;
     16 import org.junit.Test;
     17 
     18 /**
     19 * @ClassName: ResultSetHandlerTest
     20 * @Description:测试dbutils各种类型的处理器
     21 * @author: 孤傲苍狼
     22 * @date: 2014-10-6 上午8:39:14
     23 *
     24 */ 
     25 public class ResultSetHandlerTest {
     26 
     27     @Test
     28     public void testArrayHandler() throws SQLException{
     29         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     30         String sql = "select * from users";
     31         Object result[] = (Object[]) qr.query(sql, new ArrayHandler());
     32         System.out.println(Arrays.asList(result));  //list  toString()
     33     }
     34     
     35     @Test
     36     public void testArrayListHandler() throws SQLException{
     37         
     38         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     39         String sql = "select * from users";
     40         List<Object[]> list = (List) qr.query(sql, new ArrayListHandler());
     41         for(Object[] o : list){
     42             System.out.println(Arrays.asList(o));
     43         }
     44     }
     45     
     46     @Test
     47     public void testColumnListHandler() throws SQLException{
     48         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     49         String sql = "select * from users";
     50         List list = (List) qr.query(sql, new ColumnListHandler("id"));
     51         System.out.println(list);
     52     }
     53     
     54     @Test
     55     public void testKeyedHandler() throws Exception{
     56         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     57         String sql = "select * from users";
     58         
     59         Map<Integer,Map> map = (Map) qr.query(sql, new KeyedHandler("id"));
     60         for(Map.Entry<Integer, Map> me : map.entrySet()){
     61             int  id = me.getKey();
     62             Map<String,Object> innermap = me.getValue();
     63             for(Map.Entry<String, Object> innerme : innermap.entrySet()){
     64                 String columnName = innerme.getKey();
     65                 Object value = innerme.getValue();
     66                 System.out.println(columnName + "=" + value);
     67             }
     68             System.out.println("----------------");
     69         }
     70     }
     71     
     72     @Test
     73     public void testMapHandler() throws SQLException{
     74         
     75         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     76         String sql = "select * from users";
     77         
     78         Map<String,Object> map = (Map) qr.query(sql, new MapHandler());
     79         for(Map.Entry<String, Object> me : map.entrySet())
     80         {
     81             System.out.println(me.getKey() + "=" + me.getValue());
     82         }
     83     }
     84     
     85     
     86     @Test
     87     public void testMapListHandler() throws SQLException{
     88         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
     89         String sql = "select * from users";
     90         List<Map> list = (List) qr.query(sql, new MapListHandler());
     91         for(Map<String,Object> map :list){
     92             for(Map.Entry<String, Object> me : map.entrySet())
     93             {
     94                 System.out.println(me.getKey() + "=" + me.getValue());
     95             }
     96         }
     97     }
     98     
     99     @Test
    100     public void testScalarHandler() throws SQLException{
    101         QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
    102         String sql = "select count(*) from users";  //[13]  list[13]
    103         int count = ((Long)qr.query(sql, new ScalarHandler(1))).intValue();
    104         System.out.println(count);
    105     }
    106 }
    查看更多随笔:http://www.cnblogs.com/Joke-Jay/
  • 相关阅读:
    1113. Integer Set Partition (25)
    1110. Complete Binary Tree (25)
    1109. Group Photo (25)
    Bender Problem
    格子中输出
    牌型种数
    移动距离
    QQ帐户的申请与登陆(25 分)
    词频统计
    基于HTTP的直播点播HLS
  • 原文地址:https://www.cnblogs.com/Joke-Jay/p/6491637.html
Copyright © 2011-2022 走看看