当前位置: 首页 > news >正文

JDBC的 PreparedStatement 的用法和解释

文章目录

  • 前言
  • 1、封装数据库连接和关闭操作
    • 数据库配置文件 config.properties
  • 2、批量添加操作
  • 3、查询操作
  • 4、修改和删除操作
  • 总结

前言

  • PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程

1、封装数据库连接和关闭操作

package org.springblade.modules.data.util;import lombok.extern.slf4j.Slf4j;import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.*;/*** 数据库连接工具类*/
@Slf4j
public class JdbcOracleTemplatedct {private static String url;private static String username;private static String password;private static String driver;static {// 加载配置文件InputStream is = JdbcOracleTemplatedct.class.getClassLoader().getResourceAsStream("config.properties");Properties pro = new Properties();try {pro.load(is);url = pro.getProperty("jdbc3.url");username = pro.getProperty("jdbc3.username");password = pro.getProperty("jdbc3.password");driver = pro.getProperty("jdbc3.driverClassName");} catch (IOException e) {e.printStackTrace();log.info(e.getMessage(), e);log.info("加载配置文件失败!");}// 注册驱动try {Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();log.info(e.getMessage(), e);}}public static Connection getConnection() {Connection conn = null;try {conn = DriverManager.getConnection(url, username, password);// 把jdbc 链接 设置成 非自动提交conn.setAutoCommit(false);} catch (SQLException e) {e.printStackTrace();log.info(e.getMessage(), e);log.info("获得链接失败!");}return conn;}public static void closeAll(Statement stmt, Connection conn) {if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();// 关闭} catch (SQLException e) {e.printStackTrace();}}}public static void closeResAll(ResultSet rs, Statement stmt, Connection conn) {if (rs != null) {try {rs.close();// 关闭} catch (SQLException e) {e.printStackTrace();}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();// 关闭} catch (SQLException e) {e.printStackTrace();}}}public static boolean createTable(String sqltemplet) {Connection conn = getConnection();long starttime = System.currentTimeMillis();Statement statement = null;boolean isok = false;try {try {statement = conn.createStatement();} catch (SQLException e) {e.printStackTrace();log.info(e.getMessage(), e);log.info("执行批处理时    创建预状态通道失败!");}statement.executeUpdate(sqltemplet);isok = true;log.info(" 执行成功一次,总使用时间:"+ (System.currentTimeMillis() - starttime) + "ms");} catch (SQLException e) {e.printStackTrace();log.info(e.getMessage(), e);log.info("在 预 状 态 通 道 下 执 行 批 出 操 作 失 败!");} finally {closeAll(statement, conn);}return isok;}/*** 基于预状态通道执行批处理操作** @param sqltemplet* @param params* @return*/public static boolean batchData(String sqltemplet, List<List<Object>> params) {Connection conn = getConnection();long starttime = System.currentTimeMillis();PreparedStatement statement = null;boolean isok = false;try {try {statement = conn.prepareStatement(sqltemplet);} catch (SQLException e) {e.printStackTrace();log.info(e.getMessage(), e);log.info("执行批处理时    创建预状态通道失败!");}if (params != null && !params.isEmpty()) {for (List<Object> plist : params) {int size = plist.size();for (int i = 0; i < size; i++) {statement.setObject(i + 1, plist.get(i));}statement.addBatch();}statement.executeBatch();conn.commit();statement.clearParameters();isok = true;log.info(" 执行成功一次,总使用时间:"+ (System.currentTimeMillis() - starttime) + "ms");}} catch (SQLException e) {e.printStackTrace();log.info(e.getMessage(), e);log.info("在 预 状 态 通 道 下 执 行 批 出 操 作 失 败!");try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}} finally {closeAll(statement, conn);}return isok;}/*** 基于预状态通道执行批处理操作** @param sqltemplet* @param params* @return*/public synchronized  static boolean batchAllData(String sqltemplet,List<List<Object>> params) {try {Thread.sleep(500);} catch (InterruptedException e2) {e2.printStackTrace();}Connection conn = getConnection();long starttime = System.currentTimeMillis();PreparedStatement statement = null;boolean isok = false;try {try {statement = conn.prepareStatement(sqltemplet);} catch (SQLException e) {e.printStackTrace();log.info(e.getMessage(), e);log.info("执行批处理时    创建预状态通道失败!");}if (params != null && !params.isEmpty()) {int size2 = params.size();for (int j = 0; j < size2; j++) {List<Object> plist = params.get(j);int size = plist.size();for (int i = 0; i < size; i++) {statement.setObject(i + 1, plist.get(i));}statement.addBatch();if (j % 1000 == 0) {statement.executeBatch();conn.commit();statement.clearParameters();}}statement.executeBatch();conn.commit();statement.clearParameters();isok = true;log.info(" 执行成功一次,总使用时间:"+ (System.currentTimeMillis() - starttime) + "ms");}} catch (SQLException e) {e.printStackTrace();log.info(e.getMessage(), e);log.info("在 预 状 态 通 道 下 执 行 批 出 操 作 失 败!");try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}} finally {closeAll(statement, conn);}return isok;}public static List<Map<String, Object>> selectAll(String querysql) {List<Map<String, Object>> list = new ArrayList<>();long starttime = System.currentTimeMillis();Connection conn = getConnection();Statement statement = null;ResultSet rs = null;try {statement = conn.createStatement();rs = statement.executeQuery(querysql);ResultSetMetaData data = rs.getMetaData();int columnCount = data.getColumnCount();// System.out.println(columnCount);while (rs.next()) {int i = 1;Map<String, Object> map = new HashMap<String, Object>();while (i <= columnCount) {String name = data.getColumnName(i);// System.out.println(name + " : " + rs.getObject(i));if (rs.getObject(i) == null || "".equals(rs.getObject(i))) {map.put(name, "");} else {map.put(name, rs.getObject(i));}i++;}list.add(map);}log.info(" 执行成功一次,总使用时间:"+ (System.currentTimeMillis() - starttime) + "ms");} catch (SQLException e) {e.printStackTrace();log.info(e.getMessage(), e);} finally {closeResAll(rs, statement, conn);}return list;}public static void batchUpdate(String sql) {Connection conn = null;Statement ps = null;try {conn = getConnection();ps = conn.createStatement();int executeUpdate = ps.executeUpdate(sql);conn.commit();} catch (SQLException e) {e.printStackTrace();log.error(e.getMessage(), e);try {conn.rollback();} catch (SQLException e1) {log.error(e1.getMessage(), e1);}} finally {try {ps.close();} catch (SQLException e) {log.error(e.getMessage(), e);}try {conn.close();} catch (SQLException e) {log.error(e.getMessage(), e);}}}
}

数据库配置文件 config.properties

jdbc3.driverClassName = oracle.jdbc.OracleDriver
jdbc3.url = jdbc:oracle:thin:@172.0.0.1:1521:rdt1
jdbc3.username = root
jdbc3.password = root

2、批量添加操作

public static void main(String[] args) {Connection conn = JdbcOracleTemplatedct.getConnection();PreparedStatement statement = null;String insertSql = "INSERT INTO your_table (column1, column2) VALUES (?, ?)";try {statement = conn.prepareStatement(insertSql);// 假设我们要插入10条数据for (int i = 1; i <= 10; i++) {statement.setString(1, "Value" + i + "Column1");statement.setInt(2, i);statement.addBatch(); // 将SQL语句添加到批处理中}// 执行批处理int[] count = statement.executeBatch();System.out.println("插入了" + count.length + "条数据");} catch (SQLException e) {e.printStackTrace();log.error("添加执行失败", e);} finally {if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}}}

3、查询操作

  • 如果执行的是查询操作,使用executeQuery方法,并处理结果集。
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {// 处理结果集
}

4、修改和删除操作

int rowsAffected = statement.executeUpdate();

总结

  • 通过使用PreparedStatementexecuteBatch,你可以提高Java应用程序与数据库交互的性能。特别是当你需要执行大量的增删改操作时,批处理可以显著减少与数据库的交互次数,从而提高效率。同时,注意正确处理资源(如Connection、PreparedStatement、ResultSet)的打开和关闭,以及异常处理,以确保代码的健壮性。

如果此篇文章有帮助到您, 希望打大佬们能关注点赞收藏评论支持一波,非常感谢大家!
如果有不对的地方请指正!!!

相关文章:

JDBC的 PreparedStatement 的用法和解释

文章目录 前言1、封装数据库连接和关闭操作数据库配置文件 config.properties 2、批量添加操作3、查询操作4、修改和删除操作总结 前言 PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 1、封装数据库连接和关闭操作 package org.springblade.m…...

LeetCode 面试150

最近准备面试&#xff0c;我以前不愿意面对的 现在保持一颗本心&#xff0c;就是专注于算法思想&#xff0c;语言基础的磨炼&#xff1b; 不为速成&#xff0c;不急功近利的想要比赛&#xff0c;或者为了面试。 单纯的本心&#xff0c;体验算法带来的快乐&#xff0c;是一件非常…...

xmake+xrepo自建仓库添加交叉编译工具链

xmakexrepo自建仓库添加交叉编译工具链 最近想将交叉编译工具链放到xrepo自建仓库中&#xff0c;在xmake中引用&#xff0c;方便多个电脑快速实现交叉编译。 xmake官方文档感觉不够详细&#xff0c;折腾了好久&#xff0c;这里做个记录。 基本步骤如下&#xff1a; 添加自建…...

论文阅读》学习了解自己:一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023

《论文阅读》学习了解自己&#xff1a;一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023 前言 简介研究现状任务定义模型架构Learning to know myselfLearning to avoid Misidentification损失函数实验结果消融实验 前言 亲身阅读感受分享&#xff0c;细节画图解释…...

[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …...

MyBatis懒加载数据(大批量数据处理)

使用范例 Cursor约定使用Iterator去懒加载数据&#xff0c;以时间换空间&#xff0c;非常适合处理通常无法容纳在内存中的数百万个项目查询。如果在 resultMap 中使用集合&#xff0c;则必须使用 resultMap 的 id 列对游标 SQL 查询进行排序(resultOrdered“true”)。 //为了避…...

MySQL--联合索引应用细节应用规范

目录 一、索引覆盖 1.完全覆盖 2.部分覆盖 3.不覆盖索引-where条件不包含联合索引的最左则不覆盖 二、MySQL8.0在索引中的新特性 1.不可见索引 2.倒序索引 三、索引自优化--索引的索引 四、Change Buffer 五、优化器算法 1.查询优化器算法 2.设置算法 3.索引下推 …...

【spring boot+Lazy ORM+mysql】开发一个数据库管理系统实现对应数据库数据查看和修改

【spring bootLazy ORMmysql】开发一个数据库管理系统实现对应数据库数据查看和修改 演示项目地址&#xff1a;http://124.222.48.62:30193/wu-smart-acw-ui/index.html#/login &#xff08;admin/admin&#xff09; 功能 用户登录注册新增、编辑数实例新增、编辑数据库信息…...

知识分享:隔多久查询一次网贷大数据信用报告比较好?

随着互联网金融的快速发展&#xff0c;越来越多的人开始接触和使用网络贷款。而在这个过程中&#xff0c;网贷大数据信用报告成为了评估借款人信用状况的重要依据。那么&#xff0c;隔多久查询一次网贷大数据信用报告比较好呢?接下来随小易大数据平台小编去看看吧。 首先&…...

【Day8:JAVA字符串的学习】

目录 1、常用API2、String类2.1 String类的特点2.2 String类的常见构造方法2.3 String类的常见面试题&#xff1a;2.3.1 面试题一&#xff1a;2.3.2 面试题二&#xff1a;2.3.3 面试题三&#xff1a;2.3.4 面试题四&#xff1a; 2.4 String类字符串用于比较的方法2.5 String类字…...

jetcache缓存

1 介绍 是阿里的双极缓存&#xff0c;jvm-->redis-->数据库 文档&#xff1a;jetcache/docs/CN at master alibaba/jetcache GitHub 2 注意事项 使用的实体类一定实现序列化接口定时刷新注解&#xff0c;慎用 它会为每一个key创建一个定时器 &#xff1a;场景为&…...

SQLSyntaxErrorException: FUNCTION dbname.to_timestamp does not exist

由于MySQL数据库高版本&#xff08;如8.x&#xff09;中有to_timestamp(&#xff09;函数&#xff0c;低版本中&#xff08;如5.7.x&#xff09;没有这个函数&#xff0c;服务运行报错。 自己创建函数实现功能&#xff0c;创建语句如下&#xff1b; DELIMITER // CREATE FUN…...

Borel-Cantelli 引理

翻译自大佬 https://huarui1998.com/Notes/math/borel-cantelli.html 1. 集序列的 lim ⁡ inf ⁡ \lim\inf liminf 和 lim ⁡ sup ⁡ \lim\sup limsup 类似于定义实数序列 { a k } \{a_k\} {ak​} 的 lim ⁡ inf ⁡ \lim\inf liminf 和 lim ⁡ sup ⁡ \lim\sup limsup, …...

算法训练营第四十一天 | LeetCode 509 斐波那契数列、LeetCode 70 爬楼梯、LeetCode 746 使用最小花费爬楼梯

LeetCode 509 斐波那契数列 这题动规五部曲都定义得比较明确。首先是dp数组下标&#xff0c;题目中给定F(0) 0说明从0开始&#xff0c;dp[i]直接表示F(i)的值即可。递推公式也直接给出了&#xff0c;也给了开头两个作为递推基础的数值作为初始化依据。遍历顺序也指明是从前往…...

网络其他重要协议(DNS、ICMP、NAT)

1.DNS DNS是一整套从域名映射到IP的系统 1.1 DNS背景 TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序&#xff0c;但是IP地址不方便记忆&#xff0c;例如我们想访问百度就会在浏览器中输入baidu.com而不是百度的IP地址。于是人们发明了一种叫主机名的东西, 是…...

利用PyCSP3库(含大量全局约束)进行组合约束建模

文章目录 1. 什么是 PyCSP3 ?2. 安装方法(Windows)2.1 通过 Google_colab 直接运行2.2 通过 pip 进行安装3. 快速入门3.1 声明变量3.2 更新约束3.3 定义目标3.4 常用的全局约束1. 什么是 PyCSP3 ? PyCSP3 是 Python 中的一个库,用于对组合约束问题进行建模,包括 约束满足…...

解决updateByExample时属性值异常的问题(部分属性值没有使用占位符?进行占位,而是变成了属性的名称)

目录 场景简介代码片断实体类 报错信息排查原因解决测试过程解决方案 场景简介 1、程序将mybatis框架升级为3.5.9版本后执行updateByExample方法时报错 代码片断 Condition condition new Condition(MbCcsSessionConfig.class); condition.createCriteria().andEqualTo(&quo…...

[C++][algorithm][Eigen] 基于Eigen实现Softmax函数

1 简介 Softmax函数是机器学习和深度学习中一个非常重要的激活函数&#xff0c;它在多分类问题中尤其关键。Softmax函数能够将一个向量或一组实数转换成概率分布&#xff0c;使得每个元素的值都在0到1之间&#xff0c;并且所有元素的和为1。本博客文章《【Eigen】基于Eigen实现…...

一招教大家,如何移除受保护的excel工作表的编辑权限限制?

有时候&#xff0c;我们打开工作表发现只有部分单元格可以编辑&#xff0c;点击其他单元格都显示“您试图更改的单元格或图标受保护”&#xff0c;既没法正常编辑或下拉填充&#xff0c;也没有办法快捷筛选。这时候我们可以通过输入密码解除保护&#xff0c;就可以正常编辑了。…...

Python 全栈体系【四阶】(五十三)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 2. 文字检测技术 2.3 DB&#xff08;2020&#xff09; DB全称是Differentiable Binarization&#xff08;可微分二值化&#xff09;&#xff0c;是近年提出的利用图像分割方法进行文字检测的模型。前文所提…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...