JavaWeb之DBUtils 一、什么是DBUtils及作用 二、DBUtils的三个核心对象 三、怎么去使用DBUtils框架  四、DBUtils三个核心对象详解  五、使用DBUtils做一个增删改查的例子

  DBUtils是apache公司写的。DBUtils是java编程中的数据库操作实用工具,小巧简单实用。

  DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。

  1.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;

  2.对于数据表的写操作,也变得很简单(只需写sql语句)

  3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象

二、DBUtils的三个核心对象

  2.1、QueryRunner类

    QueryRunner中提供对sql语句操作的API.它主要有三个方法:query() 用于执行select,update() 用于执行insert update delete,batch() 批处理。等下下面的会详细的介绍这几种方法的用法。

  2.2、ResultSetHandler接口

    用于定义select操作后,怎样封装结果集.它总共有9个常用的实现类,下面我会详细的为大家介绍怎么去使用。

  2.3、DbUtils类

    它就是一个工具类,定义了关闭资源与事务处理的方法

三、怎么去使用DBUtils框架

  3.1、使用步骤

    导入相对应的jar包

    创建QueryRunner对象

      使用query方法执行select语句

      使用ResultSetHandler封装结果集

      使用DbUtils类释放资源

  3.2、实例

    注:本人使用的是C3P0连接池

 1 import java.sql.ResultSet;
 2 import java.sql.SQLException;
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.apache.commons.dbutils.QueryRunner;
 7 import org.apache.commons.dbutils.ResultSetHandler;
 8 import org.apache.commons.dbutils.handlers.BeanListHandler;
 9 import org.junit.Test;
10 
11 import com.jxlg.domain.User;
12 
13 public class TestSelect {
14     
15     @Test
16     public void testSelect(){
17         //创建一个QueryRunner对象
18         QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
19         try {
20             // new ResultSetHandler<List<User>>告诉我们如何封装结果集
21             List<User> list = qr.query("select * from user", new ResultSetHandler<List<User>>(){
22                 @Override
23                 //query语句执行select语句后,结果一返回值的形式传递过来
24                 public List<User> handle(ResultSet rs) throws SQLException {
25                     List<User> list = new ArrayList<User>();
26                     while(rs.next()){
27                         User u = new User();
28                         u.setId(rs.getInt(1));
29                         u.setUsername(rs.getString(2));
30                         u.setPassword(rs.getString(3));
31                         u.setEmail(rs.getString(4));
32                         u.setBirthday(rs.getDate(5));
33                         list.add(u);
34                     }
35                     return list;
36                 }
37                 
38             });
39             for (User user : list) {
40                 System.out.println(user);
41             }
42         } catch (SQLException e) {
43             e.printStackTrace();
44         }
45         
46 }
47     @Test
48     public void testSelect2(){
49         //创建一个QueryRunner对象
50         QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
51         try {
52             //执行sql语句,返回结果
53             List<User> list = qr.query("select * from user where id=? and username=?", new BeanListHandler<User>(User.class),1,"tom");
54             for (User user : list) {
55                 System.out.println(user);
56             }
57         } catch (SQLException e) {
58             e.printStackTrace();
59         }
60         
61         }
62 }

 四、DBUtils三个核心对象详解

  4.1、QueryRunner对象

    4.1.1、构造函数

         new QueryRunner(); 它的事务可以手动控制。
                    也就是说此对象调用的方法(如:query、update、batch)参数中要有Connection对象。
           new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。
                              此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。

    4.1.2、常用方法

        JavaWeb之DBUtils
一、什么是DBUtils及作用
二、DBUtils的三个核心对象
三、怎么去使用DBUtils框架
 四、DBUtils三个核心对象详解
 五、使用DBUtils做一个增删改查的例子

                  JavaWeb之DBUtils
一、什么是DBUtils及作用
二、DBUtils的三个核心对象
三、怎么去使用DBUtils框架
 四、DBUtils三个核心对象详解
 五、使用DBUtils做一个增删改查的例子

        JavaWeb之DBUtils
一、什么是DBUtils及作用
二、DBUtils的三个核心对象
三、怎么去使用DBUtils框架
 四、DBUtils三个核心对象详解
 五、使用DBUtils做一个增删改查的例子

        JavaWeb之DBUtils
一、什么是DBUtils及作用
二、DBUtils的三个核心对象
三、怎么去使用DBUtils框架
 四、DBUtils三个核心对象详解
 五、使用DBUtils做一个增删改查的例子

        JavaWeb之DBUtils
一、什么是DBUtils及作用
二、DBUtils的三个核心对象
三、怎么去使用DBUtils框架
 四、DBUtils三个核心对象详解
 五、使用DBUtils做一个增删改查的例子

  4.2、ResultSetHandler接口

    4.2.1、它有9个结果处理器

      ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
      ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
      ColumnListHandler:取某一列的数据。封装到List中。
      KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
      MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
      MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
      ScalarHandler:适合取单行单列数据
      BeanHandler
      BeanListHandler

    4.2.2、实例

       

import static org.junit.Assert.*;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import com.jxlg.domain.User;

public class TestResultSetHandler {

    @Test
    public void test1() {
        //ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            Object[] o = qr.query("select * from user where id=?", new ArrayHandler(),5);
            for (Object object : o) {
                System.out.println(object);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
    }
    
    @Test
    public void test2() throws SQLException {
        //ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Object[]> list = qr.query("select * from user", new ArrayListHandler());
        for (Object[] objects : list) {
            for (Object object : objects) {
                System.out.println(object);
            }
            System.out.println("----------------------");
        }
    }
    
    @Test
    public void test3() throws SQLException {
        //ColumnListHandler:取某一列的数据。封装到List中
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Object> list = qr.query("select username,password from user ", new ColumnListHandler(1));
        for (Object object : list) {
            System.out.println(object);
        }    
    }
    
    @Test
    public void test4() throws SQLException {
        //KeyedHandler:取多条记录,每一条记录封装到一个Map中,
        //再把这个Map封装到另外一个Map中,key为指定的字段值。
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        //大的Map的key是表中的某列数据,小的Map的key是表的列名,所以大的map的key用的是Object类型,小的是String。
        Map<Object, Map<String, Object>> map = qr.query("select * from user", new KeyedHandler(1));
        for (Map.Entry<Object, Map<String,Object>> m : map.entrySet()) {
            System.out.println(m);//就是id至,因为设置了“1”.
            for (Map.Entry<String, Object> mm : m.getValue().entrySet()) {
                System.out.println(mm);//取出小map中的key和value
            }
            System.out.println("--------------------");
        }
        
    }
    
    @Test
    public void test5() throws SQLException {
        //MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Map<String, Object> map = qr.query("select * from user", new MapHandler());
        for (Map.Entry<String, Object> m : map.entrySet()) {
            System.out.println(m.getKey()+"	"+m.getValue());
            //默认取第一行数据,需要去其它行用where加条件
        }
    }
    
    @Test
    public void test6() throws SQLException {
        //MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Map<String, Object>> list = qr.query("select * from user", new MapListHandler());
        
        for (Map<String, Object> map : list) {
            for (Map.Entry<String, Object> m : map.entrySet()) {
                System.out.println(m);    
            }
            System.out.println("-----------");
        }
    }
    
    @Test
    public void test7() throws SQLException {
        //ScalarHandler:适合取单行单列数据
     QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
     Object o = qr.query("select * from user", new ScalarHandler(2));
     System.out.println(o);
    }    
    
    @Test
    public void test8() throws SQLException {
        //BeanHandler:适合取单行单列数据
     QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
     User user = qr.query("select * from user", new BeanHandler<User>(User.class));
     System.out.println(user);
    }    

}

 五、使用DBUtils做一个增删改查的例子

  

import static org.junit.Assert.*;

import java.sql.SQLException;
import java.util.Date;

import javax.crypto.spec.OAEPParameterSpec;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;

public class TestInCURD {

    @Test
    public void testInsert() {
        //创建一个QueryRunner对象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            qr.update("insert into user (username,password,email,birthday)values(?,?,?,?)", "guapi","4646","guapi@163.com",new Date());
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void testUpdate() {
        //创建一个QueryRunner对象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            qr.update("update user set username=?,password=? where id=4 ", "meizimeizi","520520");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    @Test
    public void testDelete() {
        //创建一个QueryRunner对象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            qr.update("delete from user where id=? ",4);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    @Test
    public void testBatch() {
        //创建一个QueryRunner对象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            Object[][] params = new Object[10][]; //高维代表执行多少次sql语句
            for(int i =0;i<params.length;i++){
                params[i] =new Object[]{"guapi"+i,"4646","guapi@163.com",new Date()}; 
            }
            
            qr.batch("insert into user (username,password,email,birthday)values(?,?,?,?)", params );
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    

}

2017-03-06