一、先熟悉DBUtils的API:
简介:DbUtils是一个为简化JDBC操作的小类库。
(一)整个dbutils总共才3个包:
1、包org.apache.commons.dbutils   
接口摘要
ResultSetHandler    将ResultSet转换为别的对象的工具。
RowProcessor        将ResultSet行转换为别的对象的工具。
类摘要
BasicRowProcessor   RowProcessor接口的基本实现类。 
BeanProcessor       BeanProcessor匹配列明到Bean属性名,并转换结果集列到Bean对象的属性中。
DbUtils             一个JDBC辅助工具集合。 
ProxyFactory        产生JDBC接口的代理实现。 
QueryLoader         属性文件加载器,主要用于加载属性文件中的 SQL 到内存中。 
QueryRunner         使用可插拔的策略执行SQL查询并处理结果集。
ResultSetIterator   包装结果集为一个迭代器。
2、包org.apache.commons.dbutils.handlers 
 
ResultSetHandler  接口的实现类
类摘要
AbstractListHandler  将ResultSet转为List的抽象类
ArrayHandler  将ResultSet转为一个Object[]的ResultSetHandler实现类
ArrayListHandler  将ResultSet转换为List<Object[]>的ResultSetHandler实现类
BeanHandler  将ResultSet行转换为一个JavaBean的ResultSetHandler实现类
BeanListHandler  将ResultSet转换为List<JavaBean>的ResultSetHandler实现类
ColumnListHandler  将ResultSet的一个列转换为List<Object>的ResultSetHandler实现类
KeyedHandler  将ResultSet转换为Map<Map>的ResultSetHandler实现类
MapHandler  将ResultSet的首行转换为一个Map的ResultSetHandler实现类
MapListHandler  将ResultSet转换为List<Map>的ResultSetHandler实现类
ScalarHandler  将ResultSet的一个列到一个对象。
3、包org.apache.commons.dbutils.wrappers 
 
添加java.sql类中功能包装类。
类摘要
SqlNullCheckedResultSet  在每个getXXX方法上检查SQL NULL值的ResultSet包装类。
StringTrimmedResultSet  取出结果集中字符串左右空格的ResultSet包装类。

(二)使用DBUtils
其实只是使用的话,只看两个类(DbUtils 和QueryRunner)和一个接口(ResultSethandler)就可以了。
1、DbUtils
DbUtils是一个为做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。
这个类里的重要方法有:
close():
DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,
如果不是的话,它们就关闭连接、声明和结果集(ResultSet)。
CloseQuietly:
CloseQuietly这一方法不仅能在连接、声明或者结果集(ResultSet)为NULL情况下避免关闭,
还能隐藏一些在程序中抛出的SQLEeception。如果你不想捕捉这些异常的话,这对你是非常有用的。
在重载CloseQuietly方法时,特别有用的一个方法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),
这是因为在大多数情况下,连接、声明和结果集(ResultSet)是你要用的三样东西,而且在最后的块你必须关闭它们。
使用这一方法,你最后的块就可以只需要调用这一方法即可。
CommitAndCloseQuietly(Connection conn):
这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些SQL异常。
LoadDriver(String driveClassName):这一方法装载并注册JDBC驱动程序,如果成功就返回TRUE。
使用这种方法,你不需要去捕捉这个异常ClassNotFoundException。使用loadDrive方法,编码就变得更容易理解,
你也就得到了一个很好的Boolean返回值,这个返回值会告诉你驱动类是不是已经加载成功了。
2、ResultSetHandler
这一接口执行处理一个jaca.sql.ResultSet,将数据转变并处理为任何一种形式,这样有益于其应用而且使用起来更容易。
这一组件提供了ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler等执行程序。
ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。
因此任何ResultSetHandler 的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。
因为返回类型是java.lang.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。
如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。
3、QreryRunner
这个类使执行SQL查询简单化了,它与ResultSetHandler串联在一起有效地履行着一些平常的任务,它能够大大减少你所要写的编码。
QueryRunner类提供了两个构造器:其中一个是一个空构造器,另一个则拿一个 javax.sql.DataSource 来作为参数。
因此,在你不用为一个方法提供一个数据库连接来作为参数的情况下,提供给构造器的数据源(DataSource) 被用来获得一个新的连接并将继续进行下去。
这一类中的重要方法包括以下这些:
query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):
这一方法执行一个选择查询,在这个查询中,对象阵列的值被用来作为查询的置换参数。
这一方法内在地处理PreparedStatement 和ResultSet  的创建和关闭。
ResultSetHandler对把从 ResultSet得来的数据转变成一个更容易的或是应用程序特定的格式来使用。
query(String sql, Object[] params, ResultSetHandler rsh):
这几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,
并且它是从提供给构造器的数据源(DataSource) 或使用的setDAtaSource 方法中重新获得的。
query(Connection conn, String sql, ResultSetHandler rsh):
这执行一个不要参数的选择查询。
update(Connection conn, String sql, Object[] params):
这一方法被用来执行一个插入、更新或删除操作。对象阵列为声明保存着置换参数。


4、使用遵从以下步骤:

1.加载JDBC驱动程序类,并用DriverManager来得到一个数据库连接conn。
2.实例化 QueryRunner,得到实例化对象qRunner。
3. qRunner.update()方法,执行增改删的sql命令,
    qRunner.query()方法,得到结果集。

5、实战

1、连接类ConnectDb:import java.sql.DriverManager;

  import java.sql.SQLException;
import java.sql.Connection; public class ConnectDb {
private static String driveClassName = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://192.168.1.161:3306/test?useUnicode=true&characterEncoding=utf8"; private static String user = "root";
private static String password = "e-playnow"; public static Connection Connect(){
Connection conn = null; //load driver
try {
Class.forName(driveClassName);
} catch (ClassNotFoundException e) {
System.out.println("load driver failed!");
e.printStackTrace();
} //connect db
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
System.out.println("connect failed!");
e.printStackTrace();
} return conn;
}
}

2、数据库表

  CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`age` tinyint(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

3、Bean

  package Beans;  

 public class UserBean {
private int id;
private String name;
private int age; 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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

4、Demo

  import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import Beans.UserBean; public class main { public static void main(String[] args) throws SQLException {
insert_test();
del_test();
} static void insert_test() throws SQLException{
Connection conn = ConnectDb.Connect(); //创建SQL执行工具
QueryRunner qRunner = new QueryRunner(); //执行SQL插入
int n = qRunner.update(conn, "insert into user(name,age) values('xxx',22)");
System.out.println("成功插入" + n + "条数据!"); //关闭数据库连接
DbUtils.closeQuietly(conn);
} static void select_test() throws SQLException{
Connection conn = ConnectDb.Connect(); //创建SQL执行工具
QueryRunner qRunner = new QueryRunner(); @SuppressWarnings("unchecked")
List<UserBean> list = (List<UserBean>) qRunner.query(conn, "select id,name,age from user", new BeanListHandler(UserBean.class));
//输出查询结果
for (UserBean user : list) {
System.out.println(user.getAge());
} //关闭数据库连接
DbUtils.closeQuietly(conn);
} static void update_test() throws SQLException{
Connection conn = ConnectDb.Connect(); //创建SQL执行工具
QueryRunner qRunner = new QueryRunner();
//执行SQL插入
int n = qRunner.update(conn, "update user set name = 'xxx',age=28");
System.out.println("成功更新" + n + "条数据!"); //关闭数据库连接
DbUtils.closeQuietly(conn);
} static void del_test() throws SQLException{
Connection conn = ConnectDb.Connect(); //创建SQL执行工具
QueryRunner qRunner = new QueryRunner();
//执行SQL插入
int n = qRunner.update(conn, "DELETE from user WHERE name='xxx';");
System.out.println("删除成功" + n + "条数据!"); //关闭数据库连接
DbUtils.closeQuietly(conn);
}
}

标明出处:https://blog.csdn.net/samjustin1/article/details/52220423

开源框架:DBUtils使用详解的更多相关文章

  1. Android开发之最火的开源框架之一Xutils2详解(摘自开源作者官方介绍详解)

    此框架说实话还是挺不错的,挺好用的,功能多,所以我也用过. 由于CSDN博客写的字数有限制,所以全文的用法打包成了markdown 文件,因为markdown真的太还用了. 全文下载地址为: http ...

  2. RPC框架调用过程详解

    RPC框架调用过程详解 2017年09月16日 21:14:08 荷叶清泉 阅读数 6275   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

  3. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

  4. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  5. Django框架 之 querySet详解

    Django框架 之 querySet详解 浏览目录 可切片 可迭代 惰性查询 缓存机制 exists()与iterator()方法 QuerySet 可切片 使用Python 的切片语法来限制查询集 ...

  6. TP框架I方法详解

    TP框架I方法详解   I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:I('变量类型. ...

  7. 手把手撸套框架-Victory框架1.1 详解

    目录 上一篇博客 Victory框架1.0 详解  有说道,1.0的使用过程中出现不少缺点,比如菜单不能折叠,权限没有权限组等等. 所以,我还是抽出时间在下班后,回到我的小黑屋里 完成了1.1的升级. ...

  8. spring mvc 框架搭建及详解

    现 在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不 ...

  9. App域名劫持之DNS高可用 - 开源版HttpDNS方案详解(转)

      http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209805123&idx=1&sn=ced8d67c3e2cc3 ...

  10. Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

    最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...

随机推荐

  1. 生命不息学习不止,前端js学习笔记(一)

    引言 从毕业到年已经整整7年,期间一直从事.net开发做c/s从 c# 转到 wpf 而后又开始做b/s 用silverlight,从最开始的arcgis engine 到后来的silverlight ...

  2. 17.分支的合并&遇到冲突时的分支合并

    分支的合并 假设你已经修正了 #53 问题,并且打算将你的工作合并入 master 分支. 为此,你需要合并 iss53 分支到 master 分支,这和之前你合并 hotfix 分支所做的工作差不多 ...

  3. 微软牛津计划——声纹识别与视频识别API上线啦!

    上个月,我们发布了牛津计划机器学习的情感识别API,能够帮助不同平台的开发者轻松添加智能应用,而无需精通人工智能领域.牛津计划仅仅是微软在人工智能领域探索中的一个实例,而我们的期望是实现更加注重个人使 ...

  4. 【Leetcode】【Medium】Search for a Range

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  5. [问题记录]libpomelo编译报错:ssize_t重定义

    1. 时间:2015/01/16 描述:添加libpomelo到cocos2dx项目,报错如下图所示: 解决: 修改代码,源代码: #if !defined(_SSIZE_T_) && ...

  6. 第四周 day4 python学习笔记

    关于装饰器的更多信息可以参考http://egon09.blog.51cto.com/9161406/1836763 1.装饰器Decorator 装饰器:本质上是函数,(装饰其他函数),就是为其他函 ...

  7. 第一周 day1 Python学习笔记

    为什么要学习Python? Python擅长的领域 1. python2.x中不支持中文编码,默认编码格式为ASCII码,而python3.x中支持Unicode编码,支持中文,变量名可以为中文,如: ...

  8. ZT北大青鸟营业额超20亿到不值一提 衰落的背后

    北大青鸟营业额超20亿到不值一提 衰落的背后 2013-10-18 08:18 王根旺  我要评论 (0) “北大青鸟是个悲剧!”说到曾经的IT培训业巨头,黑马导师.珍品网创始人曹允东惋惜道.在学大创 ...

  9. S/4HANA服务订单Service Order的批量创建

    我工作中接到一个任务,需要在性能测试系统里创建一亿条服务订单service order来做性能测试. 这么大规模的数据量,当然只能用代码来创建了. 本文提到的所有ABAP代码,我均已上传到我的Gith ...

  10. Jenkins传参修改jmeter的报告名称和详细报告地址

    目前已经可以发送邮件了,我已经配置了Jenkins,但是有几个显示问题,待处理1.报告名称地址, 2详细报告地址没有做跳转 更改后为: 修改url 1.打开样式的jmeter-results-deta ...