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.mzph.cn/news/822932.shtml

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

相关文章

【电力大数据服务平台】项目可行性研究报告概述

一、项目简介 随着数据采集、存储和传输技术的飞速发展&#xff0c;各种智能电表、智能终端在电网中被快速推广应用。电力大数据云平台是大数据应用的基础和技术支撑&#xff0c;为大数据应用提供数据基础以及存储、计算、分析等能力&#xff0c;因此大数据平台是大数据应用真正…

光明与速度:AI网络中GPU与光模块的协奏曲

&#x1f3b6;在人工智能&#xff08;AI&#xff09;的世界里&#xff0c;GPU和光模块是实现高速计算和数据传输的关键。它们如同一场精心编排的交响乐&#xff0c;每个部分都不可或缺&#xff0c;共同创造出美妙的和谐。&#x1f3bc; GPU&#xff1a;AI网络的心脏&#x1f4…

redis部署模式,以及各自的优缺点介绍

在Linux服务器上进行Redis部署时&#xff0c;可以采用多种部署模式&#xff0c;每种模式都有其优缺点。以下是几种常见的部署模式以及它们的特点&#xff1a; 单节点部署&#xff1a; 描述&#xff1a;在单个服务器上部署 Redis 服务。优点&#xff1a;简单易用&#xff0c;适…

Java多线程の小知识杂糅

设置优先级 在Java多线程中&#xff0c;可以通过对线程设置优先级的方法&#xff0c;来调节线程被优先执行的概率。 package cn.edu.Lab;class MyThread extends Thread {public MyThread(String s) {this.setName(s);}public void run() {for(int i 0; i < 6; i) {Syste…

创建一个javascript公共方法的npm包,js-tool-big-box,发布到npm上,一劳永逸

前端javascript的公共方法太多了&#xff0c;时间日期的&#xff0c;数值的&#xff0c;字符串的&#xff0c;搞复制的&#xff0c;搞网络请求的&#xff0c;搞数据转换的&#xff0c;几乎就是每个新项目&#xff0c;有的拷一拷&#xff0c;没有的继续写&#xff0c;放个utils目…

Julia劳动力市场经济数学模型价值策略选择

&#x1f3af;要点 &#x1f3af;数据元素&#xff1a; &#x1f58a;变量处理 | &#x1f58a;代码多重调用 | &#x1f58a;集合&#xff1a;数组、字典、元组和命名元组 | &#x1f58a;矢量化代码&#xff1a;广播 | &#x1f58a;字符串处理 | &#x1f58a;提取HTTP查询…

SpringBoot将上传的文件保存到临时文件

介绍 当前端上传文件到后端&#xff0c;后端将文件上传到第三方&#xff0c;在后端不需要保存文件时可以考虑使用临时文件进行存储。好处是&#xff1a;不必再为文件找一个临时的存储位置。 使用场景 #mermaid-svg-wEocgeoz3nUibGPg {font-family:"trebuchet ms",v…

AJAX (异步的JavaScript 和 XML)

目录 1、什么是AJAX 2、作用 1&#xff09;与服务器通信 2&#xff09;异步交互&#xff08;更新局部页面&#xff09; 3、AJAX 的基本工作原理 4、应用举例 5、jQuery与AJAX 6、使用jQeury实现AJAX 1&#xff09;$.ajax()&#xff1a;发送异步请求 2&#xff09;$.g…

2024五一杯数学建模C题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

HCIA网络基础

HCIA网络基础是华为认证体系中一个至关重要的部分&#xff0c;它涵盖了计算机网络的基本概念、原理、技术和应用。以下是关于HCIA网络基础更详细的介绍&#xff1a; 一、网络基本概念和特点 网络是由若干计算机和其他设备通过通信线路或其他手段连接起来&#xff0c;进行数据…

JS和TS基础学习

javaScripte export和import javascript中import和export详解 JS之export JS中export怎么用&#xff1f; export导出分为两种导出 命名导出&#xff08;每个模块包含任意数量&#xff09; 默认导出&#xff08;每个模块包含一个&#xff09; var、let、const [JavaScript中…

解决npm install安装node-sass包容易失败的问题

具体问题如下&#xff1a; npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: XXX3.4.0 npm ERR! Found: webpack5.31.2 npm ERR! node_modules/webpack npm ERR! peer webpack”^4.0.0 || ^5.0.0″ from html-…

SpringBoot和Axios数据的传递和接收-Restful完全版

文章目录 一、基础知识铺垫Axios使用HTTP请求方式数据传输方式SpringBoot获取数据的方式 二、基础传递代码示例&#xff08;一&#xff09;Path Variables&#xff08;二&#xff09;Get、DeleteRequestParamModelAttribute &#xff08;三&#xff09;Post、Put、PatchRequest…

FreeRTOS学习 -- 中断配置

一、什么是中断 中断时微控制器一个很常见的特性&#xff0c;中断是由硬件产生&#xff0c;当中断产生以后CPU就会中断当前的流程而去处理中断服务&#xff0c;Cortex-M内核的MCU提供了一个用于中断管理的嵌套向量中断控制器&#xff08;NVIC&#xff09;。 二、中断优先级分…

土壤湿度传感器:助力农业现代化

随着科技的飞速发展&#xff0c;越来越多的先进技术被应用到农业生产中。其中&#xff0c;土壤湿度传感器作为现代农业的重要工具&#xff0c;正逐渐改变着传统农业的生产方式&#xff0c;成为农业现代化的秘密武器。 精确监测&#xff1a;土壤湿度传感器能够实时、精确地监测土…

WIN7用上最新版Chrome

1.下载WIN10最新版Chrome的离线安装包 谷歌浏览器 Chrome 最新版离线安装包下载地址 v123.0.6312.123 - 每日自动更新 | 异次元软件 文件名称&#xff1a;123.0.6312.123_chrome_installer.exe。 123.0.6312.123_chrome_installer.exe 文件右键解压缩得到 chrome.7z&#x…

树莓派3B长时间不操作屏幕息屏无信号处理

树莓派外接显示器&#xff0c;需长时间展示某个网页&#xff0c;经过一段时间&#xff0c;显示器屏幕会黑掉显示无信号。 需修改 /etc/lightdm/lightdm.conf 配置文件中新增如下两行并重启。 xserver-commandX -s 0 dpms sleep-inactive-timeout0

软考 - 系统架构设计师 - Web 应用真题(2)

问题 1&#xff1a; 淘汰策略&#xff1a;遗留系统技术含量低&#xff0c;业务价值也低&#xff0c;所以需要全面重新开发一个系统来替代遗留系&#xff1b;&#xff08;一般是企业的业务发生了根本变化&#xff0c;遗留系统已经基本不再适应企业运作的需要&#xff1b;或者是遗…

【Python基础】19.eval函数的使用

eval函数 eval()将字符串转变为有效的表达式来求值并返回对应的结果 基础数据计算 In [1]: eval("1 1") Out[1]: 2字符串重复 In [2]: eval (" * * 10") Out[2]: **********字符串转为列表 In [3]: type(eval("[1,2,3,4,5]")) Out[3]: lis…

docker 简单使用

docker 简单使用 一、 docker 安装二、docker 使用1. docker pull 拉取镜像2. docker run 后台运行3. docker ps 查看容器运行状态4. docker exec 进入容器5. exit 退出容器6. docker restar 重启容器7. docker stop 停止运行容器8. docker stop 启动容器9. docker stop 删除容…