DBUtils工具类的使用

1、DBUtils是什么

为了更加简单地使用JDBC,Apache组织提供了一个DBUtils工具,它是操作数据库的一个组件,实现了对JDBC的简单封装,可以在不影响数据库访问性能的情况下简化JDBC的编码工作量。DBUtils工具要有2个作用。

写数据,DBUtils可以通过编写SQL语句对数据表进行增、删、改操作。

读数据,DBUtils工具可以将从数据表中读取的数据结果集转换成Java常用类集合,以方便对结果进行处理。

2、DBUtils的核心类

DBUtils核心类库主要包括DBUtils类、QueryRunner类和ResultSetHandler接口。DBUtils工具主要通过这三个核心API进行JDBC的所有操作。

  • QueryRunner类:用来执行sql语句
  • DbUtils类:用来释放资源
  • ResultSetHandler接口:用来接收查询的结果集

2.1、QueryRunner类

QueryRunner类简化了执行SQL语句的代码,它与ResultSetHandler配合就能完成大部分的数据库操作,大大减少了编码量。QueryRunner类提供了2个构造方法

构造方法作用
QueryRunner()如果使用空参数构造方法创建对象,那么使用update方法和query方法时,必须传递conn对象
QueryRunner(DataSource ds)如果使用的是带连接池的构造方法,那么QueryRunnery类会自动的从连接池中获取conn对象
使用完毕会自动把conn对象归还给连接池

2.2、QueryRunner类的常用方法

QueryRunner主要提供了2个方法:

  • 用来执行insert,update,delete语句的方法:update ,该方法返回int类型的值
  • 用来执行select语句的方法:query 该方法返回对象或者集合

3.3、ResultSetHandler实现类

BeanHandler和BeanListHandler实现类是将结果集中的数据封装到对应的JavaBean中。在封装时,表中数据的字段和JavaBean的属性是相互对应的,一条数据记录被封装进一个对应的JavaBean对象中。BeanHandler和BeanListHandler的对比如下表所示。

3、增删改测试

3.1、数据准备

maven依赖

<dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

创建表,添加数据

-- ----------------------------
-- 创建部门表
-- ----------------------------
DROP TABLE IF EXISTS `tb_dept`;
CREATE TABLE `tb_dept` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '部门编号',
  `dept_name` varchar(20) NOT NULL COMMENT '部门名称',
  `dept_desc` varchar(200) DEFAULT NULL COMMENT '部门简介',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- 添加部门表数据
INSERT INTO `tb_dept` VALUES ('1', '研发部', '负责公司的产品研发工作');
INSERT INTO `tb_dept` VALUES ('2', '市场部', '负责市场推广和客户关系管理');
INSERT INTO `tb_dept` VALUES ('3', '销售部', '负责销售和客户关系维护');
INSERT INTO `tb_dept` VALUES ('4', '人力资源部', '负责招聘、培训和员工关系管理');
INSERT INTO `tb_dept` VALUES ('5', '财务部', '负责公司的财务管理和报表制作');

创在resources目录下添加c3p0-config.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<c3p0-config>
    <named-config name="testc3p0">
        <!--指定链接数据源的基本属性-->
        <!--驱动-->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <!--路径-->
        <property name="jdbcUrl">
            jdbc:mysql://localhost:3306/db_student
        </property>
        <!--用户名-->
        <property name="user">root</property>
        <!--密码-->
        <property name="password">123456</property>
        <!--连接池设置-->
        <!--初始化连接的数量-->
        <property name="initialPoolSize">20</property>
        <!--最大有多少连接-->
        <property name="maxPoolSize">40</property>
        <!--当超出最大数量的时候,每次增加多少条连接-->
        <property name="acquireIncrement">5</property>
        <!--最少有多少连接-->
        <property name="minPoolSize">10</property>
    </named-config>
</c3p0-config>

 添加实体类

public class Dept {
    private int id;
    private String dept_name;
    private String dept_desc;
    //省略getter setter
}

3.2、CURD测试

public class QueryRunnerInsertDemo {
    ComboPooledDataSource dataSource;
    QueryRunner qr;
    //获取数据源
    @Before
    public void getDs(){
        //获取数据源
        dataSource = new ComboPooledDataSource("testc3p0");
        //获取queryRunner对象
        qr = new QueryRunner(dataSource);
    }
    //添加数据
    @Test
    public void addTest() throws SQLException {
        //编写添加sql语句
        String sql = "insert into tb_dept(dept_name,dept_desc) values(?,?)";
        //调用更新方法
        int row = qr.update(sql, "开发部", "需求变现");
        System.out.println("受影响的行:"+row);
    }
    //修改
    @Test
    public void upTest() throws SQLException {
        //编写添加sql语句
        String sql = "update tb_dept set dept_name=?,dept_desc=? where id = ?";
        //调用更新方法,传递参数
        int row = qr.update(sql, "开发部","需求变现",1);
        System.out.println("受影响的行:"+row);
    }
    //删除
    @Test
    public void delTest() throws SQLException {
        //编写添加sql语句
        String sql = "delete from tb_dept where id = ?";
        //调用更新方法,传递参数
        int row = qr.update(sql, 1);
        System.out.println("受影响的行:"+row);
    }
    //通过Id查询数据
    @Test
    public void findById() throws SQLException {
        //编写添加sql语句
        String sql = "select * from tb_dept where id = ?";
        //获取BeanHandle对象
        BeanHandler<Dept> beanHandler = new BeanHandler<>(Dept.class);
        //调用查询方法,传递参数
        Dept dept = qr.query(sql, beanHandler,1);
        System.out.println("对象:"+ dept);
    }

    //查询所有数据
    @Test
    public void findAll() throws SQLException {
        //编写添加sql语句
        String sql = "select * from tb_dept";
        //获取BeanListHandle对象
        BeanListHandler<Dept> beanListHandler = new BeanListHandler<>(Dept.class);
        //调用查询方法
        List<Dept> depts = qr.query(sql, beanListHandler);
        System.out.println("集合:"+ depts);
    }
}

查询左右运行结果: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/549780.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣周赛392复盘

3105. 最长的严格递增或递减子数组 题目 给你一个整数数组 nums 。 返回数组 nums 中 严格递增 或 严格递减 的最长非空子数组的长度。 思考&#xff1a; 返回什么&#xff1a;返回最长非空子数组的长度。return max(decs_len,incs_len); 但实际上我们只需要用一个变量ans就…

记录PS学习查漏补缺

PS学习 PS学习理论快捷键抠图PS专属多软件通用快捷键 PS学习 理论 JPEG &#xff08;不带透明通道&#xff09; PNG (带透明通道) 快捷键 抠图 抠图方式 魔棒工具 反选选中区域 CtrlShiftI&#xff08;反选&#xff09; 钢笔抠图注意事项 按着Ctrl单击节点 会出现当前节…

漫步密度森林:借助HDBSCAN实现高效数据聚类

文章来源&#xff1a;navigating-the-density-forest-harnessing-hdbscan-for-advanced-data-clustering 2024 年 4 月 9 日 介绍 在数据科学中&#xff0c;聚类算法是揭示数据集内在结构的重要工具。在这些工具中&#xff0c;基于分层密度的噪声应用空间聚类 (HDBSCAN) 作为…

arm中模/数转换器工作原理以及I2C工作原理

ADC介绍 什么是ADC ADC就是模拟到数字转换器(Analog-to-Digital Converter)的缩写。 它是一种电子设备或模块,S3C2440内部拥有一个ADC外设。用于将连续变化的模拟信号转换为离散的数字信号,以便数字系统(如微处理器、微控制器等)能够对其进行处理和分析。 模拟信号:一…

Spring学习(二)

图解&#xff1a; 2.核心容器总结 2.2.1 容器相关 BeanFactory是IoC容器的顶层接口&#xff0c;初始化BeanFactory对象时&#xff0c;加载的bean延迟加载 ApplicationContext接口是Spring容器的核心接口&#xff0c;初始化时bean立即加载 ApplicationContext接口提供基础的be…

【GDAL-Python】10-在Python中可视化多波段卫星影像

文章目录 1-介绍1.1 主要内容1.2 线性拉伸介绍 2-代码实现2.1 数据介绍2.2 代码实现2.3 效果显示 4-参考资料 1-介绍 1.1 主要内容 &#xff08;1&#xff09;在本教程中&#xff0c;主要介绍如何使用 Python 和 matplotlib 可视化多波段 Landsat 8 卫星影像组成的真彩色影像…

新能源锂电池起火自燃怎么办?全氟己酮自动灭火装置可以提前预防!

3月28日晚&#xff0c;广州市天河区某小区一居民楼突发火灾。据消防部门通报&#xff0c;此次火灾因室外电动自行车&#xff08;未充电状态&#xff09;发生自燃引起&#xff0c;烧毁一辆电动自行车&#xff0c;无人员伤亡。无独有偶&#xff0c;新能源汽车和自行车起火自燃的事…

1.2MHz,固定频率白光LED驱动器

一、产品概述 TX6216是一款升压转换器&#xff0c;设计用于通过单节锂离子电池驱动多达7个串联的白光LED。 TX6216采用电流模式&#xff0c;固定频率架构来调节LED电流&#xff0c;LED电流通过外部电流检测电阻测量。其低104mV反馈电压可降低功率损耗并提高效率。 TX6216具有…

5种方法,教你如何清理接口测试后的测试数据

在接口测试之后&#xff0c;清理测试数据是一个很重要的步骤&#xff0c;以确保下一次测试的准确性和一致性。以下是一些常见的测试数据清理方法&#xff1a; 1. 手动清理&#xff1a; 这是最基本的方法&#xff0c;即手动删除或重置测试数据。您可以通过访问数据库、控制台或…

数据结构学习之路--实现带头双向循环链表的详解(附C源码)

嗨嗨大家~本期带来的内容是&#xff1a;带头双向循环链表的实现。在上期文章中我们提到过带头双向循环链表&#xff0c;那么它的实现又是怎样的呢&#xff1f;今天我们来一探究竟&#xff01; 目录 前言 一、认识带头双向循环链表 1 认识双向链表 2 带头双向循环链表的定…

【精读文献】Scientific data|2017-2021年中国10米玉米农田变化制图

论文名称&#xff1a;Mapping annual 10-m maize cropland changes in China during 2017–2021 第一作者及通讯作者&#xff1a;Xingang Li, Ying Qu 第一作者单位及通讯作者单位&#xff1a;北京师范大学地理学部 文章发表期刊&#xff1a;《Scientific data》&#xff08…

如何在 VM 虚拟机中安装 OpenEuler 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 若没有安装虚拟机的可以参考下篇文章进行安装&#xff1a; 博客链接https://eclecticism.blog.csdn.net/article/details/135713915 二、OpenEuler 镜像 点击链接前往官网 官网 选择第一个即可 三、安装 OpenEuler 打开虚拟机安装 Ctrl …

【C++】哈希一

这篇博客要说的是哈希算法&#xff0c;哈希又称为散列&#xff0c;它是将存储的值和存储的位置建立起关联关系的一种算法&#xff0c;或者说是一种将任意长度的数据映射为固定长度的输出的算法。 什么意思呢&#xff1f;我们来看一个例子&#xff1a;比如说我们要存储1&#xf…

控制某个对象缩放

效果如下&#xff1a; 您只需要控制此对象进行激活&#xff0c;将对象设置为&#xff1a;gameObject.SetActive(true);即可实现此次效果 代码如下&#xff1a; public class StartShowRun : MonoBehaviour {Transform _localTransfrom;Vector3 _localScale;public AnimationC…

高效可扩展,使用Dask进行大数据分析

大家好&#xff0c;Dask技术作为并行计算领域的创新力量&#xff0c;正在重塑大数据的处理模式。这项开源项目为Python语言带来了强大的并行计算能力&#xff0c;突破了传统数据处理在扩展性和性能上的瓶颈。 本文将介绍Dask的发展历程、架构设计&#xff0c;并分析其在大数据…

Qt中连接mysql

1、安装mysql&#xff0c;workbench&#xff0c;为mysql添加环境变量 2、安装Qt带src&#xff0c;然后到如下目录&#xff0c;找到mysql.pro(建议做个副本先) http://D:\Qt\Qt5.13.2\5.13.2\Src\qtbase\src\plugins\sqldrivers\mysql mysql.pro 注意路径的 \ / 和双引号的使…

算法练习第15天|226.翻转二叉树

226.翻转二叉树 力扣链接https://leetcode.cn/problems/invert-binary-tree/description/ 题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&am…

高分二号卫星(GF-2):中国遥感科技的新高度

​高分二号卫星&#xff08;GF-2&#xff09;是中国在高分辨率地球观测领域的重要成就&#xff0c;其引入了先进的成像技术和灵活的数据获取模式&#xff0c;为地球资源监测、环境保护、城市规划等领域提供了强大的数据支持。本文将深入介绍高分二号卫星的技术特点、成像能力以…

软件测试---性能测试

1.常见的性能问题有哪些 如图所示 系统内部以及软件的代码实现 1&#xff0c;资源泄漏&#xff0c;包括内存泄漏。 2&#xff0c;CPU使用率达到100%&#xff0c;系统被锁定等。 3&#xff0c;线程死锁&#xff0c;阻塞等造成系统越来越慢。 4&#xff0c;查询速度慢&#xff0c…

Console口和Telnet功能配置实验

一、基础配置 <Huawei>system-view //进入系统视图 Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable //关闭接口提示 Info: Information center is disabled. [Huawei]sysname AR1 //配置设备名为 R1 [AR1]interface GigabitEthern…