感谢原文作者:simonXi-tech

原文链接:https://blog.csdn.net/simonforfuture/article/details/90480147

更多请查阅在线API文档:https://tool.oschina.net/apidocs/apidoc?api=commons-dbutils

前言

DBUtils

Java开发基础(二)——JDBC的使用中写到,Java与数据库的连接包括:导包、注册驱动、获取与数据库的连接对象、获取SQL语句的执行者对象、获取结果集对象、关闭连接等。其中连接池包含了注册驱动和获取与数据库连接两个步骤,而dbutils简化了其他步骤

JavaBean组件

**JavaBean是一个用于封装数据的类,在与数据库连接之中,JavaBean其的作用是将获取的数据库的记录封装到JavaBean中。**特性如下:

  1. 需要实现接口:java.io.Serializable ,可以省略不写。
  2. 提供私有字段:private 类型 字段名;
  3. 提供getter/setter方法:
  4. 提供无参构造

DBUtils使用

DBUtils封装了JDBC的操作,核心功能如下:

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

QueryRunner核心类:

核心方法:

  1. QueryRunner(DataSource ds) ;传入参数为连接池
  2. update(String sql, Object… params) ,执行insert update delete操作
  3. query(String sql, ResultSetHandler rsh, Object… params) ,执行 select操作

ResultSetHandler结果集处理类

示例

JavaBean: Category.java

// JavaBean
public class Category {
private String cid;
private String cname; public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
} public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Category [cid=" + cid + ", cname=" + cname + "]";
}
public Category() {
super();
// TODO Auto-generated constructor stub
}
public Category(String cid, String cname) {
super();
this.cid = cid;
this.cname = cname;
}
}

C3P0Utils.java

/**
* 在C3P0连接池中 遵循了javax.sql.DataSource接口的实现类:
* ComboPooledDataSource
*/
import java.beans.PropertyVetoException;
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 C3P0Utils { private static ComboPooledDataSource ds = new ComboPooledDataSource();
// 自动加载C3P0-config.xml文件 public static DataSource getDataSource(){
return ds;
} public static Connection getConnection() throws SQLException{
// 获取连接,从C3P0连接池获取
return ds.getConnection();
} // 关闭所有资源的统一代码
public static void closeAll(Connection conn, Statement st, ResultSet rs){
//负责关闭
if(conn != null){
try {
conn.close(); // 使用代理,放回到连接池中
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

DBUtilsDemo.java

package cn.simon.jdbc.demo03_DBUtils的使用;

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.simon.jdbc.domain.Category; /**
* DBUtils执行数据库查询操作
* 1.QueryRunner(DataSource)
* 2.query(String sql, ResultSetHandler<T> rsh, Object... params); // 主要执行查询
*/ public class DBUtilsDemo {
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub // queryDemo01();
// queryDemo02();
// queryDemo03();
// queryDemo04();
// queryDemo05();
queryDemo06();
// queryDemo07();
// queryDemo08();
} // ArrayHandler处理类的使用
public static void queryDemo01() throws SQLException{
// 1.创建QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.执行查询
Object[] objs = qr.query("select * from category where cid = ?", new ArrayHandler(), 1);
for(Object o: objs){ // object[]中保存了object对象
System.out.println(o);
}
} // ArrayListHandler
public static void queryDemo02() throws SQLException{
// 1.创建QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.执行查询
List<Object[]> objs = qr.query("select * from category ", new ArrayListHandler());
for (Object[] objects : objs) {
System.out.println(objects[0]+"\t"+objects[1]);
}
} // BeanHandler处理类的使用
public static void queryDemo03() throws SQLException{
// 1.创建QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.执行查询
String sql = "select * from category";
Category c = qr.query(sql, new BeanHandler<Category>(Category.class));
System.out.println(c);
} // BeanListHandler
public static void queryDemo04() throws SQLException{
// 1.创建QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.执行查询
String sql = "select * from category";
List<Category> c = qr.query(sql, new BeanListHandler<Category>(Category.class));
for (Category category : c) {
System.out.println(category);
}
} // ColumnListHandler处理类的使用
public static void queryDemo05() throws SQLException{
// 1.创建QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.执行查询
String sql = "select * from category";
List<Object> c = qr.query(sql, new ColumnListHandler<Object>("cname"));
System.out.println(c);
} // MapHandler处理类的使用
public static void queryDemo06() throws SQLException{
// 1.创建QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.执行查询
String sql = "select * from category";
Map<String, Object> map = qr.query(sql, new MapHandler());
// 3.
System.out.println(map);
} // MapListHandler处理类的使用
public static void queryDemo07() throws SQLException{
// 1.创建QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.执行查询
String sql = "select * from category";
List<Map<String, Object>> maps = qr.query(sql, new MapListHandler());
// 3.List
System.out.println(maps);
} // MapListHandler处理类的使用
public static void queryDemo08() throws SQLException{
// 1.创建QueryRunner对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.执行查询
String sql = "select count(*) from category";
Long count = qr.query(sql, new ScalarHandler<Long>());
// 3.List
System.out.println(count);
}
}

总结

DBUtils主要就是简化JDBC操作,封装虽好,但还是要知道其中的原理才好。

Maven

<!--DBUtils-->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>

我的项目具体使用

仓库地址:https://github.com/b84955189/TF-MIS

源路径:src/main/java/dao/impl/BaseDaoImpl.java

package dao.impl;

import dao.inter.BaseDaoInter;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import utils.JDBCUtils; import java.sql.SQLException;
import java.util.List; /**
* 基础Dao实现类
* @author Jason
* @version 1.0
* @date 6/11/2020 9:59 PM
*/
public class BaseDaoImpl implements BaseDaoInter {
/**
* 获取任意对象
* 结果Bean需要强转
* @param beanType Java Bean 类型
* @param sqlSyntax SQL语句
* @param params 查询参数
* @return
* @author Jason
* @date 9:57 PM 6/11/2020
*/
@Override
public Object getObject(Class beanType, String sqlSyntax, Object[] params) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
return queryRunner.query(sqlSyntax,new BeanHandler(beanType),params);
} /**
* 获取任意对象集合
* 注意:JSONObject是采用反射的机制获取get方法,然后再获取参数值的。所以在使用JSONObject处理结果集合时可以
* 不必下转型。可以查看JSONObject的实现源代码。上转型类.getClass()==实例类型
* @param beanType Java Bean 类型
* @param sqlSyntax SQL语句
* @param params 查询参数
* @return
* @author Jason
* @date 8:57 PM 6/13/2020
*/
@Override
public List<Object> getObjectList(Class beanType, String sqlSyntax, Object[] params) throws SQLException {
System.out.println(sqlSyntax);
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
return queryRunner.query(sqlSyntax,new BeanListHandler<Object>(beanType),params);
} /**
* 数据库更新操作
* QueryRunner的update方法参数底层依旧是使用JDBC的setObject方法设置参数.setObject方法内部会通过instance of判断这个参数到底是哪个类型的具体对象,从而调用相应类型的set方法。
* @param sqlSyntax SQL语句
* @param params 参数
* @return
* @author Jason
* @date 9:29 AM 6/14/2020
*/
@Override
public boolean update(String sqlSyntax, Object[] params) throws SQLException {
boolean sign=false;
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
if(queryRunner.update(sqlSyntax,params)>0){
sign=true;
}
return sign;
} /**
* 获取查询数目
*
* @param sqlSyntax SQL 语句
* @param params 查询限制参数
* @return
* @author Jason
* @date 7:26 PM 6/15/2020
*/
@Override
public long getCount(String sqlSyntax, Object[] params) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
return queryRunner.query(sqlSyntax,new ScalarHandler<Long>(),params);
}
}

JDBC工具包commons-dbutils的基本介绍的更多相关文章

  1. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)

    转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...

  2. java JDBC (六) org.apache.commons.dbutils 增删改

    dbutils是apache封装了JDBC的工具类,比mysql-connector更方便些 下载地址:http://commons.apache.org/proper/commons-dbutils ...

  3. java JDBC (七) org.apache.commons.dbutils 查询

    package cn.sasa.demo1; import java.sql.Connection; import java.sql.SQLException; import java.util.Li ...

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

    本文目录:       1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData        2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData       ...

  5. Apache Commons DbUtils 快速上手

    原文出处:http://lavasoft.blog.51cto.com/62575/222771 Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了 ...

  6. Java -- JDBC 学习--使用 DBUtils

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

  7. 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)

    -----------------------JDBC---------- 0.      db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...

  8. Dbutils学习(介绍和入门)

    一:Dbutils是什么?(当我们很难理解一个东西的官方解释的时候,就让我们记住它的作用)      Dbutils:主要是封装了JDBC的代码,简化dao层的操作.      作用:帮助java程序 ...

  9. 《笔者带你剖析Apache Commons DbUtils 1.6》(转)

    前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更 多的是依靠Hibernate.Ibatis.Spring JDBC.JPA等大厂提供的持久层技术解决方案, ...

随机推荐

  1. 数据结构作业——P53页算法设计题(7):原地逆转链表

    一. 题目描述: 设计一个算法,将链表中所有结点的链接方向"原地"逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为O(1). 二.算法设计 #include< ...

  2. Improving Variational Auto-Encoders using Householder Flow

    目录 概 主要内容 代码 Tomczak J. and Welling M. Improving Variational Auto-Encoders using Householder Flow. N ...

  3. IT6563替代芯片|DP转HDMI 2.0音视频讯号转换芯片|CS5263Capstpne

    IT6563替代芯片|CS 5263|4LAN DP转HDMI 2.0音视频讯号转换芯片IT6563是一款4LAN EDP转HDMI2.0 HDMI2.0转换器芯片.IT6563FN结合Display ...

  4. 替代台湾安格AG6200 AG6201 HDMI转VGA带音频方案+设计电路 CS5213代替AG6200 AG6201

    台湾安格AG6200 AG6201专门用于设计HDMI转VGA带音频输出的方案芯片,CS5213是一款HDMI to VGA转换器且结合了HDMI输入接口和模拟RGB DAC输出.带支持片上音频数模转 ...

  5. 剖析Defi之Uinswap_2

    学习核心合约UniswapV2Pair,在父合约UniswapV2ERC20的基础上增加资产交易及流动性提供等功能. 交易对合约本身是erc20合约,代币表示流动性,代币在提供流动性的地址里,当提供流 ...

  6. partial write bypass PIE

    第一篇博客,请允许我水一下.BUUCTF上的一题:linkctf_2018.7_babypie 检查一下保护机制: 1 Arch: amd64-64-little 2 RELRO: Partial R ...

  7. Java初学者作业——用户输入一个小数,程序分解出整数部分和小数部分。

    返回本章节 返回作业目录 需求说明: 用户输入一个小数,程序分解出整数部分和小数部分. 实现思路: 接收用户控制台输入的小数. 用强制类型转换将整数部分得到. 使用用户输入的小数减去整数部分得到小数部 ...

  8. Linux下如何部署FTP服务器

    FTP 是 File Transfer Protocol 的缩写,即文件传输协议,它通过网络在服务器和客户端之间传输文件,现在已经成为一种广泛使用的标准工具 vsftpd 是 very secure ...

  9. python 使用exec执行定义好的方法,提示“name 'XXX' is not defined”

    文件A中的exec(),调到了文件B中的方法,提示name is not defined exec()调用时,提示方法没有定义 试过了的方法: 1.百度上说是局部变量或者是全局变量之间的文件,然后在e ...

  10. xshell 所选的用户密钥未在远程主机上注册;无法加载密钥

    他山之石 https://zhuanlan.zhihu.com/p/92528287 安全起见,服务器最近的安全策略准备进行更改,逐渐由原来的密码登录更换为密钥登录认证. 于是今天把服务器上的id_r ...