JavaWeb之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、常用方法

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()+"\t"+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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux(四)之元字符

    一直觉得linux是一个非常高深的东西,但是慢慢学过来其实就是一堆一堆的命令执行,让一个程序运行的结果。 只有你有毅力去学习,并且系统的去学习我相信没有什么恶...

    用户1195962
  • JavaWeb(一)Servlet中乱码解决与转发和重定向的区别

    前言   前面其实已经把Servlet中所有的内容都介绍完了,这篇讲补充一点乱码和重定向与转发之间的区别! 一、request请求参数出现乱码问题 1.1、ge...

    用户1195962
  • MySQL集群(二)之主主复制

    前面介绍了主从复制,这一篇我将介绍的是主主复制,其实听名字就可以知道,主主复制其实就是两台服务器互为主节点与从节点。接下来我将详细的给大家介绍,怎么去配置主主复...

    用户1195962
  • Jetbrains系列激活补丁JetbrainsCrack-2.8更新

    今天看了,JetbrainsCrack有新版本了,版本号是2.8,可成功激活目前所有的 Jetbrains 系列产品,有效期至2099年。

    德顺
  • python3 发送电子邮件

    使用python3发送电子邮件,我之前在网上找了好几篇文章不论是都不行,最后在网上找到这篇文章了!

    py3study
  • [MySQL] innoDB引擎的主键与聚簇索引

    mysql的innodb引擎本身存储的形式就必须是聚簇索引的形式 , 在磁盘上树状存储的 , 但是不一定是根据主键聚簇的 , 有三种情形:

    陶士涵
  • redis info之memory模块详解

    阿dai学长
  • 启动项目成功后,无法通过ip访问解决方案

    24-丰总
  • HashSet集合的add()方法的源码解析

    黑泽君
  • Redis内存碎片清理

    当Redis中清理了大量的Key之后原先Redis申请的内存(used_memory_rss)将继续持有而不会释放,此时查看内存信息将会看到存在大量的内存碎片。...

    July

扫码关注云+社区

领取腾讯云代金券