DBUtils工具类的使用方法详解

article/2025/10/3 0:39:00

DBUtils使用方法详解

目录

    • DBUtils使用方法详解
        • 一、前言
        • 二、JDBC介绍
          • 1.基本概念
          • 2.JDBC访问数据库的流程
        • 三、DBUtils介绍
          • 1.基本概念
          • 2.配置文件
          • 3.创建JDBCUtils类
          • 4.实现对数据表的增删改查
        • 四、对以上代码的说明
        • 五、总结

一、前言

本文是关于DBUtils使用方法的介绍,但在介绍DBUtils之前,首先介绍一些JDBC的基础知识,有不足之处欢迎大家指正!

二、JDBC介绍

1.基本概念

JDBC,英文名为:Java DataBase Connectivity它是Java和数据库之间的桥梁,是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库(java.sql,javax.sql)使用这些类库可以以一种标准的方法,方便的访问数据库资源。
它最大的优点是为访问不同的数据库提供了一种统一的途径。接下来用两张图形象的说明这一特点。

  • 没有JDBC时,Java程序访问数据库时:

没有JDBC时,java应用程序访问各类数据库过程

  • 有了JDBC,Java程序访问数据库时:

java应用程序通过JDBC访问各种数据库
本文中的代码都是针对于MySql数据库实现的,并且所有代码都经过测试,各位放心食用。

2.JDBC访问数据库的流程
  1. 加载驱动(DriverManager)
  2. 获取连接(DriverManager,Connection)
  3. 获取执行SQL对象(Statement,PrepareStatement)
  4. 解析结果集(ReslutSet)
  5. 释放资源(close())

以上五个步骤每写一个操作数据库的类都是需要的,例如加载驱动、获取数据库连接、释放资源这三个步骤都要写到。为了简化代码,让程序的可移植性和观赏性更高,更加灵活的应对各种变化,需要编写一个工具类来处理这些重复的步骤,这样就引出了DBUtils工具类。

三、DBUtils介绍

1.基本概念

DBUtils:它是Apache组织提供的一个对JDBC进行简单封装的开源工具类,使用它能简化JDBC应用程序的开发,提高代码的可移植性和观赏性,同时也不会影响程序的性能。

2.配置文件

首先需要在项目(Project)的src目录下创建一个"jdbc.properties"的配置文件,在创建文件时要注意是在src目录下,否则会有错误。创建配置文件
配置文件内容为:

//用户名和密码
user=root
password=root
//数据库路径
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8
//数据库驱动
driverClass=com.mysql.cj.jdbc.Driver

配置文件的好处是:

  • 实现数据和代码分离,实现了解耦;
  • 如果需要修改配置文件信息,可以避免程序重新打包;
  • 数据库路径、用户名、密码或者驱动发生变更时,无需改动代码,直接修改配置文件,大大提高了生产效率;

出现的问题:
配置数据库路径开始设置url为:

String url = "jdbc:mysql://localhost:3306/test";

运行后出现java.sql.SQLException异常, 并显示 The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
通过查看资料,将url修改为:

String url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8

解决了问题,在连接字符串后面加上?useUnicode=true& characterEncoding =UTF-8目的是为了解决中文乱码输入问题;加上userSSL=false是为了符合不使用SSL的现有应用程序,通过设置userSSL=false显示禁用SSL;serverTimezone=GMT%2B8作用是统一标准世界时间。

3.创建JDBCUtils类

里面包含了获取数据库的连接、加载驱动方法和释放资源方法
获取数据库的连接、加载驱动方法:

public static Connection getConnection() throws Exception {/*** 获取数据库的连接*///1.读取配置文件的4个基本信息InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");Properties pros = new Properties();pros.load(is);String user = pros.getProperty("user");String password = pros.getProperty("password");String url = pros.getProperty("url");String driverClass = pros.getProperty("driverClass");//2.加载驱动Class.forName(driverClass);//3.获取连接Connection con = DriverManager.getConnection(url,user,password);System.out.println(con);return con;}

说明:

  • 首先通过InputStream读取配置文件的4个基本信息,利用ClassLoader调用getSystemClassLoader()方法实际上相当ConnectionTest.class.getClassLoader()的作用,但使用前者的好处是避免了出现第三方API;
  • 定义4个String类型的字符串接收获取到的基本信息;
  • 此处省略了注册驱动操作,是因为在mysql的Driver实现类中,声明如下操作,故在实际的代码编写中不需要在重新进行注册驱动。
static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}
}

非查询类释放资源方法:

/*** 关闭连接和Statement* @param con* @param ps*/public static void closeResource(Connection con,Statement ps) {//资源关闭try {if(ps != null)ps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if(con != null)con.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

说明: 非查询类释放资源过程中只需要关闭连接Connection和Statement,通过判断Statement的对象ps和Connection的对象con是否非空即可执行资源关闭。
查询类释放资源方法:

/*** 关闭连接、Statement和ResultSet* @param con* @param ps*/public static void closeResource(Connection con,Statement ps,ResultSet rs) {//资源关闭try {if(ps != null)ps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if(con != null)con.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if(rs != null)rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

说明: 查询类释放资源过程中不仅仅要关闭连接Connection和Statement,还需要关闭查询过程中得到的结果集ResultSet。

4.实现对数据表的增删改查

(1)向student表中插入一条数据
说明: 预期目的是为了将(“郑**”,“304728796@qq.com”,“2000-01-01”)数据插入到数据库中,运行后结果如图所示。

@Test//向student表中插入一条数据public void testInsert(){Connection con = null;PreparedStatement ps = null;try {//1.读取配置文件的4个基本信息InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties pros = new Properties();pros.load(is);String user = pros.getProperty("user");String password = pros.getProperty("password");String url = pros.getProperty("url");String driverClass = pros.getProperty("driverClass");//2.加载驱动Class.forName(driverClass);//3.获取连接con = DriverManager.getConnection(url,user,password);System.out.println(con);//4.预编译SQL语句,返回PreparedStatement的实例String sql = "insert into student(name,email,birth)values(?,?,?)";//?:占位符ps = con.prepareStatement(sql);//5.填充占位符ps.setString(1, "郑**");ps.setString(2, "304728796@qq.com");SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");java.util.Date date = sdf.parse("2000-01-01");ps.setDate(3,new Date(date.getTime()));//6.执行SQLps.execute();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {//7.资源关闭try {if(ps != null)ps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if(con != null)con.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

插入之前数据库中原始数据为:
在这里插入图片描述
在插入之后数据库中数据为:
在这里插入图片描述
(2)修改student表中的数据
**说明:利用ps.setObject(1, “小华”);ps.setObject(2, 3); 预期目的是为了修改行号为3,列号为2的数据,由"郑"修改为"小华",运行后结果如图所示。

//修改student表的一条记录@Testpublic void testUpdate() {//1.获取数据库连接Connection con = null;PreparedStatement ps = null;try {con = JDBCUtils.getConnection();//2.预编译SQL语句,返回PraparedStatement的实例String sql = "update student set name =? where id = ?";ps = con.prepareStatement(sql);//3.填充占位符ps.setObject(1, "小华");ps.setObject(2, 3);//4.执行SQLps.execute();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {//5.资源的关闭JDBCUtils.closeResource(con,ps);}}

修改之前数据库中原始数据为:
在这里插入图片描述
在修改之后数据库中数据为:
在这里插入图片描述
(3)通用的增删改操作数据库

说明:

  • 该方法不仅仅适用于该表,其他表也适用;
  • 该方法根据testCommonUpdate方法中sql语句的改变而进行不同的操作;可实现增(insert)、删(delete)、改(update)操作;
  • update方法中的args为可变参数,sql中的占位符的个数与可变形参长度相同;
  • 利用update(sql,2)方法,预期目的是删除行号为2的数据,运行后结果如图所示。
@Testpublic void testCommonUpdate() {String sql = "delete from student where id = ?";update(sql,2);}//通用的增删改操作public void update(String sql,Object ...args){//sql中占位符的个数与可变形参长度相同Connection con = null;PreparedStatement ps = null;try {//1.获取数据库连接con = JDBCUtils.getConnection();//2.预编译SQL语句,返回PraparedStatement的实例ps = con.prepareStatement(sql);//3.填充占位符for(int i=0;i<args.length;i++) {ps.setObject(i+1, args[i]);//参数声明:列号从1开始}//4.执行SQLps.execute();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {//5.资源的关闭JDBCUtils.closeResource(con,ps);}}

删除之前数据库中原始数据为:
在这里插入图片描述
删除之后数据库中数据为:
在这里插入图片描述
(4)查询数据库中的数据

package com.javaweb3.preparedstatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import com.javaweb4.util.JDBCUtils;
/*** 针对于student表的查询* @author 敷衍zgf**/
public class StudentForQuery {@Testpublic void testQuery1(){Connection con = null;PreparedStatement ps = null;//执行并返回结果集ResultSet resultSet = null;try {con = JDBCUtils.getConnection();String sql = "select id,name,email,birth from student where id = ?";ps = con.prepareStatement(sql);ps.setObject(1, 1);resultSet = ps.executeQuery();//处理结果集if(resultSet.next()) {//判断结果集的下一条是否有数据,如果有数据返回true,并且指针下移;如果返回false,指针不会下移//获取当前字条数据的各个字段值int id = resultSet.getInt(1);String name = resultSet.getString(2);String email = resultSet.getString(3);Date birth = resultSet.getDate(4);/*处理结果集* 方式一:*/System.out.println("id = "+id+",name = "+name+",email = "+email+",birth = "+birth);//方式二:Object[] data = new Object[] {id,name,email,birth};for(int i=0;i<data.length;i++) {System.out.print(data[i]+" ");}}}catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {//关闭资源JDBCUtils.closeResource(con, ps, resultSet);}	}
}

数据库中的数据:
在这里插入图片描述
查询后得到的结果:
在这里插入图片描述

四、对以上代码的说明

以上对数据库数据的增删查操作全都是使用PreparedStatement实现的,PreparedStatement是从Statement扩展而来的。不使用Statement是因为它不仅需要拼写sql语句,更严重的是存在SQL注入的问题。PreparedStatement是预编译的,对于批量处理可以大大提高效率。

五、总结

以上就是本人对JDBC和DBUtils工具类的全部认识和简单的运用方法,如有不足之处欢迎大家批评指正!


http://chatgpt.dhexx.cn/article/uw755xDl.shtml

相关文章

如何用计算机解kkt条件,【直观详解】拉格朗日乘法和KKT条件

【阅读时间】8min - 10mun 【内容简介】直观的解读了什么是拉格朗日乘子法,以及如何求解拉格朗日方程,并且给出几个直观的例子,针对不等式约束解读了KKT条件的必要条件和充分条件 What & Why 拉格朗日乘法(Lagrange multiplier)是一种在最优化的问题中寻找多元函数在其变…

SVM中的KKT条件和拉格朗日对偶

首先&#xff0c;我们要理解KKT条件是用来干嘛的&#xff1f; KKT条件用来判断一个解是否属于一个非线性优化问题。 求最优解&#xff1a; 约束条件分为 1、等式约束 2、不等式约束 对于等式约束的优化问题&#xff0c;可以直接应用拉格朗日乘子法去求取最优值&#xff1b; …

KKT条件详解

KKT条件详解 主要参考这篇文章和这个知乎回答。 KKT最优化条件是Karush[1939]&#xff0c;以及Kuhn和Tucker[1951]先后独立发表出來的。这组最优化条件在Kuhn和Tucker发表之后才逐渐受到重视&#xff0c;因此许多情况下只记载成库恩塔克条件&#xff08;Kuhn-Tucker conditions…

KKT条件总结

最近学习的时候用到了最优化理论&#xff0c;但是我没有多少这方面的理论基础。于是翻了很多大神的博客把容易理解的内容记载到这篇博客中。因此这是篇汇总博客&#xff0c;不算是全部原创&#xff0c;但是基础理论&#xff0c;应该也都差不多吧。因才疏学浅&#xff0c;有纰漏…

KKT条件

无约束优化 首先给出一些基本概念定义&#xff1a; 凸集&#xff1a; 欧式空间中&#xff0c;集合中任意两点的连线都在集合中&#xff0c;我们就说这个集合是凸集&#xff1b;凸函数&#xff1a; 对于任意属于[0,1]的a和任意属于凸集的两点x, y&#xff0c;有 f ( a x ( 1 …

KKT 直观理解

KKT最优化条件是Karush[1939]&#xff0c;以及Kuhn和Tucker[1951]先后独立发表出來的。这组最优化条件在Kuhn和Tucker发表之后才逐渐受到重视&#xff0c;因此许多情况下只记载成库恩塔克条件&#xff08;Kuhn-Tucker conditions) 库恩塔克条件(Kuhn-Tucker conditions)是非线性…

判断kkt条件的例题_kkt条件例题(kkt条件例题求解)

kkt条件例题(kkt条件例题求解) 2020-05-08 10:54:39 共10个回答 要看目标函数的斜率,不能单凭横坐标或纵坐标确定追问能举例说明吗回答一般线性规划的图像解法是通过平移一条直线,观察与可行域的焦点来求极值的这个还是线性规划里比较基础的问题.建议你找一本线性规划的书或者是…

kkt条件的理解_直观理解KKT条件

KKT最优化条件是Karush[1939],以及Kuhn和Tucker[1951]先后独立发表出來的。这组最优化条件在Kuhn和Tucker发表之后才逐渐受到重视,因此许多情况下只记载成库恩塔克条件(Kuhn-Tucker conditions) 库恩塔克条件(Kuhn-Tucker conditions)是非线性规划领域里最重要的理论成果之一…

对偶专题——KKT条件

[对偶专题——Duality and Dual problem (一) https://blog.csdn.net/jmh1996/article/details/85030323] 对于一般的带约束的优化问题&#xff1a; 介绍了如何通过构造原优化目标的一个下界函数 L ( x , λ , u ) L(x,\lambda,u) L(x,λ,u)&#xff0c;这一般通过添加一些线性…

java telnet端口_Java 实现 telnet命令 验证主机端口的连通性

Java 实现 telnet命令 验证主机端口的连通性 1、Telnet 命令 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在…

解决阿里云服务器telnet端口不成功的问题

问题还原 阿里服务器部署了一个API站点&#xff0c;端口为8079&#xff0c;本地电脑怎么telnet到这个端口都不成功 排查 防火墙 要么把防火墙全部关闭&#xff0c;或者配置入站出站规则&#xff0c;这里我是直接关闭服务器的防火墙 查看端口是否正常监听 确保系统内部必须…

能ping通,但是telnet端口连接失败

背景&#xff1a;在windows上创建了客户端&#xff0c;使用腾讯云的轻量服务器创建的Linux服务器。 问题&#xff1a;服务器操作系统防火墙已关闭&#xff0c;使用ping命令没问题&#xff0c;但是使用telnet测试端口的时候&#xff0c;连接失败。 解决&#xff1a;一开始添加了…

telnet端口不通怎么解决(单边不通的方法建议)

telnet端口不通是大家在检测端口的时候可能会遇到的问题之一&#xff0c;遇到这种状况一般要如何解决呢&#xff1f;这里为各位带来分享&#xff0c;看一下telnet端口不通的解决方式&#xff0c;看一下如何处理吧。 telnet端口不通怎么解决 1.开放供应商服务器端口 总是出现…

telnet服务器端口

telnet服务器端口 1.Windows 机器使用telnet命令1.2开启telnet功能1.2 使用telnet 1.Windows 机器使用telnet命令 1.2开启telnet功能 可以通过下面步骤进入程序和功能 然后找到启用或关闭Windows功能 然后勾选上Telnet客户端&#xff0c;代表功能开启。 1.2 使用telnet …

telnet命令及测试网络端口的几种方法

1、常见的用法&#xff1a; telnet IP port 如&#xff1a;telnet 192.168.1.10 80 端口&#xff0c;如果端口没有开启监听则会显示连接失败。 若端口有开启监听&#xff0c;telnet端口是通的会显示一个白色的光标并闪烁&#xff0c;如下图&#xff1a; 2、Linux下其余几种测…

Telnet端口

出现“Telnet不是内部命令”的相关提示&#xff0c;说明Telnet客户端没有开启 一、开启Telnet客户端 1、打开控制面板&#xff0c;点击“程序” 2、选择“启用或关闭Widows功能” 3、我们可以看到“Telnet Client”没有勾选&#xff0c;即没有开启 4、勾选“Telnet Client”…

telnet用法 测试端口号

Telnet是进行远程登录的标准协议和主要方式它为用户提供了在本地计算机上完成远程主机工作的能力。可以用telnet命令来测试端口号是否正常打开还是关闭状态。 方法/步骤 点击计算机的开始菜单--》运行 &#xff0c;输入CMD命令&#xff0c;然后确定。打开cmd命令行。 输入tel…

Linux驱动——ALSA

Linux驱动——ALSA 小狼http://blog.csdn.net/xiaolangyangyang Control宏定义&#xff1a; SOC_SINGLE_VALUE SOC_SINGLE_VALUE_EXT SOC_SINGLE SOC_SINGLE_TLV SOC_DOUBLE SOC_DOUBLE_R SOC_DOUBLE_TLV SOC_DOUBLE_R_TLV SOC_DOUBLE_S8_TLV SOC_ENUM_DOUBLE SOC_ENUM_SINGL…