文章目录

  • 前言
  • 一、DbUtils三大核心体现
  • 二、DbUtils工具类
  • 三、ResultSetHandler接口实现类
  • 四、QueryRunner类
    • 1.QueryRunner常用的构造函数
    • 2.QueryRunner的常用方法
  • 五、使用实例
    • 1 添加jar包
    • 2 在src下创建c3p0的配置文件c3p0-config.xml
    • 3 DbUtils简易封装
    • 4 在数据库中建立会员卡表并插入数据
    • 5 创建一个MembershipCard类(里面的元素与数据库中的会员卡表字段信息类型相同)
    • 6 利用DbUtils实现增删改查
  • 总结

前言

为更加简单且高效地使用JDBC,Apache组织提供了数据库操作工具类commons-dbutils。该工具对JDBC进行了封装,可极大地简化JDBC的编码工作量。例如:DbUtils在查询数据时可把结果转换成List,Array,Set等集合,非常便于开发人员操作。

一、DbUtils三大核心体现

1、DbUtils工具类 该类主要用于关闭连接、装载JDBC驱动程序等等
2、ResultSetHandler接口 该接口及其实现类主要用于处理结果集
3、QueryRunner类 该类主要用于增,删,改,查

二、DbUtils工具类

由于这不是Java自带的工具类,查询比较麻烦,在这里我就仅仅列举最常用的吧,如下所示:

代码如下(DbUtils工具类第一个列举):

public static boolean loadDriver(java.lang.String driverClassName)

该方法用于方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,不需要捕捉ClassNotFoundException

代码如下(DbUtils工具类第二个列举):

public static void close(Connection conn,Statement stmt, ResultSet rs) throws java.sql.SQLException

该类方法用于关闭Connection、Statement和ResultSet

代码如下(DbUtils工具类第三个列举):

public static void closeQuietly(Connection conn,Statement stmt, ResultSet rs):

该类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception

代码如下(DbUtils工具类第四个列举):

public static void commitAndCloseQuietly(Connection conn)

该方法用于提交事务并关闭连接,而且在关闭连接时不抛出SQL异常。

代码如下(DbUtils工具类第五个列举):

public static void rollbackAndCloseQuietly(Connection conn)

该方法用于回滚事务并关闭连接,而且在关闭连接时不抛出SQL异常。

三、ResultSetHandler接口实现类

1、BeanHandler 将结果集中的第一行数据封装到一个对应的JavaBean实例中
2、BeanListHandler 将结果集中的每一行数据都封装到一个对应的JavaBean实例中,再存放到List
3、ArrayHandler 把结果集中的第一行数据转成对象数组
4、ArrayListHandler 把结果集中的每一行数据都转成一个数组存放到List中
5、ColumnListHandler 将结果集中某一列的数据存放到List中/6、KeyedHandler(name) 将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key。
6、MapHandler 将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
7、MapListHandler 将结果集中的每一行数据都封装到一个Map里,然后再存放到List
8、ScalarHandler 将结果集中某一条记录的其中某一列的数据存储成Object对象

四、QueryRunner类

1.QueryRunner常用的构造函数

QueryRunner() 采用该方法创建QueryRunner时数据库的事务可由我们自己手动控制。正因为该构造方法无参,所以在调用该对象的query、update、等方法时需要传入参数Connection。
QueryRunner(DataSource ds) 采用该方法创建QueryRunner时数据库的事务由DBUtils自动控制。正因为该构造方法传入了参数DataSource,所以在调用该对象的query、update、等方法时无需传入参数Connection。

2.QueryRunner的常用方法

public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)

该方法用于执行查询,在该查询中Object数组里的每个值被用来作为查询语句的置换参数。该方法会自行处理PreparedStatement和ResultSet的创建和关闭。

public Object query(String sql, Object[] params, ResultSetHandler rsh)

不用传入参数Connection

public Object query(Connection conn, String sql, ResultSetHandler rsh)

该方法与上面的两个方法基本一样,它用于执行一个不需要置换参数的查询操作。

public int update(Connection conn, String sql, Object[] params)

该方法用于执行更新操作(例如:增加、删除、更新),在该查询中Object数组里的每个元素值被用来作为更新语句的置换参数。

五、使用实例

1 添加jar包

c3p0-0.9.1.2.jar
commons-dbutils-1.4.jar
mysql-connector-java-5.0.8-bin.jar

导包位置如下:

2 在src下创建c3p0的配置文件c3p0-config.xml

如下图所示c3p0-config.xml配置的级别与src同级,文件名建议直接复制

c3p0-config.xml里面的内容如下(只需要修改当前使用的数据库及数据库的use和password)

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/你当前使用的数据库名</property><property name="user">使用者名字</property><property name="password">密码</property><property name="initialPoolSize">15</property><property name="maxIdleTime">40</property><property name="maxPoolSize">150</property><property name="minPoolSize">20</property></default-config>
</c3p0-config>

3 DbUtils简易封装

代码如下(DbUtils工具类):

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;public class DBUtils {//创建数据库连接池private static DataSource dataSource = new ComboPooledDataSource();//获取数据库连接池public static DataSource getDataSource() {return dataSource;}//创建连接public static Connection getConnection(){try {return dataSource.getConnection();} catch (SQLException e) {throw new RuntimeException("获取数据库连接失败");}}//释放连接public static void releaseConnection(Connection connection, Statement statement, ResultSet resultSet) {if (resultSet != null) {try {resultSet.close();} catch (Exception e) {e.printStackTrace();}resultSet = null;}if (statement != null) {try {statement.close();} catch (Exception e) {e.printStackTrace();}statement = null;}if (connection != null) {try {connection.close();} catch (Exception e) {e.printStackTrace();}connection = null;}}
}

4 在数据库中建立会员卡表并插入数据

代码如下(建立会员卡表的MySQL命令):

-- 若存在数据库mydb则删除
DROP DATABASE IF EXISTS mydb;
-- 创建数据库mydb
CREATE DATABASE mydb;
-- 选择数据库mydb
USE mydb;-- 创建表
CREATE TABLE membershipcard (id int primary key auto_increment, username varchar(40),password varchar(40), email varchar(40), birthday date
);-- 插入数据
INSERT INTO membershipcard (username,password,email,birthday) VALUES ("lili","abc123","lili@sina.com","1999-08-14");
INSERT INTO membershipcard (username,password,email,birthday) VALUES ("koko","efg456","koko@sohu.com","1998-07-15");
INSERT INTO membershipcard (username,password,email,birthday) VALUES ("mbmb","mnb333","mbmb@sina.com","1997-06-16");
INSERT INTO membershipcard (username,password,email,birthday) VALUES ("zxzx","poi666","zxzx@sohu.com","1996-05-17");

5 创建一个MembershipCard类(里面的元素与数据库中的会员卡表字段信息类型相同)

代码如下(MembershipCard类):

import java.util.Date;public class MembershipCard {private int id;private String username;private String password;private String email;private Date birthday;public MembershipCard() {}public MembershipCard(int id, String username, String password, String email, Date birthday) {this.id = id;this.username = username;this.password = password;this.email = email;this.birthday = birthday;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "MembershipCard [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email+ ", birthday=" + birthday + "]";}}

6 利用DbUtils实现增删改查

代码如下(DbUtils实现增删改查测试):

import java.sql.Date;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;public class Test01 {public static void main(String[] args) {Test01 test01 = new Test01();test01.testSelect();// test01.testSelectAll();// test01.testUpdate();// test01.testDelete();// test01.testInsert();}// 插入数据public void testInsert() {QueryRunner qr = new QueryRunner(DBUtils.getDataSource());Date birthday = Date.valueOf("1997-07-01");String sql = "insert into membershipcard(username,password,email,birthday) values(?,?,?,?)";Object params[] = { "zsa", "007", "077@sina.com", birthday };try {qr.update(sql, params);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("suc");}// 删除数据public void testDelete() {QueryRunner qr = new QueryRunner(DBUtils.getDataSource());String sql = "delete from membershipcard where username=?";Object[] param = {"zsa"};try {qr.update(sql, param);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 更新数据public void testUpdate() {QueryRunner qr = new QueryRunner(DBUtils.getDataSource());String sql = "update membershipcard set password=? where username=?";Object[] param = {"12546","zxzx"};try {qr.update(sql, param);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 查询所有数据public void testSelectAll() {QueryRunner qr = new QueryRunner(DBUtils.getDataSource());String sql = "select * from membershipcard";BeanListHandler<MembershipCard> beanListHandler = new BeanListHandler<>(MembershipCard.class);try {List<MembershipCard> list = qr.query(sql,beanListHandler);for(MembershipCard membershipCard:list) {System.out.println(membershipCard);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 查询单条数据public void testSelect(){QueryRunner qr = new QueryRunner(DBUtils.getDataSource());String sql = "select * from membershipcard where username=?";Object[] param = {"zxzx"};BeanHandler<MembershipCard> beanHandler = new BeanHandler<>(MembershipCard.class);try {MembershipCard query = qr.query(sql,beanHandler , param);System.out.println(query);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

查询单条数据测试输出:

查询所有数据测试输出:

添加一条数据测试输出:

看看数据表中是否真的插入了数据

更新一条数据测试输出:

看看数据表中是否真的更新了数据

删除一条数据测试输出:

看看数据表中是否真的删除了数据

总结

在该示例中利用DbUtils实现了增删改查操作。其中,我们可利用BeanHandler将查询到的一条数据转换成与其对应的JavaBean;类似地,我们可利用BeanListHandler将查询到的多条数据转换为JavaBean再存放至List集合。
注意
当有数据需要插入数据表示,导的包应该是java.sql这种格式的

DbUtils框架(这是一个耗时耗力的差事)相关推荐

  1. 《数据分析实战:基于EXCEL和SPSS系列工具的实践》——3.3 耗时耗力的数据整理过程...

    本节书摘来自华章计算机<数据分析实战:基于EXCEL和SPSS系列工具的实践>一书中的第3章,第3.3节,作者 纪贺元,更多章节内容可以访问云栖社区"华章计算机"公众号 ...

  2. Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

    前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WZY 一.JDBC是什么? Java Data Base Connectivity,java数据库连接, ...

  3. #敏捷个人#每日认识101(15):成为一个有执行力的人

    "为什么我不能做我知道应该做的事情呢?" 对这个问题的回答,如果原因在自己,看看能不能自我改正:如果原因在他人,看看能不能与对方一起解决:如果解决不了,看看是否要另找一个新的环境. ...

  4. jdbc mysql分页_JDBC【数据库连接池、DbUtils框架、分页】

    1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...

  5. dbcp连接池配置详解_JDBC第四篇【数据库连接池、DbUtils框架、分页】(修订版)

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 1.数据库连接池 什么是数据库连接池 简单来说:数据 ...

  6. 小汤学编程之JDBC(二)——dbutils框架和DataSource连接池

    一.dbutils框架 1.介绍     2.新增/删除/修改     3.各种查询     4.扩展:Bean中属性名与数据表列名的映射 二.DataSource连接池 1.获取DataSource ...

  7. Apache—DBUtils框架简介

    Apache-DBUtils框架简介.DbUtils类.QueryRunner类 .ResultSetHandler接口 commons-dbutils 是 Apache 组织提供的一个开源 JDBC ...

  8. #敏捷个人# 每日认识101(15):成为一个有执行力的人

    "为什么我不能做我知道应该做的事情呢?" 对这个问题的回答,如果原因在自己,看看能不能自我改正:如果原因在他人,看看能不能与对方一起解决:如果解决不了,看看是否要另找一个新的环境. ...

  9. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表 - 解无邪

    本文目录: 1.自定义JDBC框架 --数据库元数据:DataBaseMetaData 2.自定义JDBC框架 --数据库元数据:DataBaseMetaData 3.自定义JDBC框架 --结果集元 ...

最新文章

  1. What is Listing in SAP Retail?
  2. 蓝图Blueprint
  3. 升级鸿蒙系统的手机名单,倒计时2天!首批鸿蒙OS适配名单确定,你的手机在列吗?...
  4. 如何通过预加载器提升网页加载速度
  5. Spring WebFlux 响应式编程学习笔记(一)
  6. 序列模型简介——RNN, Bidirectional RNN, LSTM, GRU
  7. Sysfs_linux设备底层模型
  8. Android JNI作用及其详解
  9. 【Redis】redis cluster 添加 删除 重分配 节点
  10. 【BZOJ4504】K个串 可持久化线段树+堆
  11. 详解C++ friend关键字
  12. C# string补位
  13. c++调用powershell_告别 Windows 终端的难看难用,从改造 PowerShell 的外观开始
  14. JAVA以及常用开源框架读音发音和介绍
  15. 关于无线网卡驱动安装正确,但灯不亮的问题
  16. 西门子PLC 1200和V20变频器USS通讯
  17. 数据分析(入门篇)-第三章-Show出你的数据-Part2(水晶易表)
  18. 李商隐和杜牧并称“小李杜”,他俩到底谁的成就高?
  19. 表格中复制后出现空格_尝过廉江这个美食后,已经连续3天出现在下午茶名单中!...
  20. 西门子博途1200码垛机、立体仓库程序(带注释),程序应用到 变频器、触摸屏、步进电机、工业机器人、视觉相机。

热门文章

  1. 做明日达超市,美团电商这次能成吗?
  2. Qt sql中出现的错误 Error: unable to open database “D:\Qt“: unable to open database file
  3. 程序人生 - 座位险和驾乘险有什么区别,买了后者还需要前者吗?
  4. C#写的ActiveX弹出窗口在Delphi程序中的应用时出现了问题。
  5. 电脑拆机(华硕FL5900)+光驱改固态
  6. OpenCV实践(4)- 叠加两幅图片
  7. C语言编写 小企鹅表情包
  8. 微信小程序:升级版手机检测微信工具小程序源码
  9. 前端单元测试到底要怎么写?看这一篇就够了
  10. 预训练模型在金融 NLP场景下的应用