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;//获取数据源@Beforepublic void getDs(){//获取数据源dataSource = new ComboPooledDataSource("testc3p0");//获取queryRunner对象qr = new QueryRunner(dataSource);}//添加数据@Testpublic 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);}//修改@Testpublic 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);}//删除@Testpublic void delTest() throws SQLException {//编写添加sql语句String sql = "delete from tb_dept where id = ?";//调用更新方法,传递参数int row = qr.update(sql, 1);System.out.println("受影响的行:"+row);}//通过Id查询数据@Testpublic 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);}//查询所有数据@Testpublic 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);}
}

查询左右运行结果: 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Upload-labs(Pass-14 - Pass-16)

Pass-14 &#xff08;图片马&#xff0c;判断文件类型&#xff09; 图片的格式在防护中通常是不会使用后缀进行判断的依据&#xff0c;文件头是文件开头的一段二进制码&#xff0c;不同类型的图片也就会有不同的二进制头。   JPEG (jpg)&#xff0c;文件头&#xff1a;FF D…

C++从入门到精通——类的6个默认成员函数之赋值运算符重载

赋值运算符重载 前言一、运算符重载定义实例注意要点 二、赋值运算符重载赋值运算符重载格式赋值运算符重载要点重载要点传值返回和传址返回要点 三、前置和后置重载 前言 类的6个默认成员函数&#xff1a;如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么…

ESP32S3在wsl环境的JTAG、openocd仿真调试

文章目录 一、准备工作二、添加 ESP-IDF 环境变量三、添加 udev 规则文件四、vscode 配置 一、准备工作 安装配置好 WSL、ubuntu, 参考连接&#xff1a; WSL2安装Ubuntu迁移到其他盘或者其他电脑_wsl ubuntu迁移-CSDN博客 WSL2 设置桥接模式_wsl2 桥接-CSDN博客 下载好 WSL-US…

Python 物联网入门指南(八)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第三十章&#xff1a;制作机械臂 最后&#xff0c;我们终于到达了大多数人自本书开始以来就想要到达的地方。制作一个机械臂&#xff01;在…

游戏生成式 AI:编织梦想,避开阴影

想象一下&#xff0c;一个沉浸式的游戏世界中玩家遇到的每个 NPC 都由 AI 驱动&#xff0c;他们能与玩家进行互动&#xff0c;从改变游戏体验。据 Inword 一项研究显示&#xff0c;绝大多数游戏玩家渴望这种互动&#xff0c;愿意投入更多的时间和金钱来玩这种由 AI 驱动的游戏。…

Linux_iptables防火墙学习笔记

文章目录 iptables 概述四表五链iptables 安装启动iptables 配置详解iptables配置文件iptables配置语法iptables常用实例查看规则修改默认规则保存和备份规则恢复备份的规则清空规则放行SSH服务在ubuntu14.04中iptables规则持久化 iptables 概述 主机型 对主机进行保护 网络型…

020——SPI模块驱动开发(基于DAC芯片和I.MX6uLL)

目录 一、 SPI简介 二、 Linux中的SPI 2.1 SPI控制器数据结构 2.2 SPI设备数据结构 2.3 SPI设备驱动 2.4 接口函数 2.4.1 函数原型 2.4.2 函数解析 2.5 SPI驱动框架 2.6 SPI控制器驱动程序 2.7 SPI设备驱动程序 三、 DAC实例 3.1 实验过程 3.2 驱动程序 3.3 应…

Redis--16--Spring Data Redis

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Spring Data Redishttps://spring.io/projects/spring-data-redis 1.依赖2.RedisTemplate3.案例 序列化1.默认是 JdkSerializationRedisSerializer2.添加Redis配置文…

MySQL基础-----约束详解

目录 一. 概述: 二.约束演示&#xff1a; 三.外键约束&#xff1a; 3.1介绍&#xff1a; 3.2外键约束语法&#xff1a; 3.3删除&#xff0c;更新行为&#xff1a; 一. 概述: &#x1f9d0;&#x1f9d0;概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制…

抖店创业日记:24年的抖音电商市场,“慢”比“快”更重要~

我是王路飞。 今天是2024年4月16日。 距离我坚持做抖店10年的目标&#xff0c;还有6年2个月的时间。 做抖店之前&#xff0c;我做过天猫、京东、快手等平台&#xff0c;随着时间的推移&#xff0c;愈加感觉到一个真理&#xff1a;只要不下牌桌&#xff0c;就永远不会失去机会…

Kubernetes(K8S)集群搭建-node节点配置

1.开始操作之前要先关闭防火墙&#xff0c;SELinux&#xff0c;swap分区 关闭防火墙 sudo systemctl stop firewalld禁用SELinux sudo setenforce 0 # 临时禁用 sudo sed -i s/^SELINUXenforcing$/SELINUXper…

【位运算 试填法】【推荐】3022. 给定操作次数内使剩余元素的或值最小

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…