Java高级:数据库访问优化
系列文章目录
Java高级部分 JDBC编程
文章目录
- 系列文章目录
- 前言
- 一、编写属性文件:
- 二、编写DBUtil工具类:
- 三、使用DBUtil工具类:
- 总结
前言
通过我之前发的数据库连接,数据库连接https://blog.csdn.net/2301_81776550/article/details/147314012?spm=1001.2014.3001.5501能够发现问题:在访问数据库时,执行步骤都是相同的,不同的是每次执行的SQL语句。因此,为了简化数据库访问操作,减少代码冗余,提高效率,需要将访问数据库时通用的基本代码进行封装,即程序员自己编写一个数据库访问工具类DBUtils,用于提供访问数据库时所用到的连接,查询,更新和关闭等操作的基本方法,其他类通过调用DBUtils工具类来实现数据库的访问。所以下面我们来讲讲这个类是怎么写的。
提示:以下是本篇文章正文内容,下面案例可供参考
一、编写属性文件:
为了便于后期维护,在编写DBUtil工具类之前,通常将连接数据库的参数信息保存在属性文件中。
内容:
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/MY_STU?useSSL=false
user = root
pwd = 123456
而为了读取属性文件中的配置信息,需要编写一个Config配置类,在该类中通过java.util.properties类的get()方法来获取指定的“键”所对应的“值”。
内容:
package util;import java.io.FileInputStream;
import java.util.Properties;//配置类
public class Config {private static Properties p = null;static {try {p = new Properties();// 加载配置文件//p.load(new FileInputStream("config/oracle.properties"));p.load(new FileInputStream("config/mySql.properties"));} catch (Exception e) {e.printStackTrace();}}// 获取键对应的值public static String getValue(String key) {return p.get(key).toString();}
}
二、编写DBUtil工具类:
在上面的一些属性信息配置完毕后,下面我们就要开始编写此工具类了。
package DButils_;import util.Config;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DBUtil {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;/*** 得到数据库连接*/public Connection getConnection() throws ClassNotFoundException,SQLException, InstantiationException, IllegalAccessException {// 通过Config获取Oracle数据库配置信息String driver = Config.getValue("driver");String url = Config.getValue("url");String user = Config.getValue("user");String pwd = Config.getValue("pwd");try {// 指定驱动程序Class.forName(driver);// 建立数据库连结conn = DriverManager.getConnection(url, user, pwd);return conn;} catch (Exception e) {// 如果连接过程出现异常,抛出异常信息throw new SQLException("驱动错误或连接失败!");}}/*** 释放资源*/public void closeAll() {// 如果rs不空,关闭rsif (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}// 如果pstmt不空,关闭pstmtif (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}// 如果conn不空,关闭connif (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 执行SQL语句,可以进行查询Select SQL*/public ResultSet executeQuery(String preparedSql, Object[] param) {// 处理SQL,执行SQLtry {// 得到PreparedStatement对象pstmt = conn.prepareStatement(preparedSql);if (param != null) {for (int i = 0; i < param.length; i++) {// 为预编译sql设置参数pstmt.setObject(i + 1, param[i]);}}// 执行SQL语句rs = pstmt.executeQuery();} catch (SQLException e) {// 处理SQLException异常e.printStackTrace();}return rs;}/*** 执行SQL语句,可以进行增、删、改的操作SQL,不能执行查询*/public int executeUpdate(String preparedSql, Object[] param) {int num = 0;// 处理SQL,执行SQLtry {// 得到PreparedStatement对象pstmt = conn.prepareStatement(preparedSql);if (param != null) {for (int i = 0; i < param.length; i++) {// 为预编译sql设置参数pstmt.setObject(i + 1, param[i]);}}// 执行SQL语句num = pstmt.executeUpdate();} catch (SQLException e) {// 处理SQLException异常e.printStackTrace();}return num;}
}
三、使用DBUtil工具类:
下面代码使用DBUtil类对Userdetails表实现数据的增,删,改,查等操作。
import java.sql.ResultSet;import com.qst.chapter02.db.DBUtil;public class DBDemo {public static void main(String[] args) {String selectSql = "SELECT id,username,password,sex FROM userdetails";String insertSql = "INSERT INTO userdetails(id,username,password,sex) VALUES(?,?,?,?)";String updateSql = "UPDATE userdetails SET password=? WHERE username=?";String deleteSql = "DELETE FROM userdetails WHERE username=?";// 创建DBUtil对象DBUtil db = new DBUtil();try {// 连接数据库db.getConnection();// 查询并显示原来的数据ResultSet rs = db.executeQuery("SELECT id,username,password,sex FROM userdetails", null);System.out.println("---------原来的数据---------");while (rs.next()) {System.out.println("行 " + rs.getRow() + ":" + rs.getInt(1)+ "\t" + rs.getString(2) + "\t"+ rs.getString(3) + "\t"+ (rs.getInt(4) == 1 ? "男" : "女"));}System.out.println("-------------------------");// 执行添加int count = db.executeUpdate(insertSql, new String[] { "9", "Rose","123456", "0" });System.out.println("添加" + count + "行!");// 执行修改count = db.executeUpdate(updateSql, new String[] { "686868","Tom" });System.out.println("修改" + count + "行!");// 执行删除count = db.executeUpdate(deleteSql, new String[] { "lisi" });System.out.println("删除" + count + "行!");// 查询并显示更新后的数据rs = db.executeQuery(selectSql, null);System.out.println("---------更新后的数据---------");while (rs.next()) {System.out.println("行 " + rs.getRow() + ":" + rs.getInt(1)+ "\t" + rs.getString(2) + "\t"+ rs.getString(3) + "\t"+ (rs.getInt(4) == 1 ? "男" : "女"));}System.out.println("-------------------------");} catch (Exception e) {// 关闭连接db.closeAll();e.printStackTrace();}}}
总结
以上就是今天要讲的内容,本文就是简单的让大家认识一下这个我们自己编写的工具类,而且这个工具类也是用封装的思想,就是对于重复操作的我们可以将其封装起来,减少代码冗余,下面会持续更新的,谢谢大家。
相关文章:
Java高级:数据库访问优化
系列文章目录 Java高级部分 JDBC编程 文章目录 系列文章目录前言一、编写属性文件:二、编写DBUtil工具类:三、使用DBUtil工具类:总结 前言 通过我之前发的数据库连接,数据库连接https://blog.csdn.net/2301_81776550/article/det…...
升级xcode16之后react-native-zip-archive不兼容,unsupported option ‘-G‘
问题 升级xcode到16之后,xcode build报错:unsupported option -G for target x86_64-apple-ios13.4-simulator (in target RNZipArchive from project Pods) 出现原因 在 React Native 项目中,当你将 Xcode 升级到 16 后,可能会遇到 RNZipArchive 相关的编译错误,特别是…...
基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告
基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告 目录 基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习࿰…...
逻辑漏洞安全
逻辑漏洞是指由于程序逻辑不严导致一些逻辑分支处理错误造成的漏洞。 在实际开发中,因为开发者水平不一没有安全意识,而且业务发展迅速内部测试没有及时到位,所以常常会出现类似的漏洞。 由于开发者/设计者在开发过程中,由于代码…...
基于PaddleOCR对图片中的excel进行识别并转换成word优化(二)
0、原图 一、优化地方 计算行的时候,采用概率分布去统计差值概率比较大的即为所要的值。 def find_common_difference(array):"""判断数组中每个元素的差值是否相等,并返回该差值:param array: 二维数组,其中每个元素是一个…...
5.2.3 WPF 中 XAML 文件 Converter 使用介绍
Converter(转换器)在 WPF 数据绑定中扮演着重要角色,用于在源数据和目标属性之间进行值转换 举例来说:我想用一个bool量来控制一个背景,为true时,显示红色;为false时背景用默认颜色。因此 Backg…...
基于STM32_HAL库的HC-08蓝牙插座项目
基于STM32_HAL库的HC-08蓝牙插座 文章目录 基于STM32_HAL库的HC-08蓝牙插座一、项目需求二、硬件连接三、项目实现3.1 CubeMX配置3.2 以阻塞的方式实现3.3 以中断的方式实现 一、项目需求 通过手机可以控制开发板上的LED或者继电器 二、硬件连接 首先将HC-08蓝牙模块连接到我们…...
SwiftUI 3.Button介绍和使用
SwiftUI 的 Button 是用于触发用户操作的核心交互组件。以下是 Button 的详细介绍和使用示例: 一、基础用法 1. 创建简单按钮 Button("点击我") {print("按钮被点击了") }2. 自定义按钮内容 Button {// 点击动作 } label: {Text("保存&…...
Linux 管道理解
一、什么是管道 1.1 unix中最古老的进程间通信 1.2 一个进程链接到另一个进程的数据流称为“管道”: 图解: 二、管道通信的原理 2.1当我们创建一个进程然后打开一个文件的时候 会经过以下步骤: ①首先要描述这个进程,为这个…...
从并发问题衍生出的Spring的七种事务传播行为
最近在处理一个BPM流程时,遇到了并发问题,原因是事务粒度太大了,导致等待lock超时。今天刚好借此机会分享下Spring框架中提供的7种事务传播行为。 在 Spring中,Transactional 注解支持配置事务的传播行为,用于指定当一…...
第十五届蓝桥杯 2024 C/C++组 艺术与篮球
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: P10385 [蓝桥杯 2024 省 A] 艺术与篮球 - 洛谷 艺术…...
Python内置函数---bin()
用于将整数转换为二进制字符串 1. 基本语法与参数 bin(x) 参数: x 必须为整数( int 类型),或实现了 __index__() 方法的自定义对象(该方法需返回整数) 。 返回值:以 0b 开头的二进制字符串。…...
网络socks 代理
在系统/终端中设了这样的环境变量,而没有在代码中覆盖,HTTPX 就会启用该 socks 代理。 env | grep proxy https_proxyhttps://proxyhk.zte.com.cn:80 http_proxyhttp://proxyhk.zte.com.cn:80 no_proxylocalhost,127.0.0.0/8,::1,zte.com.cn,zte.intra,…...
【正则表达式】核心知识点全景解析
目录 一、基础语法架构二、核心元字符详解三、高级匹配技巧1. 字符集合2. 分组与引用3. 断言机制 四、Python re模块核心方法五、性能优化策略1. 编译重用2. 避免回溯陷阱3. 选择高效量词 六、典型应用场景1. 数据验证2. 数据提取3. 文本清洗 七、调试技巧宝典1. 可视化调试工具…...
深度学习--ResNet残差神经网络解析
文章目录 前言一、什么是ResNet网络二、传统卷积神经网络存在的问题1、梯度消失和梯度爆炸2、退化问题 三、如何解决问题四、残差结构五、18层残差网络1、解释2、隔层相加优点3、隔层相加数值增大问题 六、18层残差网络以外的表格示例七、BN层(Batch Normalization&…...
数据结构线性表的顺序存储结构
线性表是由零个或多个数据元素组成的有序序列。 特点: 数据元素间是有顺序的; 数据元素的个数是有限的; 一般来说,数据元素的类型是相同的(强类型语言)。c/c是强类型语言,必须指定数据类型。…...
深入解析C++ STL Queue:先进先出的数据结构
一、引言 在计算机科学中,队列(Queue)作为一种遵循先进先出(FIFO)原则的数据结构,是算法设计和系统开发的基础组件。C STL中的queue容器适配器以简洁的接口封装了底层容器的操作,为开发者提供…...
永磁同步电机控制算法-反馈线性化控制
一、原理介绍 基于非线性系统的精确线性化控制方法,采用精确反馈线性化原理对永磁同步电机进行输入-输出线性化,该方法通过坐标变换和状态反馈将系统的数学模型转变为两个线性子系统,在实现线性化的同时也对系统中电流和转速存在的耦合现象进…...
开源 RAG 引擎:文档理解精准、检索高效、可视化干预灵活,一站式搞定
引言: RAGFlow 是一款基于深度文档理解的开源 RAG 引擎,与 LLM 结合后可实现精准引用问答。它支持 20 多种文档格式解析,配备智能分块策略及混合检索方案,还有可视化干预界面,且支持 Docker 快速部署,堪称…...
URP-UGUI相关知识
一、UGUI的基本组成部分 Canvas (画布)所有UI都需要放在Canvas画布下面,不然无法显示EventSystem 所有的事件响应系统都需要依赖于EventSystem,若删除该组件,交互效果就 不会显示 1.Canvas(画…...
COMSOL多孔结构传热模拟
多孔结构传热模拟涉及对多孔介质内部复杂的热量传递过程进行建模和分析,这类模拟对于优化材料设计、提高能源效率以及解决环境问题等方面具有重要意义。本案例介绍在COMSOL内建立全连通多孔结构几何模型,并将孔隙及基体划分两相材料,进行多孔…...
【CSS】层叠,优先级与继承(四):层叠,优先级与继承的关系
层叠,优先级与继承的关系 前文概括 【CSS】层叠,优先级与继承(一):超详细层叠知识点 【CSS】层叠、优先级与继承(二):超详细优先级知识点 【CSS】层叠,优先级与继承&am…...
CDN加速http请求
一、CDN加速定义 CDN(Content Delivery Network,内容分发网络)是通过全球分布式节点服务器缓存网站内容,使用户就近获取数据的技术。其核心目标是缩短用户与内容之间的物理距离,解决网络拥塞、带宽不足等问题ÿ…...
python实战项目63:获取腾讯招聘信息内容并进行统计分析
python实战项目63:获取腾讯招聘信息内容并进行统计分析 一、需求分析二、流程分析1、获取指定招聘工作类型的目标地址url。2、采集详情页信息。3、保存数据4、完整爬虫代码三、统计分析一、需求分析 本项目的需求是爬取腾讯社会招聘信息网中社会招聘的不同工作类别岗位数据,…...
FlinkUDF用户自定义函数深度剖析
Flink 作为一款强大的流批一体数据处理引擎,其灵活性和扩展性在很大程度上依赖于用户自定义函数(User-Defined Functions, UDF)。UDF 允许开发者根据业务需求扩展 Flink 的核心功能,实现复杂的数据转换、聚合或分析。本文将系统性…...
Python图形界面编程(一)
目录 一、相关的库 1、tkinter库 2、PyQt库 二、图形界面编程要点 三、tkinter控件 1、tkinter控件表 2、tkinter的常用控件 3、tkinter的扩展控件 四、tkinter布局 1、简单示例 2、默认情况下的grid规则 3、调整窗口和网格 (1)调整窗口 &…...
HarmonyOS Grid 网格列表可长按 item 拖动移动位置
方案一 @Component struct WorkCircleCreatePage {// 存储车控列表的数组@State VehicleDoorArr: IVehicleDoor[] = []// 当前移动的Item索引@State CurrentIndex: number = -1// 拖动时显示的数据@State MoveItem: IVehicleDoor = { title: , icon: }// 拖动时放大倍数@State…...
出现 ORA-00904: “TENANT_ID“: 标识符无效 解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码的时候,出现如下所示: org.springframework.jdbc.BadSqlGrammarException:</...
榜单持久化
榜单持久化的基本流程是这样的: 创建表 持久化Redis数据到数据库 清理Redis数据 现在,创建表的动作已经完成,接下来就轮到Redis数据的持久化了。持久化的步骤如下: 读取Redis数据 判断数据是否存在 不存在,直接结束…...
璞华ChatBI闪耀2025数博会:对话式数据分析引领数智化转型新范式
4月17日至19日,2025中国(武汉)数字经济产业博览会在武汉盛大举办,璞华集团携自主研发的“ChatBI自然语言问答式数据分析平台”惊艳亮相。以 "通过对话让数据说话" 为主题,璞华集团在 A3-T8 展位构建了沉浸式…...
力扣DAY63-67 | 热100 | 二分:搜索插入位置、搜索二维矩阵、排序数组查找元素、搜索旋转排序数组、搜索最小值
前言 简单、中等 √ 二分法思路很简单,但是判断边界太麻烦了!难道真的要去背模板吗 搜索插入位置 我的题解 循环条件左不超过右,目标大于中间值(向下取整)时,左中1,小于,右中-1&…...
leetcode-哈希表
哈希表 127. 单词接龙 题目 字典 wordList 中从单词 beginWord 到 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s(1) -> s(2) -> ... -> s(k): 每一对相邻的单词只差一个字母。 对于 1 < i < k 时,每个 s(i) 都在…...
信息技术有限公司项目管理手册
这篇文档是信息技术有限公司的项目管理指导手册,对软件公司项目管理者具有重要价值,主要体现在以下几个方面: 管理全面规范 涵盖内容广:从项目的整体管理到各个具体领域,如范围管理、进度管理、成本管理等&…...
TFTP服务调试
在tftpboot目录下进行sudo minicom 启动内核时 问题:程序启动卡在Loading阶段 原因:tftp协议的问题 、或者网卡配置的问题 解决:1.检查网线是否插好 多试几次 2.检查tftp服务是否正常 在minicom中调试ping pc机的ip地址 2.进入boot调…...
date-picker组件的shortcuts为什么不能配置在vue的data的return中
在 Vue 中,shortcuts 是一个选项,通常用于配置像 date-picker 这样的组件的日期快捷方式。这里有一些原因解释为什么 shortcuts 不应该配置在 data 的 return 中,而是应该配置在 data 的外部(例如,直接作为组件的一个属…...
迭代器模式:统一数据遍历方式的设计模式
迭代器模式:统一数据遍历方式的设计模式 一、模式核心:将数据遍历逻辑与数据结构解耦 在软件开发中,不同的数据结构(如数组、链表、集合)有不同的遍历方式。如果客户端直接依赖这些数据结构的内部实现来遍历元素&…...
RocketMQ 核心架构速览
欢迎光临小站:致橡树 文章现有讲述比较简单,后续逐渐丰富各部分内容。 Apache RocketMQ 作为阿里巴巴开源的一款分布式消息中间件,凭借其高吞吐、低延迟、高可用等特性,成为金融级稳定性场景的首选解决方案。本文将深入剖析 Roc…...
kafka安装、spark安装
kafka简介 Kafka就是一个分布式的用于消息存储的消息队列。 kafka角色 Kafka中存储的消息,被消费后不会被删除,可以被重复消费,消息会保留多长,由kafka自己去配置。默认7天删除。背后的管理工作由zookeeper来管理。 kafka安装 …...
迅为RK3562开发板ARM四核A53核心板多种系统适配全开源
迅为RK3562开发板ARM四核A53核心板多种系统适配全开源 RK3562开发板(2GB内存16GB存储)...
用交换机连接两台电脑,电脑A读取/写电脑B的数据
1、第一步,打开控制面板中的网络和共享中心,如下图配置,电脑A和电脑B均要配置; 注意:要保证电脑A和电脑B在同一子网掩码下,不同的IP地址; 2、在电脑上同时按‘CommandR’,在弹出的输…...
线程入门3
synchronized修饰方法 synchronized可以修饰代码块(在线程入门2中有例子),也可以修饰普通方法和静态方法。 修饰普通方法 修饰普通方法简化写法: 修饰静态方法 修饰静态方法简化写法: 注意:利用synchronized上锁,锁的…...
【C++】AVL树
目录 一、AVL树的引入 二、AVL树 🍔AVL树的概念 🍟AVL树节点的定义 🌮AVL树的插入 🥪AVL树的旋转 三、AVL树的验证 四、结语 一、AVL树的引入 🌟我们知道 map/multimap/set/multiset 这几个容器的共同点是&#…...
Java大师成长计划之第1天:Java编程基础入门
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 欢迎来到“Java大师成长计划”系列文…...
Java线程中断机制详解
中断机制是Java中一种协作式的线程停止方式,它提供了一种优雅的线程间通信机制,用于请求另一个线程停止当前工作。 中断机制的核心概念 中断标志位(Interrupt Status) 每个线程都有一个boolean类型的中断状态标志(native方法控制)…...
gem5-gpu教程06 回归测试
gem5-gpu包括gem5风格的回归测试,以避免常见错误,并在变更集之间保持模拟系统性能的一致性。如果你想为gem5-gpu做出贡献,你必须确保你的更改通过了包含的回归测试。 回归测试是一种软件测试类型,其主要目的是确保新代码的更改没有对现有功能造成影响。在软件开发过程中,当…...
查询Hologres或postgresql中的数据
因Hologres使用postgresql的语法.所以两者查询一样. 方案1: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;/*** 一个使用简单连接池管理PostgreSQL连接的工具类。*/ publi…...
C# 文件读取
文件读取是指使用 C# 程序从计算机文件系统中获取文件内容的过程。将存储在磁盘上的文件内容加载到内存中,供程序处理。主要类型有:文本文件读取(如 .txt, .csv, .json, .xml);二进制文件读取(如 .jpg, .pn…...
On the Biology of a Large Language Model——Claude团队的模型理解文章【论文阅读笔记】其一CLT与LLM知识推理
这个学习笔记,是在精读Anthropic的博客 On the Biology of a Large Language Model 的过程中留下的笔记。 由于原文非常长,我会分2-3 个博客来写。 作者的思路 作者对常用的LLM特征解读工具 SAE/Transcoder 进行了优化,增加了跨层连接的能力…...
Postman忘记密码访问官网总是无响应
1.Header Editor插件下载 百度网盘下载: 链接:https://pan.baidu.com/s/1EV6cY7TYQVgPjip3v-vhfQ 提取码:yyds 2.插件配置 下载规则url:https://azurezeng.github.io/static/HE-GoogleRedirect.json 、U(向上)、L(向左)和 R(向右)组成的 48 字符描…...