Apache commons-dbutils工具简介说明

2023-11-01

转自:

Apache commons-dbutils工具简介说明

下文笔者讲述Apache commons-dbutils工具简介说明,如下所示

commons-dbutils简介

commons-dbutils
  是Apache提供的一个开源JDBC工具类库
  它是对JDBC的简单封装
  学习成本极低
  并且使用dbutils能极大简化jdbc编码的工作量
   同时也不会影响程序的性能

commons-dbutils API介绍

org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler

工具类

org.apache.commons.dbutils.DbUtils

commons-dbutils下载方法

https://commons.apache.org/proper/commons-dbutils/

DbUtils类介绍

DbUtils类的功能:
  提供一些操作方法:
    如关闭连接、装载JDBC驱动程序等常规工作的工具类
注意事项:
   里面的所有方法都是静态的(关闭资源、加载驱动)
  
常见的方法如下所示:
   public static void close(…) throws java.sql.SQLException
      DbUtils类提供了三个重载的关闭方法
     这些方法检查所提供的参数是不是NULL
      当参数为非null时,则关闭Connection、Statement和ResultSet。

   public static void closeQuietly(…)
       此方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭
        还能隐藏一些在程序中抛出的SQLException 

   public static void commitAndCloseQuietly(Connection conn);
       用于提交连接
       然后关闭连接
      并且在关闭连接时不抛出SQL异常。

    public static boolean loadDriver(java.lang.String driverClassName)
      装载并注册JDBC驱动程序
      如果成功就返回true
      使用该方法,无需捕捉这个异常ClassNotFoundException。

QueryRunner类

该类简单化SQL查询
   它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作
    能够大大减少编码量
    此类中定义了所有的与数据库操作的方法(查询、更新)

QueryRunner类提供两个构造方法

 默认的构造方法
  需要一个 javax.sql.DataSource 来作参数的构造方法

QueryRunner类的主要方法

public Object query(Connection conn,String sql,Object[] params, ResultSetHandler rsh)
  throws SQLException
  执行一个查询操作
  在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数
  该方法会自行处理 PreparedStatement和ResultSet的创建和关闭。

public Object query(String sql,Object[] params, ResultSetHandler rsh) throws SQLException:
   与上一个方法的不同之处在于它不将数据库连接提供给方法
  并且它是从提供给构造方法的数据源(DataSource)
    或使用setDataSource 方法中重新获得 Connection。

public Object query(Connection conn,String sql, ResultSetHandler rsh) throws SQLException
    执行一个不需要置换参数的查询操作

public int update(Connection conn, String sql,Object[] params) throws SQLException
    用于执行一个更新(插入、更新或删除)操作 

public int update(Connection conn, String sql) throws SQLException
    用于执行一个不需要置换参数的更新操作。

ResultSetHandler接口

该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
 ResultSetHandler接口提供了一个单独的方法:Object
 handle (java.sql.ResultSet  rs)

ResultSetHandler接口的实现类

ArrayHandler:把结果集中的第一行数据转成对象数组
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里
ColumnListHandler(列名):将结果集中某一列的数据存放到List中
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List


JdbcUtils类编写

package Utils;
import java.sql.*;
/**
* 1. 返回连接 2. 关闭
*
* @author java265.com
*
*/

public class JdbcUtils {

// 连接参数
    // private String url = "jdbc:mysql://localhost:3306/jdbc_demo";
    private static Stringurl ="jdbc:mysql://192.168.8.245:3306/testdb";

private static Stringuser ="root";
private static Stringpassword ="123456";

/**
    * 返回连接对象
    */
public static Connection getConnection() {
  try {
   Class.forName("com.mysql.jdbc.Driver");
   return DriverManager.getConnection(url,user,password);
  }catch (Exception e) {
    throw new RuntimeException(e);
  }
}

/**
  * 关闭
  */
 public static void closeAll(Connection con, Statement stmt, ResultSet rs) {
try {
if (rs !=null) {
     rs.close();// 快速异常捕获Alt + shift + z
     rs =null;// 建议垃圾回收期回收资源
   }
if (stmt !=null) {
    stmt.close();
    stmt =null;
}
if (con !=null && !con.isClosed()) {
    con.close();
    con =null;
    }
}catch (SQLException e) {
    throw new RuntimeException(e);
   }
 }
}

 
public class User {
   private int id;
   private String name;
   /*
    此处省略 get/set 及其它字段定义代码
   */
}

/**
 * 测试代码
 */
import Utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;
import java.sql.Array;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class App_query {
   private Connectionconn;

    @Test
    public void testQuery()throws Exception {
       String sql ="select * from users where id=?";

       //获取连接 
       conn = JdbcUtils.getConnection();

       //创建DbUtils核心工具类对象
        QueryRunner qr =new QueryRunner();
      
	   //查询
       User users = qr.query(conn, sql,new ResultSetHandler() {

       //如何封装一个Admin对象
        public User handle(ResultSet rs)throws SQLException {

		if (rs.next()) {
			User user =new User();
			user.setId(rs.getInt("id"));
			user.setName(rs.getString("name"));
            ***********
			return user;
		}
		return null;
	}

},29);

    // 关闭

      conn.close();

}
 

    @Test
    public void testQueryOne()throws Exception {
      String sql ="select * from user where id=?";
      
	   //获取连接
	   conn = JdbcUtils.getConnection();
	   //创建DbUtils核心工具类对象
	   QueryRunner qr =new QueryRunner();
	   //查询返回单个对象
	   User user =  qr.query(conn, sql,new BeanHandler(User.class),30);

	   System.out.println(user);
	   conn.close();
	  }

    //2.BeanListHandler: 查询返回list集合,集合元素是指定的对象
    @Test
    public void testQueryMany()throws Exception {
		String sql ="select * from user";
          conn = JdbcUtils.getConnection();
        QueryRunner qr =new QueryRunner();
        
		//查询全部数据
         List list = qr.query(conn, sql,new BeanListHandler(Admin.class));
         conn.close();
     }

@Test
// 3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]
// 4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中
// 5) ScalarHandler 查询返回结果记录的第一行的第一列  (在聚合函数统计的时候用)
// 6) MapHandler  查询返回结果的第一条记录封装为map

  public void testArray()throws Exception {
       String sql ="select * from user";
       conn = JdbcUtils.getConnection();
     
	   QueryRunner qr =new QueryRunner();
       
	   //查询
      Object[] obj = qr.query(conn, sql,new ArrayHandler());
       
	  System.out.println("数组:"+ Arrays.toString(obj));
      
	  List list = qr.query(conn, sql,new ArrayListHandler());

     for (int i =0; i < list.size(); i++) {
        System.out.println("list:"+ Arrays.toString(list.get(i)));
      } 
	 //查询的结果先是数组
     //然后将数组添加到list中
     //所以由list获取的每一条都为数组,然后遍历数组才能获取值

    Integer num = qr.query(conn, sql,new ScalarHandler());
     System.out.println("第一列:" + num);
     Map map = qr.query(conn,sql,new MapHandler());
     Set<Map.Entry<String, Object>> entrys = map.entrySet();

     //entry代表一个键值对
     for (Map.Entry entry : entrys) {
        System.out.println("map " + entry.getKey() +"=" + entry.getValue());
     }
     conn.close();
   }
}
 使用dbutils工具类可以简化
     jdbc编码的工作量
    不再用JDBC编写原子性代码
    直接使用QueryRunner获取结果
    而且其安全性较高
    内部的JDBC一些工作已经做好了实现
    用户只需直接使用即可
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache commons-dbutils工具简介说明 的相关文章

随机推荐

  • 【蓝桥杯】第八届省赛 - 分巧克力(二分)

    儿童节那天有 K K K 位小朋友到小明家做客 小明拿出了珍藏的巧克力招待小朋友们 小明一共有 N N N 块巧克力 其中第 i
  • 案例:scrapy图片数据爬取之ImagesPipeline

    1 需求 爬取站长素材中的高清图片 http sc chinaz com tupian 2 编码流程 创建和使用 Scrapy 工程 scrapy startproject imgPro 创建出爬虫文件 cd myscrapy scrapy
  • 去除摇一摇功能(hook技术)破解防模拟器检测

    某某社区摇一摇功能 App入口为 com qufan vp module LaunchActivity 思路 首次安装APP会进入一个引导页面和摇一摇检测页面 检测过后在本地产生一个Code 然后第二进入时候会找到这个code进行对比 如果
  • vue3安装及环境配置

    1 安装 Node js Node js 官网 https nodejs org en download 根据直接的版本去下载 安装成功后 在cmd控制台输入nonde v 和npm v 验证是否安装成功 配置默认安装目录和缓存日志目录 创
  • TIDB简介及TIDB部署、原理和使用介绍

    TiDB简介及TiDB部署 原理和使用介绍 从MySQL架构到TiDB 数据库分类 介绍TiDB数据库之前 先引入使用场景 如今的数据库种类繁多 RDBMS 关系型数据库 NoSQL Not Only SQL NewSQL 在数据库领域均有
  • 从“火热”到“退烧”,付费自习室将何去何从?

    近几年随着考编 考研大军的人数爆炸式增长 国内付费自习室也愈加火热 逐渐开始替代图书馆 咖啡厅等传统自习室 成为备考人群的新选择 2019年 国内第一家付费自习室在北京成立 此后 付费自习室数量大幅上升 掀起一股热潮 据新华网报道 仅仅这一
  • Clickhouse创建用户

    clickhouse创建用户 clickhouse创建新用户并配置权限 需要修改配置文件users xml 其中 要配置的内容包括 1 用户名 设为test 2 密码 需事先确定好 并用sha256加密 3 可访问的数据库 设为test 具
  • 强化学习PPO:Proximal Policy Optimization Algorithms解读

    PPO算法是一类Policy Gradient强化学习方法 经典的Policy Gradient通过一个参数化决策模型来根据状态确定动作 其参数更新是通过下式进行的 用于衡量决策模型的优劣目标 决策模型的优化目标为寻找最优决策 使得该决策下
  • 物联网开发103 - Micropython ESP32用增强固件驱动st7735s显示屏显示日期时钟和汉字

    一 目的 这一节我们来学习如何使用SP32使用加强版本的固件 加载中文字库 驱动st7735显示屏来显示汉字 二 环境 ESP32开发板 MicroPython v1 15 13 g530c76f6c dirty on 2021 04 30
  • websocket握手失败_探讨Netty获取并检查Websocket握手请求的两种方式

    在使用Netty开发Websocket服务时 通常需要解析来自客户端请求的URL Headers等等相关内容 并做相关检查或处理 本文将讨论两种实现方法 方法一 基于HandshakeComplete自定义事件 特点 使用简单 校验在握手成
  • visual studio:安装visual studio 2019后发现MSVC v140-VS 2015 C++安装位置出错删除办法

    安装visual studio 2019发现vs140安装位置默认安装在D Program Files x86 然后安装vs2015发现安装位置被定死了怎么办 打开visual studio 2019的安装程序 gt 修改 gt 右侧 使用
  • mysqldump常用备份恢复方法

    mysqldump常用备份恢复方法 2015 04 24 14 28 33 mysqldump常用备份恢复方法 一 使用mysqldump对数据库进行备份 1 全备份单库 语法 mysqldump h主机名 P端口 u用户名 p密码 数据库
  • 中职网络安全2022国赛之隐写术应用

    简介 有什么不会的可以来问我 3316735898 需要题目 解题工具和脚本的也可以来找我 1 找出文件夹1中的文件 将文件中的隐藏信息作为Flag值提交 打开文件 将文件放入kali 查询文件内部是否有其他文件 binwalk final
  • upload-labs(还没做完)

    参考资料 pass 1 前端验证 这题前端验证 直接把js禁了就行 上传zoe php 成功 pass 2 MIME绕过 支持jpeg png gif类型 那就bp抓包该类型 pass 3 特殊后缀名绕过 没有禁特殊后缀名 那就用php3
  • 最全iOS12捷径库收集整理,iOS12捷径推荐

    收集整理一波iOS12的捷径库 使用方法见文末 大家使用过程中如果发现有啥问题或者想实现什么捷径 可以关注微信公众号 云峰小罗 找到我 1 抖音视频无水印下载 2 清除照片位置信息 3 获取热门新闻 4 照片拼图 5 录制音频笔记至印象笔记
  • Unity Image 适配 text 类似-父适配儿

    Unity Image 适配 text 类似 父适配儿
  • 在GNS3上模拟出虚拟私有网络(GRE与IPsec)

    GRE 实验背景 R1 R5为两间私有公司 R2 R4分别为该公司的边界路由器 R3为internet 现配置GRE协议 实现R1能够访问R5内网 实验拓扑 实验步骤 1 配置网络底层 R1 R5配置 以R1为例 R2 R4边界路由器的配置
  • 【C语言】消息队列

    C queue 读取消息队列代码 消息队列 写 代码 读取消息队列代码 include
  • Redis:性能风险之CPU核和NUMA架构的影响

    文章目录 关于作者 1 主流CPU架构 2 CPU多核对Redis的性能影响 3 CPU的NUMA架构对Redis的性能影响 3 1 NUMA架构 3 2 NUMA架构对Redis的影响 3 3 绑核所带来的风险及解决办法 关于作者 关于作
  • Apache commons-dbutils工具简介说明

    转自 Apache commons dbutils工具简介说明 下文笔者讲述Apache commons dbutils工具简介说明 如下所示 commons dbutils简介 commons dbutils 是Apache提供的一个开源