JDBC高级——主键回显、批量插入、事务操作

news2024/10/6 20:29:59

自增主键回显

一般在插入数据时,设置主键为自增,然后我们就不用去维护这个主键值,其他的级联表可能以这个主键作为外键或参考,所以我们要拿到插入数据的主键值,这就是主键回显。
如何获取数据库自增的主键值?
在原生的JDBC中,实现主键回显非常简单。

  1. 创建PreparedStatement时,传入Statement.RETURN_GENERATED_KEYS这个常量,或直接传入“1”
PreparedStatement pstm = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
  1. 获取自增主键的结果集,这个结果集是一行一列,“id=值” 的形式
ResultSet rsKeys = pstm.getGeneratedKeys();  
if(rsKeys.next()){  
    System.out.println("自增长的主键是为"+rsKeys.getInt(1));  
    // 或
    System.out.println("自增长的主键值是"+ rsKeys.getString("GENERATED_KEY"));
}

批量插入

当利用原生的JDBC做批量插入时,性能非常低,看个模拟的例子

Class.forName("com.mysql.cj.jdbc.Driver");  
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=root");  
String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)";  
PreparedStatement pstm = conn.prepareStatement(sql);  
pstm.setObject(1, "zhangsan");  
pstm.setObject(2, "123321");  
pstm.setObject(3, "123@com");  
pstm.setObject(4, "2023-01-10");  
long start = System.currentTimeMillis();  
int i = 1000;  
while(i -- > 0){  
    // 模拟批量插入1000次  
    pstm.executeUpdate();  
}  
long end = System.currentTimeMillis();  
System.out.println("共耗时" + (end - start) + " 毫秒");


在学习MySQL时,在执行插入的SQL语句时,我们可以这样写,一次插入多个值

insert into user(name,password,email,birthday) values('zs','123','123','123'),('ls','222','222','333')

利用这个语法,JDBC封装了批量插入的方法,我们直接来使用即可。

  1. 在url后添加rewriteBatchedStatements=true,表示允许批量插入
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?rewriteBatchedStatements=true", "root", "root");
  1. 使用addBatch()方法追加值
// 此方法是将值追加到values后  
pstm.addBatch();
  1. 使用executeBatch()方法来执行批量插入

看一下这个批量插入的耗时

Class.forName("com.mysql.cj.jdbc.Driver");  
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?rewriteBatchedStatements=true", "root", "root");  
String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)";  
PreparedStatement pstm = conn.prepareStatement(sql);  
pstm.setObject(1, "zhangsan");  
pstm.setObject(2, "123321");  
pstm.setObject(3, "123@com");  
pstm.setObject(4, "2023-01-10");  
long start = System.currentTimeMillis();  
int i = 1000;  
while (i-- > 0) {  
    // 模拟批量插入1000次  
  
    // 此方法是将值追加到values后  
    pstm.addBatch();  
}  
pstm.executeBatch();  
  
long end = System.currentTimeMillis();  
System.out.println("共耗时" + (end - start) + " 毫秒");

注意

  • sql语句为insert into 表名 values (), sql语句的末尾不能加分号";",否则无法追加value
  • 执行时是调用的executeBatch()方法

事务操作

在原生的JDBC中,如何操作事务?
在原生的JDBC中,默认开启事务的自动提交,所以我们要是想自己管理事务,需要先关闭事务的自动提交。
一般按照这个结构执行事务

try{  
    // 关闭事务自动提交  
    conn.setAutoCommit(false);  
    
    // 执行数据库操作  
    
    // 提交事务  
    conn.commit();  
}catch (Exception e){  
    // 事务回滚  
    conn.rollback();  
}

注意:JDBC中,事务的基本要求:必须是同一个连接connection
所以一般在业务层进行事务操作,DAO层负责接收这个连接对象并执行数据库操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自己写一个简单的工作流引擎V2

上一篇文中我们实现了顺序的工作流,对于多分支的工作流如下,该如何实现呢? 小明提交了一个申请单,然后经过经理审批,如果通过,发邮件通知,不通过,则打回重新填写申请单,…

计算机体系结构 | 函数栈帧 | 栈帧的创建与销毁讲解 | 篡改函数的返回地址

文章目录前言预备知识demo及其汇编代码汇编代码讲解返回值篡改(111 ???)前言 复习时遇到一些问题,可能是关于左值右值的概念理解不够透彻,于是转头去研究左值右值的问题,但是想要参透左右值,我又觉得需…

通信网络概论

一、通信网络概述 通信网络是一些设备、设施组成的集合,可以提供特定的服务,即可以实现位于任意地点的不同用户间信息的传递。 通信网络的基本问题:如何以尽可能低的成本有效地解决处于任何地理位置的任意两个用户之间即时信息传递问题&…

基于java springmvc+mybatis学生考试系统设计和实现

基于java springmvcmybatis学生考试系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

公司选择之外包

前言 简单介绍下人们常说的外包是什么,应届生未出社会没有经验,避免求职过程中的一些坑。 文章目录前言一、什么是外包?1、简介1、项目外包2、人力外包二、外包公司有哪些?三、优缺点1、优点2、缺点四、选择一、什么是外包&#x…

FreeRTOS的Systick和HAL时基

目录 分析 举个例子: 正确的做法: 总结 我们首先需要知道,使用了FreeRTOS会强制使用systick作为自己的心跳,这个os_tick的优先级是最低的,它主要的作用就是OS任务调度,时间片查询等工作。 在图中&#x…

【未解决乌龟问题】测试ROS是否安装成功

前提说明:虚拟机、ubuntu-18.04.1 1、操作流程: 1)参考教程链接1,第一步输入roscore指令查看ROS的版本、节点、端号等内容时出现“Command roscore not found, but can be installed with: sudo apt install python-roslaunch”…

python-docx写入word

目录 字体大小参照 安装python-docx 引入依赖包 使用 标题设置字体、字号、居中、加粗、颜色 正文设置字体、字号、居中、加粗、颜色 添加图片 官方文档 字体大小参照 字号‘八号’对应磅值5 字号‘七号’对应磅值5.5 字号‘小六’对应磅值6.5 字号‘六号’对应磅值7.…

Java8-19新特性一览 ,认识全新的前沿技术

文章目录Java8-19新特性一览 ,认识全新的前沿技术前言你的收获Java发展趋势准备工作新特性1、接口private1)、说明2)、案例3)、注意2、类型推断1)、说明2)、案例3)、注意3、空指针优化1)、说明2…

【5】SCI易中期刊推荐——计算机科学(中科院2区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

阿里云k8s一键部署有状态StatefulSet nacos2.0.3

阿里云k8s一键部署有状态StatefulSet nacos2.0.3 项目目录 centos 配置连接集群 kubectl 客户端执行k8s脚本 kubectl 执行结果,一键生成StatefulSetpodServiceconfig Deployment pod重启ip和名称随机分配,适合java服务类部署 StatefulSet pod重启ip和名…

再学C语言31:函数——递归

C允许一个函数调用其自身,这种调用过程被称为递归(recursion) 使用递归的风险:如果程序中没有设定可以终止递归的条件检测,会无限制地执行递归调用 所以涉及递归的程序需要谨慎设计 递归一般可以替代循环语句使用&a…

Mozi僵尸网络(P2P僵尸网络Mozi)

Mozi僵尸网络概述 Mozi僵尸网络是于2019年底首次出现在针对路由器和DVR 的攻击场景上的一种P2P僵尸网络。主要攻击物联网(IoT)设备,包括网件、D-Link和华为等路由设备。它本质上是Mirai的变种,但也包含Gafgyt和IoT Reaper的部分代…

springboot mybatis mysql快速开始(详细入门操作)(二)

七、创建service类。要注意相应的注解service,autowired不能丢,不然系统识别不到这些组件。里面写对应的mapper方法。Service public class SplineService { private static final Logger log LoggerFactory.getLogger(SplineService.class); Autowired private Sp…

国产音频ADC芯片的应用以及选型

想要让模拟信号和数字信号顺利“交往”,就需要一座像“鹊桥”一样的中介,将两种不同的语言转变成统一的语言,消除无语言障碍。这座鹊桥就是转换器芯片,也就是ADC芯片。ADC芯片的全称是Analog-to-Digital Converter, 即模拟数字转换…

设计模式_创建型模式 -《单例模式》

设计模式_创建型模式 -《单例模式》 笔记整理自 黑马程序员Java设计模式详解, 23种Java设计模式(图解框架源码分析实战) 创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。 这样…

广州蓝景分享—Web前端开发培训机构如何选择

首先Web前端培训机构如何选择?相信很多人都不是很清楚,就是听别人推荐哪家好哪家不好,没有合理性的去实地了解,看看是否符合自己。所以,最好的方法就是自己在网上可以找一些判断web前端培训机构的条件,然后…

nacos原理和实战问题解决方案

nacos原理和集群搭建实战,在开始之前、我们先要知道nacos的官网并熟悉其基本特性 官网介绍 一、原理: 1、多种注册中心对比 2、nacos作为注册中心的核心功能 2.1、服务注册: Nacos Client会通过发送REST请求的方式向Nacos Server注册自己…

ArcGIS基础实验操作100例--实验82聚集点空间特征分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验82 聚集点空间特征分析 目录 一、实验背景 二、实验数据 三、实验步骤 (…

Leetcode.60 排列序列

题目链接 Leetcode.60 排列序列 题目描述 给出集合 [1,2,3,...,n],其所有元素共有 n!n!n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n3n 3n3 时, 所有排列如下: "123" "132" "213" …