如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils。

DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。

1.概述

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

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

Dbutils三个核心功能介绍

  • QueryRunner中提供对sql语句操作的API.
  • ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
  • DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

2.事务的基本概念

事务是指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。

事务ACID特性

  • 原子性(Atomicity)   原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
  • 隔离性(Isolation事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

3.QueryRunner核心类

  • update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
  • query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作
package cn.jxufe.java.chapter12.demo01;

import java.sql.Connection;
import java.sql.SQLException; import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner; import cn.jxufe.java.chapter11.jdbc_util.JDBCUtils; /*
* 使用QueryRunner类,实现对数据表的
* insert delete update
* 调用QueryRunner类的方法 update (Connection con,String sql,Object...param)
* Object...param 可变参数,Object类型,SQL语句会出现?占位符
* 数据库连接对象,自定义的工具类传递
*/
public class Test01QueryRunner {
private static Connection con = JDBCUtils.getConnection(); public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
// insert();
// update();
delete(); } /*
* 定义方法,使用QueryRunner类的方法update向数据表中,添加数据
*/
public static void insert() throws SQLException {
// 创建QueryRunner类对象
QueryRunner qr = new QueryRunner();
String sql = "INSERT INTO sort(sname,sprice,sdesc) VALUES(?,?,?)";
// 将三个?占位符的实际参数,写在数组中
Object[] params = { "体育用品", 289.32, "购买体育用品" };
// 调用QueryRunner类的方法update执行SQL语句
int row = qr.update(con, sql, params);
System.out.println(row);
DbUtils.closeQuietly(con);
} /*
* 定义方法,使用QueryRunner类的方法update将数据表的数据修改
*/
public static void update() throws SQLException {
// 创建QueryRunner类对象
QueryRunner qr = new QueryRunner();
// 写修改数据的SQL语句
String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?";
// 定义Object数组,存储?中的参数
Object[] params = { "花卉", 100.88, "情人节玫瑰花", 4 };
// 调用QueryRunner方法update
int row = qr.update(con, sql, params);
System.out.println(row);
DbUtils.closeQuietly(con);
} /*
* 定义方法,使用QueryRunner类的方法delete将数据表的数据删除
*/
public static void delete() throws SQLException {
// 创建QueryRunner类对象
QueryRunner qr = new QueryRunner();
// 写删除的SQL语句
String sql = "DELETE FROM sort WHERE sid=?";
// 调用QueryRunner方法update
int row = qr.update(con, sql, 8);
System.out.println(row);
/*
* 判断insert,update,delete执行是否成功
* 对返回值row判断
* if(row>0) 执行成功
*/
DbUtils.closeQuietly(con);
} }

4.QueryRunner实现查询操作

query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作

4.1ResultSetHandler结果集处理类

ArrayHandler

将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值

ArrayListHandler

将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

BeanHandler

将结果集中第一条记录封装到一个指定的javaBean中。

BeanListHandler

将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

ColumnListHandler

将结果集中指定的列的字段值,封装到一个List集合中

ScalarHandler

它是用于单数据。例如select count(*) from 表操作。

MapHandler

将结果集第一行封装到Map集合中,Key 列名, Value 该列数据

MapListHandler

将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

4.2JavaBean

JavaBean就是一个类,在开发中常用封装数据。具有如下特性

  1. 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
  2. 提供私有字段:private 类型 字段名;
  3. 提供getter/setter方法:
  4. 提供无参构造
/*
* 账务类
*/
public class ZhangWu {
private int id;
private String name;
private double money;
private String parent; public ZhangWu() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getParent() {
return parent;
}
public void setParent(String parent) {
this.parent = parent;
} @Override
public String toString() { //该方法可以省略
return "ZhangWu [id=" + id + ", name=" + name + ", money=" + money + ", parent=" + parent + "]";
}
}

4.3ArrayHandler与ArrayListHandler查询

  • ArrayHandler:将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
  • ArrayListHandler:将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

    /*
* 结果集第一种处理方法, ArrayHandler
* 将结果集的第一行存储到对象数组中 Object[]
*/
public static void arrayHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
Object[] result = qr.query(con, sql, new ArrayHandler());
for (Object object : result) {
System.out.print(object + " ");
}
}

/*
* 结果集第二种处理方法,ArrayListHandler
* 将结果集的每一行,封装到对象数组中, 出现很多对象数组
* 对象数组存储到List集合
*/
public static void arrayListHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
List<Object[]> result = qr.query(con, sql, new ArrayListHandler());
// 集合的遍历
for (Object[] objs : result) {
// 遍历对象数组
for (Object obj : objs) {
System.out.print(obj + " ");
}
System.out.println();
}
}

4.4BeanHandler与BeanListHandler查询

  • BeanHandler :将结果集中第一条记录封装到一个指定的javaBean中。
  • BeanListHandler :将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中。
// 注意:这个类要是一个public的主类
package cn.jxufe.java.chapter12.demo01; public class Sort {
private int sid;
private String sname;
private double sprice;
private String sdesc; public Sort() {
// TODO Auto-generated constructor stub
} public Sort(int sid, String sname, double sprice, String sdesc) {
this.sid = sid;
this.sname = sname;
this.sprice = sprice;
this.sdesc = sdesc;
} public int getSid() {
return sid;
} public void setSid(int sid) {
this.sid = sid;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public double getSprice() {
return sprice;
} public void setSprice(double sprice) {
this.sprice = sprice;
} public String getSdesc() {
return sdesc;
} public void setSdesc(String sdesc) {
this.sdesc = sdesc;
} @Override
public String toString() {
return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice + ", sdesc=" + sdesc + "]";
}
}
/*
* 结果集第三种处理方法,BeanHandler
* 将结果集的第一行数据,封装成JavaBean对象
* 注意: 被封装成数据到JavaBean对象, Sort类必须有空参数构造
*/
public static void beanHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort ";
// 调用方法,传递结果集实现类BeanHandler
// BeanHandler(Class<T> type)
Sort sort = qr.query(con, sql, new BeanHandler<>(Sort.class));
System.out.println(sort);
}

/*
* 结果集第四种处理方法, BeanListHandler
* 结果集每一行数据,封装JavaBean对象
* 多个JavaBean对象,存储到List集合
*/
public static void beanListHander() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort ";
// 调用方法query,传递结果集处理实现类BeanListHandler
List<Sort> list = qr.query(con, sql, new BeanListHandler<Sort>(Sort.class));
for (Sort s : list) {
System.out.println(s);
}
}

4.5ColumnListHandler与ScalarHandler查询

  • ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中。
  • ScalarHandler:它是用于单数据。例如select count(*) from 表操作。
/*
* 结果集第五种处理方法,ColumnListHandler
* 结果集,指定列的数据,存储到List集合
* List<Object> 每个列数据类型不同
*/
public static void columnListHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort ";
// 调用方法 query,传递结果集实现类ColumnListHandler
// 实现类构造方法中,使用字符串的列名
List<Object> list = qr.query(con, sql, new ColumnListHandler<Object>("sname"));
for (Object obj : list) {
System.out.println(obj);
}
}

/*
* 结果集第六种处理方法,ScalarHandler
* 对于查询后,只有1个结果
*/
public static void scalarHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT COUNT(*) FROM sort";
// 调用方法query,传递结果集处理实现类ScalarHandler
long count = qr.query(con, sql, new ScalarHandler<Long>());
System.out.println(count);
}

4.6MapHandler与MapListHandler查询

/*
* 结果集第七种处理方法,MapHandler
* 将结果集第一行数据,封装到Map集合中
* Map<键,值> 键:列名 值:这列的数据
*/
public static void mapHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
// 调用方法query,传递结果集实现类MapHandler
// 返回值: Map集合,Map接口实现类, 泛型
Map<String, Object> map = qr.query(con, sql, new MapHandler());
// 遍历Map集合
for (String key : map.keySet()) {
System.out.println(key + ".." + map.get(key));
}
}

/*
* 结果集第八种处理方法,MapListHandler
* 将结果集每一行存储到Map集合,键:列名,值:数据
* Map集合过多,存储到List集合
*/
public static void mapListHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
// 调用方法query,传递结果集实现类MapListHandler
// 返回值List集合, 存储的是Map集合
List<Map<String, Object>> list = qr.query(con, sql, new MapListHandler());
// 遍历集合list
for (Map<String, Object> map : list) {
for (String key : map.keySet()) {
System.out.print(key + "..." + map.get(key)+ " ");
}
System.out.println();
}
}

完整代码

package cn.jxufe.java.chapter12.demo01;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map; 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.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler; import cn.jxufe.java.chapter11.jdbc_util.JDBCUtils; /*
* QueryRunner数据查询操作:
* 调用QueryRunner类方法query(Connection con,String sql,ResultSetHandler r, Object..params)
* ResultSetHandler r 结果集的处理方式,传递ResultSetHandler接口实现类
* Object..params SQL语句中的?占位符
*
* 注意: query方法返回值,返回的是T 泛型, 具体返回值类型,跟随结果集处理方式变化
*/
public class Test02QueryRunner {
private static Connection con = JDBCUtils.getConnection(); public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
// arrayHandler();
// arrayListHandler();
// beanHandler();
// beanListHander();
// columnListHandler();
// scalarHandler();
// mapHandler();
mapListHandler();
} /*
* 结果集第一种处理方法, ArrayHandler
* 将结果集的第一行存储到对象数组中 Object[]
*/
public static void arrayHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
Object[] result = qr.query(con, sql, new ArrayHandler());
for (Object object : result) {
System.out.print(object + " ");
}
} /*
* 结果集第二种处理方法,ArrayListHandler
* 将结果集的每一行,封装到对象数组中, 出现很多对象数组
* 对象数组存储到List集合
*/
public static void arrayListHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
List<Object[]> result = qr.query(con, sql, new ArrayListHandler());
// 集合的遍历
for (Object[] objs : result) {
// 遍历对象数组
for (Object obj : objs) {
System.out.print(obj + " ");
}
System.out.println();
}
} /*
* 结果集第三种处理方法,BeanHandler
* 将结果集的第一行数据,封装成JavaBean对象
* 注意: 被封装成数据到JavaBean对象, Sort类必须有空参数构造
*/
public static void beanHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort ";
// 调用方法,传递结果集实现类BeanHandler
// BeanHandler(Class<T> type)
Sort sort = qr.query(con, sql, new BeanHandler<>(Sort.class));
System.out.println(sort);
} /*
* 结果集第四种处理方法, BeanListHandler
* 结果集每一行数据,封装JavaBean对象
* 多个JavaBean对象,存储到List集合
*/
public static void beanListHander() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort ";
// 调用方法query,传递结果集处理实现类BeanListHandler
List<Sort> list = qr.query(con, sql, new BeanListHandler<Sort>(Sort.class));
for (Sort s : list) {
System.out.println(s);
}
} /*
* 结果集第五种处理方法,ColumnListHandler
* 结果集,指定列的数据,存储到List集合
* List<Object> 每个列数据类型不同
*/
public static void columnListHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort ";
// 调用方法 query,传递结果集实现类ColumnListHandler
// 实现类构造方法中,使用字符串的列名
List<Object> list = qr.query(con, sql, new ColumnListHandler<Object>("sname"));
for (Object obj : list) {
System.out.println(obj);
}
} /*
* 结果集第六种处理方法,ScalarHandler
* 对于查询后,只有1个结果
*/
public static void scalarHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT COUNT(*) FROM sort";
// 调用方法query,传递结果集处理实现类ScalarHandler
long count = qr.query(con, sql, new ScalarHandler<Long>());
System.out.println(count);
} /*
* 结果集第七种处理方法,MapHandler
* 将结果集第一行数据,封装到Map集合中
* Map<键,值> 键:列名 值:这列的数据
*/
public static void mapHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
// 调用方法query,传递结果集实现类MapHandler
// 返回值: Map集合,Map接口实现类, 泛型
Map<String, Object> map = qr.query(con, sql, new MapHandler());
// 遍历Map集合
for (String key : map.keySet()) {
System.out.println(key + ".." + map.get(key));
}
} /*
* 结果集第八种处理方法,MapListHandler
* 将结果集每一行存储到Map集合,键:列名,值:数据
* Map集合过多,存储到List集合
*/
public static void mapListHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
// 调用方法query,传递结果集实现类MapListHandler
// 返回值List集合, 存储的是Map集合
List<Map<String, Object>> list = qr.query(con, sql, new MapListHandler());
// 遍历集合list
for (Map<String, Object> map : list) {
for (String key : map.keySet()) {
System.out.print(key + "..." + map.get(key)+ " ");
}
System.out.println();
} }
}

13DBUtils工具类的更多相关文章

  1. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  2. Android—关于自定义对话框的工具类

    开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...

  3. [转]Java常用工具类集合

    转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...

  4. js常用工具类.

    一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...

  5. Guava库介绍之实用工具类

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  6. Java程序员的日常—— Arrays工具类的使用

    这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...

  7. .net使用正则表达式校验、匹配字符工具类

    开发程序离不开数据的校验,这里整理了一些数据的校验.匹配的方法: /// <summary> /// 字符(串)验证.匹配工具类 /// </summary> public c ...

  8. WebUtils-网络请求工具类

    网络请求工具类,大幅代码借鉴aplipay. using System; using System.Collections.Generic; using System.IO; using System ...

  9. JAVA 日期格式工具类DateUtil.java

    DateUtil.java package pers.kangxu.datautils.utils; import java.text.SimpleDateFormat; import java.ut ...

随机推荐

  1. bat语法

    注释 :: 注释无回显 rem 注释有回显 关闭和开启回显 :: 关闭回显 @echo off echo abc :: 开启回显 echo on echo 查看命令帮助说明 rd /? 目录操作 创建 ...

  2. python分别使用多线程和多进程获取所有股票实时数据

    python分别使用多线程和多进程获取所有股票实时数据   前一天简单介绍了python怎样获取历史数据和实时分笔数据,那么如果要获取所有上市公司的实时分笔数据,应该怎么做呢? 肯定有人想的是,用一个 ...

  3. sshd使用

    sshd服务 1.sshd介绍     sshd为secure shell的简称:可以通过网络在主机中开机shell的服务 连接方式(在客户端):ssh username@ip  #文本模式      ...

  4. Hibernate入门简介

    什么是Hibernate框架? Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取 ...

  5. p5349 幂

    分析 https://www.cnblogs.com/cjyyb/p/10822490.html 代码 #include<bits/stdc++.h> using namespace st ...

  6. PhantomJs 与 Casperjs

    利用PhantomJS做网页截图经济适用,但其API较少,做其他功能就比较吃力了. CasperJs是对phantomjs的一次封装.即phantomjs是原生的,而casperjs是封装在以phan ...

  7. linux中也有闹钟alarm, timer, stopwatch, world clock 等等

    stopwatch和timer的区别? timer叫计时器, 是先给出一个时间, 然后从现在开始, 倒数, 减少, 直到时间为0 stopwatch 叫跑錶, 则是从现在开始, 往后 增加时间, 事先 ...

  8. CyclicBarrier 源码分析

    CyclicBarrier CyclicBarrier 是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point) 之后同时释放执行.CyclicB ...

  9. vue-methods方法与computed计算属性的差别

    好吧,我就是单纯的举个例子:实现显示变量 message 的翻转字符串 第一种:methods:我们可以通过在表达式中调用方法来达到同样的效果: 第二种:computed:计算属性 上面的2中方法都实 ...

  10. Java设计模式——单例模式(创建型模式)

    概述   单例模式保证对于每一个类加载器,一个类仅有一个实例并且提供全局的访问.其是一种对象创建型模式.对于单例模式主要适用以下几个场景: 系统只需要一个实例对象,如提供一个唯一的序列号生成器 客户调 ...