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

【JDBC系列】- 扩展提升学习

扩展提升学习

😄生命不息,写作不止
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆 博客首页   @怒放吧德德  To记录领地
🌝分享学习心得,欢迎指正,大家一起学习成长!

在这里插入图片描述

文章目录

  • 扩展提升学习
    • 简介
    • 1、获取自增长主键回显
      • (1)、操作过程
      • (2)、代码
      • (3)、代码解析
    • 2、批量插入数据优化
      • 优化前
      • 优化后
    • 3、事务
      • 事务的概念
      • 在JDBC中操作事务

简介

上一两篇文章介绍了jdbc的使用过程以及statement与prepareStatement的用法和优缺点,这次就接着来学习一下扩展提升。

1、获取自增长主键回显

在新增数据的时候,如果主键标识是自增,往往会返回本次插入的自增标识。然而JDBC是支持将自增主键返回回来。

(1)、操作过程

其使用流程与之前的并没有什么不同,都是从 注册驱动、建立连接、编写SQL语句、创建preparedStatement对象、发送SQL语句、解析结果集、释放资源 具体流程如下图所示。
在这里插入图片描述

(2)、代码

/*** @Author: lyd* @Description: 获取自增主键的id回显* @Date: 2023/8/12*/
public class JDBCPSOtherPart {@SneakyThrowspublic static void main(String[] args) {// 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 创建连接Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cloud_user", "root", "12356");// 编写SQL语句String sql = "insert into tb_user(username,address) values(?,?);";// 创建preparedStatement// 这样并不会返回主键, 要想返回就需要携带另一个参数:Statement.RETURN_GENERATED_KEYSPreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);// 占位符赋值preparedStatement.setObject(1, "lkj");preparedStatement.setObject(2, "beijing");// 发送sql并获取结果集int i = preparedStatement.executeUpdate(); // 返回的是几行受影响// 获取存储主键结果集对象/只有主键ResultSet generatedKeys = preparedStatement.getGeneratedKeys();generatedKeys.next();System.out.println("操作成功" + i + "行受影响, 主键id为: " + generatedKeys.getLong(1));// 关闭资源generatedKeys.close();preparedStatement.close();connection.close();}
}

(3)、代码解析

在上面的示例中,基本的方式是相同的,也是使用executeUpdate()来插入数据,在创建预编译对象的时候,需要在放入sql语句携带另一个参数:Statement.RETURN_GENERATED_KEYS,这个参数告诉JDBC在执行插入语句后返回生成的主键。之后,就可以使用 getGeneratedKeys() 方法获取包含生成的主键值的 ResultSet 对象(这个对象只有一行一列,只是存放主键)。我们先将游标往下移一个位置,然后可以使用 getLong(1) 来获取第一列的自增主键值。

我们可以看一下这个方法,这里官方是有标注这通过Statement.RETURN_GENERATED_KEYS or Statement.NO_GENERATED_KEYS 来判断是否需要返回自增的键值,其返回是一个ResultSet对象。
在这里插入图片描述

2、批量插入数据优化

在现实开发中,肯定会需要需要插入万条以上的数据,在本次学习中,我们采用jdbc进行批量插入。在不优化的情况下,运行起来的时间是需要很久的,性能也会很拉跨。

优化前

在没有优化的时候,我们就是在预编译Statement对象中放入不同的值,并且每次去执行一下sql,这样的执行方式会导致执行时间比较长,性能也比较差,因为每次的插入就需要一次IO,IO次数越多越会导致性能的底下。

核心的代码如下

for (int i = 0; i < 10000; i++) {preparedStatement.setObject(1, "batch" + i);preparedStatement.setObject(2, "hangzhou");// 发送sql并获取结果集preparedStatement.executeUpdate();
}

我们看一下运行结果,当运行的时候就需要好久才能够结束,我们可以看到,在执行1万次插入需要执行18.64s。
在这里插入图片描述

优化后

优化前的执行方式就相当于是for循环去执行了1万次插入,在sql语句中,其实批量插入是可以追加的形式,每次数据用","隔开。

INSERT INTO table (column1, column2)
VALUES('value1_1', 'value2_1'),('value1_2', 'value2_2'),('value1_3', 'value2_3'),...;

在使用jdbc也是可以的,JDBC提供了相关方法:addBatch()进行追加和executeBatch()去执行SQL来批量插入,这样的效果就比上面的好,优化前需要执行1万次IO,而采用批量插入就只需要执行1次IO。

for (int i = 0; i < 10000; i++) {preparedStatement.setObject(1, "opt" + i);preparedStatement.setObject(2, "hunan");// 发送sql并获取结果集preparedStatement.addBatch(); // 不直接执行插入,追加到后面
}
preparedStatement.executeBatch(); // 批量操作

我们执行一下并且查看一下执行速度。

在这里插入图片描述

然而我们会发现,奇怪了,我已经使用了批量插入,但是执行的时间还是那么久,这到底是为什么呢?别慌,这是因为,在使用批量插入的时候,他是需要一定条件的,首先是我们需要在路径后面追加一个**?rewriteBatchedStatements=true** 代表允许这样的操作。并且还需要注意,在语句后面不能加”;“,否则拼接出来的sql会是错误的。

在这里插入图片描述

我们可以看到,这回执行1万条数据的时间就大大缩短了。从刚开始的18秒多降到1秒都不到。然而在此笔者需要说一下,在日常开发的时候,能尽量减少IO次数的就尽量减少,比如批量删除,也是可以用这样的形式操作。当然减少IO次数的做法是需要因地制宜的。

3、事务

事务的目的是确保数据库在执行过程中始终保持一致性和完整性,即使发生了系统故障或其他问题。

事务的概念

在数据库中,事务通常具有以下四个特性,通常被称为 ACID 特性:

  • 原子性(Atomicity): 事务被视为不可分割的最小工作单位,要么全部成功完成,要么全部失败回滚。即,事务的操作要么全部执行,要么一个都不执行。

  • 一致性(Consistency): 事务在执行前后,数据库从一个一致性状态转换到另一个一致性状态。这意味着事务执行后,数据库的完整性约束仍然得到保持。

  • 隔离性(Isolation): 事务之间是相互隔离的,一个事务的操作不应该对其他事务产生影响。即,每个事务都应该像它是系统中唯一的事务一样。

  • 持久性(Durability): 一旦事务提交成功,其所做的更改将永久保存在数据库中,即使发生系统故障也不会丢失。

事务的使用场景包括数据库中的插入、更新、删除操作,以及需要确保数据一致性的任何操作。通过使用事务,可以确保数据库在任何情况下都能保持数据的正确性和完整性,从而提高数据的可靠性。

在JDBC中操作事务

在jdbc中,我们可以简单的使用事务,首先需要关闭自动提交,在执行SQL后,手动进行提交事务,如果抛出异常就在异常处理进行回滚。

我们可以看一下, 主要的使用方式

try{connection.setAutoCommit(false); // 关闭自动提交事务// 增删修改的SQL执行connection.commit(); // 提交事务
} catch (Exception e) {connection.rollback(); // 回滚事务
} finally {// 关闭资源connection.close();
}

代码如下

/*** @Author: lyd* @Description: JDBC事务的使用* @Date: 2023/8/12*/
public class JDBCTransaction {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;try {// 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 创建连接connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cloud_user", "root", "12356");// 关闭自动连接connection.setAutoCommit(false);// 编写SQL语句String sql = "insert into tb_user(username,address) values(?,?);";// 创建preparedStatement// 这样并不会返回主键, 要想返回就需要携带另一个参数:Statement.RETURN_GENERATED_KEYSpreparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);// 占位符赋值preparedStatement.setObject(1, "ooo");preparedStatement.setObject(2, "beijing");if (true) {throw new RuntimeException("异常");}// 发送sql并获取结果集int i = preparedStatement.executeUpdate(); // 返回的是几行受影响// 获取存储主键结果集对象/只有主键ResultSet generatedKeys = preparedStatement.getGeneratedKeys();generatedKeys.next();System.out.println("操作成功" + i + "行受影响, 主键id为: " + generatedKeys.getLong(1));connection.commit(); // 提交事务} catch (Exception e) {// 事务回滚System.out.println("事务回滚");try {connection.rollback(); // 回滚事务} catch (SQLException ex) {throw new RuntimeException(ex);}} finally {// 关闭资源try {preparedStatement.close();connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}}
}

坚持学习,冲上顶峰!

相关文章:

【JDBC系列】- 扩展提升学习

扩展提升学习 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0…...

阻塞和非阻塞,同步和异步

文章目录 典型的一次IO的两个阶段IO多路复用是同步还是异步&#xff1f; 典型的一次IO的两个阶段 数据就绪和数据读写 同步&#xff1a;需要应用程序自己操作 IO多路复用是同步还是异步&#xff1f; epoll也是同步的 具体数据读取还是通过应用程序自己完成的 只有使用了特…...

提速Rust编译器!

Nethercote是一位研究Rust编译器的软件工程师。最近&#xff0c;他正在探索如何提升Rust编译器的性能&#xff0c;在他的博客文章中介绍了Rust编译器是如何将代码分割成代码生成单元&#xff08;CGU&#xff09;的以及rustc的性能加速。 他解释了不同数量和大小的CGU之间的权衡…...

QT创建项目

可选择CMake或qmake...

基于vue3+webpack5+qiankun实现微前端

一 主应用改造&#xff08;又称基座改造&#xff09; 1 在主应用中安装qiankun(npm i qiankun -S) 2 在src下新建micro-app.js文件&#xff0c;用于存放所有子应用。 const microApps [// 当匹配到activeRule 的时候&#xff0c;请求获取entry资源&#xff0c;渲染到containe…...

华为OD真题--完美走位--带答案

2023华为OD统一考试&#xff08;AB卷&#xff09;题库清单-带答案&#xff08;持续更新&#xff09;or2023年华为OD真题机考题库大全-带答案&#xff08;持续更新&#xff09; 题目描述 输入一个长度为4的倍数的字符串Q,字符串中仅包含WASD四个字母。 将这个字符串中的连续子串…...

【AI】《动手学-深度学习-PyTorch版》笔记(十四):多层感知机

AI学习目录汇总 1、多层感知机网络结构 1.1 线性模型:softmax回归 在前面介绍过,使用softmax回归来处理分类问题时,每个输出通过都一个仿射函数计算,网络结构如下,输入和输出之间为全链接层: 1.2 多层感知机 多层感知机就是在输入和输出中间再添加一个或多个全链接…...

本地开发 npm 好用的http server、好用的web server、静态服务器

好用的web server总结 有时需要快速启动一个web 服务器&#xff08;http服务器&#xff09;来伺服静态网页&#xff0c;安装nginx又太繁琐&#xff0c;那么可以考虑使用npm serve、http-server、webpack-dev-server。 npm serve npm 的serve可以提供给http server功能&#…...

Gradio入门,并搭个鸡兔同笼问题小应用,附源码(MindOpt)

应用链接&#xff1a; https://979427749bc9ceec34.gradio.live 是公开访问链接&#xff0c;3天有效。 在modelscope中的创空间发布长期有效:https://modelscope.cn/studios/wuyoy520v01/MindOpt_Chicken-with-rabbit-cage/summary。 应用图如下&#xff0c;源代码见正文。 知…...

redis核心知识点简略笔记

value数据类型 string 二进制安全 list 有序、可重复 set 无序、不重复 hash field-value的map sorted set 不重复、通过double类型score分数排序 场景 string 计数器缓存分布式锁访问频率控制分布式session hash 购物车等对象属性灵活修改 list 定时排行榜 set 收藏 sorte…...

消息中间件 —— 初识Kafka

文章目录 1、Kafka简介1.1、消息队列1.1.1、为什么要有消息队列&#xff1f;1.1.2、消息队列1.1.3、消息队列的分类1.1.4、p2p 和 发布订阅MQ的比较1.1.5、消息系统的使用场景1.1.6、常见的消息系统 1.2、Kafka简介1.2.1、简介1.2.2、设计目标1.2.3、kafka核心的概念 2、Kafka的…...

Ceph集群安装部署

Ceph集群安装部署 目录 Ceph集群安装部署 1、环境准备 1.1 环境简介1.2 配置hosts解析(所有节点)1.3 配置时间同步2、安装docker(所有节点)3、配置镜像 3.1 下载ceph镜像(所有节点执行)3.2 搭建制作本地仓库(ceph-01节点执行)3.3 配置私有仓库(所有节点执行)3.4 为 Docker 镜像…...

PXC基于docker搭建mysql集群全过程

之前用mysql自带的bin-log复制&#xff0c;总是因为各种冲突&#xff0c;同步就阻塞掉了&#xff0c;一旦阻塞掉了&#xff0c;不主动发现&#xff0c;同步就终止了。还需要想办法手动去处理。所以考虑重新搭建集群。发现PXC方案不错&#xff0c;可以上两台&#xff0c;对服务器…...

项目知识点记录

1.使用druid连接池 使用properties配置文件&#xff1a; driverClassName com.mysql.cj.jdbc.Driver url jdbc:mysql://localhost:3306/book?useSSLtrue&setUnicodetrue&charsetEncodingUTF-8&serverTimezoneGMT%2B8 username root password 123456 #初始化链接数…...

【HDFS】ListenableFuture在HDFS中的应用

本文主要介绍以下内容: ListenableFuture提供的功能和基本使用方法;AsyncLogger、IPCLoggerChannel(它是AsyncLogger的子类)QuorumCall类一、ListenableFuture的基本使用 ListenableFuture 是 Guava 库中提供的一个接口,它扩展了 JDK 中的 Future 接口,并添加了异步任务…...

Databend 开源周报第 105 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Databend 轻量级…...

ArcGISPro随机森林自动化调参分类预测模型展示

更改ArcGISPro的python环境变量请参考文章 ArcGISPro中如何使用机器学习脚本_Z_W_H_的博客-CSDN博客 脚本文件如下 点击运行 结果展示 负类预测概率 正类预测概率 二值化概率 文件夹&#xff08;模型验证结果&#xff09; 数据集数据库 ROC曲线 由于个人数据量太少所以…...

科技资讯|苹果手机版Vision Pro头显专利曝光,内嵌苹果手机使用

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果公司近日获得了一项头显相关的技术专利&#xff0c;展示了一款亲民款 Vision Pro 头显&#xff0c;可以将 iPhone 放置在头显内部充当屏幕。 根据patentlyapple 媒体报道&#xff0c;这是苹果公司…...

Linux服务器映射到本地磁盘

内容来自网友博客。 把linux服务器上的文件夹映射到本地作为一个磁盘来访问&#xff0c;步骤如下 一. samba的安装: sudo apt-get install samba // (sudo get temp root auth) sudo apt-get install smbfs //旧版本 sudo apt-get install cifs-utils //新版本 上…...

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

前言 Amazon ElastiCache for Redis 是速度超快的内存数据存储&#xff0c;能够提供亚毫秒级延迟来支持 实时应用程序。适用于 Redis 的 ElastiCache 基于开源 Redis 构建&#xff0c;可与 Redis API 兼容&#xff0c;能够与 Redis 客户端配合工作&#xff0c;并使用开放的 Re…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战

🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...

使用homeassistant 插件将tasmota 接入到米家

我写一个一个 将本地tasmoat的的设备同通过ha集成到小爱同学的功能&#xff0c;利用了巴法接入小爱的功能&#xff0c;将本地mqtt转发给巴法以实现小爱控制的功能&#xff0c;前提条件。1需要tasmota 设备&#xff0c; 2.在本地搭建了mqtt服务可&#xff0c; 3.搭建了ha 4.在h…...