【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系列】- 扩展提升学习
扩展提升学习 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正࿰…...
阻塞和非阻塞,同步和异步
文章目录 典型的一次IO的两个阶段IO多路复用是同步还是异步? 典型的一次IO的两个阶段 数据就绪和数据读写 同步:需要应用程序自己操作 IO多路复用是同步还是异步? epoll也是同步的 具体数据读取还是通过应用程序自己完成的 只有使用了特…...
提速Rust编译器!
Nethercote是一位研究Rust编译器的软件工程师。最近,他正在探索如何提升Rust编译器的性能,在他的博客文章中介绍了Rust编译器是如何将代码分割成代码生成单元(CGU)的以及rustc的性能加速。 他解释了不同数量和大小的CGU之间的权衡…...
QT创建项目
可选择CMake或qmake...
基于vue3+webpack5+qiankun实现微前端
一 主应用改造(又称基座改造) 1 在主应用中安装qiankun(npm i qiankun -S) 2 在src下新建micro-app.js文件,用于存放所有子应用。 const microApps [// 当匹配到activeRule 的时候,请求获取entry资源,渲染到containe…...
华为OD真题--完美走位--带答案
2023华为OD统一考试(AB卷)题库清单-带答案(持续更新)or2023年华为OD真题机考题库大全-带答案(持续更新) 题目描述 输入一个长度为4的倍数的字符串Q,字符串中仅包含WASD四个字母。 将这个字符串中的连续子串…...
【AI】《动手学-深度学习-PyTorch版》笔记(十四):多层感知机
AI学习目录汇总 1、多层感知机网络结构 1.1 线性模型:softmax回归 在前面介绍过,使用softmax回归来处理分类问题时,每个输出通过都一个仿射函数计算,网络结构如下,输入和输出之间为全链接层: 1.2 多层感知机 多层感知机就是在输入和输出中间再添加一个或多个全链接…...
本地开发 npm 好用的http server、好用的web server、静态服务器
好用的web server总结 有时需要快速启动一个web 服务器(http服务器)来伺服静态网页,安装nginx又太繁琐,那么可以考虑使用npm serve、http-server、webpack-dev-server。 npm serve npm 的serve可以提供给http server功能&#…...
Gradio入门,并搭个鸡兔同笼问题小应用,附源码(MindOpt)
应用链接: https://979427749bc9ceec34.gradio.live 是公开访问链接,3天有效。 在modelscope中的创空间发布长期有效:https://modelscope.cn/studios/wuyoy520v01/MindOpt_Chicken-with-rabbit-cage/summary。 应用图如下,源代码见正文。 知…...
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、为什么要有消息队列?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复制,总是因为各种冲突,同步就阻塞掉了,一旦阻塞掉了,不主动发现,同步就终止了。还需要想办法手动去处理。所以考虑重新搭建集群。发现PXC方案不错,可以上两台,对服务器…...
项目知识点记录
1.使用druid连接池 使用properties配置文件: 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 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Databend 轻量级…...
ArcGISPro随机森林自动化调参分类预测模型展示
更改ArcGISPro的python环境变量请参考文章 ArcGISPro中如何使用机器学习脚本_Z_W_H_的博客-CSDN博客 脚本文件如下 点击运行 结果展示 负类预测概率 正类预测概率 二值化概率 文件夹(模型验证结果) 数据集数据库 ROC曲线 由于个人数据量太少所以…...
科技资讯|苹果手机版Vision Pro头显专利曝光,内嵌苹果手机使用
根据美国商标和专利局(USPTO)公示的清单,苹果公司近日获得了一项头显相关的技术专利,展示了一款亲民款 Vision Pro 头显,可以将 iPhone 放置在头显内部充当屏幕。 根据patentlyapple 媒体报道,这是苹果公司…...
Linux服务器映射到本地磁盘
内容来自网友博客。 把linux服务器上的文件夹映射到本地作为一个磁盘来访问,步骤如下 一. 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 是速度超快的内存数据存储,能够提供亚毫秒级延迟来支持 实时应用程序。适用于 Redis 的 ElastiCache 基于开源 Redis 构建,可与 Redis API 兼容,能够与 Redis 客户端配合工作,并使用开放的 Re…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
