一、什么是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连接池

 import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test; import com.jxlg.domain.User; public class TestSelect { @Test
public void testSelect(){
//创建一个QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
try {
// new ResultSetHandler<List<User>>告诉我们如何封装结果集
List<User> list = qr.query("select * from user", new ResultSetHandler<List<User>>(){
@Override
//query语句执行select语句后,结果一返回值的形式传递过来
public List<User> handle(ResultSet rs) throws SQLException {
List<User> list = new ArrayList<User>();
while(rs.next()){
User u = new User();
u.setId(rs.getInt(1));
u.setUsername(rs.getString(2));
u.setPassword(rs.getString(3));
u.setEmail(rs.getString(4));
u.setBirthday(rs.getDate(5));
list.add(u);
}
return list;
} });
for (User user : list) {
System.out.println(user);
}
} catch (SQLException e) {
e.printStackTrace();
} }
@Test
public void testSelect2(){
//创建一个QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
try {
//执行sql语句,返回结果
List<User> list = qr.query("select * from user where id=? and username=?", new BeanListHandler<User>(User.class),1,"tom");
for (User user : list) {
System.out.println(user);
}
} catch (SQLException e) {
e.printStackTrace();
} }
}

四、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

JavaWeb之DBUtils的更多相关文章

  1. [JavaWeb]关于DBUtils中QueryRunner的一些解读.

    前言:[本文属于原创分享文章, 转载请注明出处, 谢谢.]前面已经有文章说了DBUtils的一些特性, 这里再来详细说下QueryRunner的一些内部实现, 写的有错误的地方还恳请大家指出. Que ...

  2. 【JavaWeb】DbUtils入门之QueryRunner

    DbUtils简介 根据官网的介绍,DbUtils是一种 JDBC Utility Component (翻译过来大概就是:JDBC实用部件),故名思意,和数据库操作有关 官网上的简介也称之为 JDB ...

  3. JavaWeb之DButils整理

    一.DBUtils介绍  apache 什么是dbutils,它的作用 DBUtils是java编程中的数据库操作实用工具,小巧简单实用. 用前导包!!!DBUtils包!!! 二.DBUtils的三 ...

  4. JavaWeb基础—dbutils的简单入门

    简明入门教程,参考:https://www.cnblogs.com/CQY1183344265/p/5854418.html 进行此章节之前,介绍一个JdbcUtils的再次的简单封装 (例如后面需要 ...

  5. 【转载】JavaWeb之DBUtils QueryRunner类对数据表的增、删、查(8种结果集处理方式)、改操作

    一.使用QueryRunner类,实现对数据表的 insert delete update package com.shuhuadream.queryrunner; import java.sql.C ...

  6. [JavaWeb]关于DBUtils中QueryRunner的一些解读(转)

    QueryRunner类 QueryRunner中提供对sql语句操作的API它主要有三个方法 query() 用于执行select update() 用于执行insert/update/delete ...

  7. Javaweb学习笔记8—DBUtils工具包

    今天来讲javaweb的第8阶段学习. DBUtils技术,DBUtils是我们操作数据库很常用的功能,虽然后期使用都是它的封装结果,但是也需要掌握. 老规矩,首先先用一张思维导图来展现今天的博客内容 ...

  8. javaweb学习总结—Apache的DBUtils框架学习

    注明: 本文转载自http://www.cnblogs.com/xdp-gacl/p/4007225.html 一.commons-dbutils简介 commons-dbutils 是 Apache ...

  9. JavaWeb学习总结(十四)--Apache的DBUtils

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

随机推荐

  1. 《R包的分类介绍》

    R分析空间数据(Spatial Data) R机器学习包(Machine Learning) R多元统计包(Multivariate Statistics) R药物(代谢)动力学数据分析包 R计算计量 ...

  2. 常用的JavaScript字符串处理函数及用法

    最近参加了几次前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等,如果你经常参加笔试或者也是一个过来人,相信你也跟我一样,发现字符串的处理是前端招聘过程中最 ...

  3. --@angularJS--$http服务与后台数据交互

    1.httpBasic.html: <!DOCTYPE HTML><html ng-app="app"><head>    <title& ...

  4. UWP锁、解屏后无法响应操作

    UWP的Unity项目,在PC上运行时,如果锁屏(手动或自动)再解锁,游戏画面和进度正常,但是无法进行鼠标.键盘或手柄的操作.这Bug在很多线上的Unity项目中存在. 原因:UWP App的系统事件 ...

  5. Python中执行系统命令常见的几种方法--转载

    Python中执行系统命令常见的几种方法 Python中执行系统命令常见的几种方法有: (1)os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 # 如果再命令行下执 ...

  6. Carthage - 一个简单、去集中化的Cocoa依赖管理器

    作为一名新时代的90后猿 在swift大势所趋的时候  怎能不会Carthage 配置它其实很简单  下面我们一步一步来 (1)打开你的终端 输入 brew update brew install c ...

  7. underscore 1.7.0 api

    它是这个问题的答案:“如果我在一个空白的HTML页面前坐下, 并希望立即开始工作, 我需要什么?“ http://www.css88.com/doc/underscore/#

  8. GreenOpenPaint的实现(一)基本框架

    Win7下的MSPaint是Ribbon的典型运行.这种SDI程序对于图像处理来说是很适合的.利用春节时间,基于之前的积累,我实现GreenOpenPaint,主要就是模拟MSPaint的界面,实现出 ...

  9. 深入探讨 ECMAScript 规范第五版

    深入探讨 ECMAScript 规范第五版 随着 Web 应用开发的流行,JavaScript 越来越受到开发人员的重视.作为 ECMAScript 的变体,JavaScript 语言的很多语法特性都 ...

  10. NSObject头文件解析 / 消息机制 / Runtime解读 (一)

    NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface Clas ...