【JDBC】使用DBUtils包来管理JDBC

JDBC——JDBC中的事务、DBUtils使用事务 目录 什么是事务? JDBC中的事务 DBUtils使用事务 什么是事务? 跳转到目录 事务概述 事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败. 事务作用:保证在一个事务中多次SQL操作要么全都成功,要么全都失败. JDBC中的事务 跳转到目录 JDBC完成转账功能(加入事务管理) 场景: tom 欠 jerry 1000元 使用2条update语句... 阅读详情

什么是DBUtils?是JDBC的简化开发工具包。使用它就不用再写很多冗余的代码了。总而言之,就是使得JDBC的操作更加的简单化了。

为啥要用DBUtils

诞生背景:

  • 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils。
  • DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。

成功导入DBUtils驱动包

核心优点:

  1. **无资源泄漏 **- DBUtils类确保不会发生资源泄漏。
  2. 清理和清除代码 - DBUtils类提供干净清晰的代码来执行数据库操作,而无需编写任何清理或资源泄漏防护代码。防止了SQL注入。
  3. Bean映射 - DBUtils类支持从结果集中自动填充Javabeans。

特性:

  1. DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
  2. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
  3. Dbutils三个核心功能介绍
  • QueryRunner类 中提供对sql语句操作的API
  • ResultSetHandler接口,用于定义select操作后,怎样封装结果集
  • DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

下面,将从QueryRunner类展开,详解DBUtils包在开发中的具体使用!

完整项目:
https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/05-%E4%BD%BF%E7%94%A8DBUtils

QueryRunner类

**功能:**包装并执行SQL语句

核心方法:

  • int update(Connection conn, String sql, Object... params),用来完成表数据的增加、删除、更新操作,返回执行成功后影响的行数。可变参数的出现是因为SQL语句中会出现占位符。
  • <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作,返回的是相关类型。T表示泛型。

**Notice:**update方法使用示例如下,query方法使用示例在ResultSetHandle接口的讲解中!

使用的数据库

CREATE DATABASE mydb;

USE mydb;

CREATE TABLE `person` (
  `pid` INT(11) NOT NULL,
  `pname` VARCHAR(20) NOT NULL,
  `page` INT(11) DEFAULT NULL,
  `psex` CHAR(10) DEFAULT NULL,
  `ptel` VARCHAR(20) DEFAULT NULL,
  `pemail` VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

注册驱动并建立起连接

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.junit.Test;

public class DBUtilsUpdate {
	static final String driver = "com.mysql.jdbc.Driver";
	static final String url = "jdbc:mysql://localhost:3306/kdb";
	static final String user = "root";
	static final String passwd = "kyle";
	
	@Test
	public void testConnect() {
		Connection con = buildConnection();
		System.out.println(con); //com.mysql.jdbc.JDBC4Connection@2e3967ea
		closeConnection(con);
	}
	
	public Connection buildConnection() {
		Connection conn = null;

	    //Step 1: Register JDBC driver
	    DbUtils.loadDriver(driver);
	    //Step 2: Open a connection
	    System.out.println("Connecting to database...");
	    try {
			conn = DriverManager.getConnection(url, user, passwd);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	    
	    //System.out.println(conn);
		return conn;
	}
	
	public void closeConnection(Connection conn) {
		try {
			DbUtils.close(conn);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

update操作

public void update(Connection conn) {
	QueryRunner qr = new QueryRunner();
	String sql = "UPDATE person SET p_name=?,p_age=? WHERE p_id=?";
	//定义Object数组,存储?中的参数
	Object[] params = {"huawei",200,1};
	int row = 0;
	try {
		row = qr.update(conn,sql,params);
		System.out.println("受影响的函数为:" + row);
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		DbUtils.closeQuietly(conn);
	}
}

create操作

public void insert(Connection conn) {
	QueryRunner qr = new QueryRunner();
	String sql = "INSERT INTO person (p_id,p_name,p_age) VALUES (?,?,?)";
	Object[] params = {5,"apple",30};
	int row = 0;
	try {
		row = qr.update(conn,sql,params);
		System.out.println("受影响的行数为:" + row);
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		DbUtils.closeQuietly(conn);
	}
}

delete操作

public void delete(Connection conn) {
	QueryRunner qr = new QueryRunner(); //创建SQL类对象
	String sql = "DELETE FROM person WHERE p_id=?";
	int row;
	try {
		row = qr.update(conn,sql,3); //参数:连接对象,要执行的SQL语句,SQL语句中各个问号的具体值
		System.out.println("被影响的行数为:" + row);
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		DbUtils.closeQuietly(conn);
	}
}

ResultSetHandle接口

**功能:**接收并处理QueryRunner类的query方法执行结果!

注意:完整展示见——https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/05-%E4%BD%BF%E7%94%A8DBUtils

接口实现类概览:

  1. ArrayHandler 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
  2. ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
  3. BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中。
  4. BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
  5. ColumnListHandler 将结果集中指定的列的字段值,放到一个List集合中
  6. ScalarHandler 应用于查询结果集中有且只有一个结果(仅一行一列)的情形
  7. MapHandler 将结果集第一行封装到Map集合中,Key 列名, Value 该列数据
  8. MapListHandler 将结果集所有行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

将查询结果存于顺序表

**ArrayHandler类功能:**将结果集第一行存储到Object数组中

public static void arrayHandler(Connection conn)throws SQLException{
	QueryRunner qr = new QueryRunner();
	String sql = "SELECT * FROM person";
	//调用方法query执行查询,传递连接对象,SQL语句,结果集处理方式的实现类
	//返回对象数组
	Object[] result = qr.query(conn, sql, new ArrayHandler());
	for(Object obj : result){
		System.out.print(obj + "  ");
	}
}

**ArrayListHandler类功能:**将结果集全部存储到Object数组中

public static void arrayListHandler(Connection conn) throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT * FROM person";
		List<Object[]> result = qr.query(conn, sql,new ArrayListHandler());
		for(Object[] objs:result) { //遍历集合
			for(Object obj:objs) {
				System.out.print(obj + " ");
			}
			System.out.println();
		}
}

将查询结果存于对象

BeanHandler类功能:将第一条记录存放到一个JavaBean中

Person s = qr.query(conn, sql, new BeanHandler<Person>(Person.class)); //Person类一个含有pid,pname,page变量的JavaBean
System.out.println(s.getP_id() + " " + s.getP_name() + " " + s.getP_age());

BeanListHandler类功能:将所有记录存放到一个List集合包装的JavaBean中

List<Person> list = qr.query(conn, sql, new BeanListHandler<Person>(Person.class));
for(Person s : list){
	System.out.println(s);
}

将查询结果存于集合

MapHandler类功能:将结果集的第一行数据封装到Map集合中,其中“键”是列名,“值”是这列的数据;

Map<String,Object> map = qr.query(conn, sql, new MapHandler());
//遍历Map集合
for(String key : map.keySet()){
	System.out.println(key+".."+map.get(key));
}

MapListHandler类功能:将结果集的全部封装到Map集合中

List<Map<String,Object>> list = qr.query(conn, sql, new MapListHandler());
//遍历集合list
for( Map<String,Object> map : list ){
	for(String key : map.keySet()){
		System.out.print(key+": "+map.get(key)+"  ");
	}
System.out.println();

ColumnListHandler类使用

**功能:**将结果集中的指定列的数据值,存放到一个List集合中。因为每个列的数据类型可能都是不同的,所以需要使用Object类型。

List<Object> list = qr.query(conn, sql, new ColumnListHandler<Object>("p_name")); //把数据库中pname所在列的所有数据放在一个List中
for(Object obj : list){
	System.out.println(obj);
}

ScalarHandler类使用

适用于:结果集中有且只有一个结果(仅有一行一列)时的情形。

Object count = qr.query(conn, sql, new ScalarHandler<Long>()); //如果已经确定查询结果是个int型,则不用Object类型
System.out.println(count);

实例讲解MOS管电源开关电路的软启动 1、控制电源开关的输入信号 Control 为低电平或高阻时,三极管Q2的基极被拉低到地,为低电平,Q2不导通,进而MOS管Q1的Vgs = 0,MOS管Q1不导通,+5V_OUT 无输出。此时将 Control 设为低电平,三极管Q2关闭,电容C1与G极相连端通过电阻R2放电,电压逐渐上升到5V,起到软关闭的效果。不过从作者的描述来看,只是电路参数有区别,能通过的电流、能承受的耐压等不一样,但是软启动的原理是一样的。从公式可以看出,当电容容量越大,电压越高,时间越短,电流就会越大,从而形成浪涌电流。 阅读详情

相关推荐

无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误怎么解决

本文的内容是无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误的解决办法。

西岸贤 1万+

程序包com.mysql.jdbc不存在

在IDEA编译项目代码的时候提示这个 我遇到的情况是pom中mysql依赖是runtime,改掉就行。

yLazL0000的博客 2484

Ubuntu 20.04 环境下Autoware.universe 与 Carla 0.9.13 联合仿真

安装内容: ROS Galactic Autoware.universe based on ROS Galactic Carla 0.9.13 UnrealEngine 4.26 Openplanner (additional files: op-bridge/op-agent/scenariorunner/map data)

mhl1107的博客 1798

怎么把一个java转换成一个bat文件

需求:最近由于客户对安全性检查有一定的要求,然后需要我们配置连接的数据库的密码需要加密 设计:配置文件里面的密码输入为加密后的,代码里面读取的时候,则直接进行解密,这个时候就需要一个bat文件来生成加密后的密码了 步骤: 1.创建加密工具类 package com.hqdps.utils; import java.util.Scanner; import java.security.Key; import java.security.NoSuchAlgorithmException; impor

水蜜桃桃桃的博客 1503

深入IR2104数据手册:被忽略的SD引脚用法和死区时间调节实战

本文深入解析IR2104半桥驱动芯片的SD引脚用法和死区时间调节技巧,帮助硬件工程师优化电机控制和电源转换系统。通过详细的电路设计、实测数据和调试方法,揭示SD引脚的多重保护机制和死区时间的精密调节策略,提升系统安全性和效率。

weixin_30342363的博客 390

Python量化交易:主流回测框架Backtrader入门详解

Python量化交易框架Backtrader入门指南 Backtrader是一个功能强大的Python量化回测框架,可以帮助交易者专注于策略逻辑而非基础设施。本文介绍了Backtrader的核心架构和使用方法: 框架优势:自动处理订单执行、手续费、滑点、仓位管理等复杂问题,采用事件驱动模式接近真实交易场景。 核心组件: Cerebro:控制中心 Strategy:交易策略 Data Feed:数据输入 Broker:模拟经纪商 Indicators:技术指标 使用流程: 安装:pip install bac

Science prince的博客 935

DM8-JDBC

DM8-JDBC

njcwwddcz的博客 9715

实时系统vxWorks - 虚拟机环境搭建

概述VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的...

不只会拍照的程序猿 7850

java工具类使用_JavaUtils

JavaUtils V0.0.3.20200806_beta个人使用java工具类1.工具类明细jdbcUtil 数据库简单操作工具类LambdaUtil lambda完善工具类ListUtil 数组工具类StringUtil 字符串工具类TreeUtil 属性结构工具类2.工具类详解2.1 LambdaUtil2.1.1 consumerWithInde...

weixin_31967777的博客 737

《电磁兼容设计》专栏说明

本专栏自2024年1月起开始更新,仅设此一个电磁兼容相关知识专栏,并将一直持续更新下去,无期限

linkking27的博客 791

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

孤独的单刀 1625

达梦数据库的JDBC

达梦数据库

leese233的博客 3062

【2026 Science Robotics】Learning realistic lip motions for humanoid face robots

哥伦比亚大学Yuhang Hu团队提出了一种创新方法,通过10自由度软体嘴唇设计和自监督学习算法解决仿人机器人嘴唇动作僵硬问题。研究采用变分自编码器(VAE)和面部动作Transformer(FAT)模型,将语音信号转化为机器人可执行的电机指令。实验表明,该方法在多语言测试中表现优异,用户偏好率达62.5%,显著提升了口型同步的真实感和流畅度。该成果突破了传统机械结构的限制,为跨越"恐怖谷效应"提供了有效解决方案。

志在山顶的人,不会贪念山腰的风景 308

Commons dbutils、pool、dbcp以及JDBC事务

1.dbutils包: 提供执行sql语句的功能,简化过程 (1)执行添加、删除语句 public static void add() throws SQLException { QueryRunner qr = new QueryRunner();//实例化 Connection conn = DButil.getConn();//...

anpeng_1983的博客 251

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Druid数据库连接池和DbUtils框架包

Druid数据库连接池和DbUtils框架包 今天小掰在线分享刚学到Druid和DbUtils的使用方法 数据连接池 首先,数据库连接池是什么,为什么要使用数据库连接池?数据库连接池顾名思义就是存放一些连接数据库的数据配置和方法。使用数据库连接池主要是减少对数据库的操作,在程序启动时就创建一些连接对象,先让启动n个连接对象、设置最多连接对象。 Druid数据库连接池使用步骤如下 1、导入druid-1.1.9.jar 2、通过JAVA代码直接获取连接池对象 3、获取连接druidDataSource.get

weixin_47795786的博客 400

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用工具类DbUtils连接数据库,并简单操作数据库

一、文章结构 工具类完整源码 SQL语句编写及操作 标识符的一般命名规范 二、工具类DbUtils 编写工具类的准备工作 安装mysql数据库,并制作表格; 在工程目录下新建lib文件夹,导入mysql-connector-java-5.1.37-bin.jar包,右键文件选择Build Path-->add Build Path... 编写配置文件,放入src目录下 不同的数据库...

weixin_34088598的博客 495

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JDBC第三方jar包的使用

commons-dbutils-1.6.jar: 可以操作JDBC连接数据库,并且执行SQL语句,处理返回的结果集 三个核心类: DbUtils:关闭资源方法(安静的关闭,不要异常处理) QueryRunner:执行SQL语句,并且返回你想要的结果集 ResuktSetHandler(参数): 接口(使用实现类,想要什么结果集,就传入什么该接口的实现类) 举例: 导入...

M_ount的博客 1706

jdbc通过属性文件连接mysql数据库案例

直接使用jdbc连接数据库的代码:import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class TestJDBC { public static void main(String[] args) { ...

StrangerMonologuer的博客 423

CRUD增删改查,MySql Druid简化代码封装增删改查

一个javaBean,一个封装好增删改查的逻辑操作(工具类可以供多个JavaBean使用),一个Dao接口,是对应实体类的增删改查,一个实现类,继承工具类,同时实现Dao接口。一套JDBC连接数据库的增删改查就封装好了使用三个第三方Jar包,其中QueryRunner类简化了代码的书写,使用这个类可以直接调用封装好的增删改查逻辑,传入数据源在查询的时候无须手动管理数据池里的连接,如需要事务处理,可以直接传入Connection数据库连接手动管理。

qq_63749263的博客 212

java学习第四十九天内容

1.前一天重点内容复习 MVC三层架构思想 M:model(业务模型) 通过service业务层调用dao数据访问接口,获取业务数据 V:View(视图层) 通过控制器来控制视图 C:controller(控制层) 核心技术:servlet ...

weixin_43831183的博客 347

DBUtils和Spring Jdbc Template

DBUtils和Spring Jdbc TemplateDbutilsDBUtils简介DbUtils类QueryRunner类ResultSetHandler接口开发步骤Jdbc TemplateJdbcTemplate简介JdbcTemplate主要提供以下四类方法JdbcTemplate的开发步骤 Dbutils DBUtils简介 commons-dbutils 是 Apache 组织...

SYJ_1835_LPM的博客 2420

DBUtils工具类的使用方法详解

DBUtils使用方法详解 前言 本文是关于DBUtils使用方法的介绍,但在使用DBUtils之前我们要知道什么是DBUtils,为什么要是用DBUtils,使用它有什么好处? 在介绍DBUtilszhiqi

敷衍zgf的博客 2万+

DBUtils的使用详解

DBUtils的使用详解 一:Dbutils是什么? Dbutils:主要是封装了JDBC的代码,简化Dao层的操作。 作用:帮助java程序员,开发Dao层代码的简单框架。 类似于前面的万能查找搜索等工具类 二:为什么需要Dbutils ? 在使用Dbutils 之前,我们Dao层使用的技术是JDBC,那么分析一下JDBC的弊端: (1)数据库链接对象、sql语句操作对象,封装结果集对象,这三大对象会重复定义 (2)封装数据的代码重复,而且操作复杂,代码量大 (3)释放资源的代码重复 三:Dbutils三

m0_49169461的博客 3788

JDBC工具类DBUtils封装jar包

JDBC工具类DBUtils封装jar包 通过对JDBC操作数据库的学习,我们会发现,由于JDBC操作数据库的步骤基本没有大的变化,针对所有的数据访问操作,都会存在大量重复代码,因此,对操作数据库的步骤封装就显得十分有必要了,如下: JDBC操作数据库时,每执行一次操作都要重新执行JDBC的获取连接对象、获取处理命令的对象、执行sql操作、处理结果、关闭资源的几个步骤的话,大大加重的程序员的...

Max的博客 2207

【JDBC】使用DBUtils管理SQL的执行

在以往的JDBC操作中,我们使用Satement或PreparedStatement去执行SQL,使用ResultSet来获取执行的结果。现在有一款工具,直接替代了以上的操作,能够实现一行代码就执行SQL并获得结果,那就是DBUtils工具包!

极客-多重人格递归 1081

DBUtils与JDBC使用

*一、DBUtils DBUtils是一个为简化JDBC(Java数据库连接)操作的小类库。DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。 DBUtils是java编程中的数据库操作实用工具,小巧简单实用。 DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。 使用遵从以下步骤: 1.加载JDBC驱动程序类,并用DriverManager来得到一个数据库连接实例conn。 2.实例化 Query

weixin_45193229的博客 626
上一篇: Hello,数据结构
下一篇: 【XML】什么是XML?
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值