JDBC处理批量数据提高效率
文章目录
- 0 说明
- 1 如何使用jdbc操作数据库
- 1.1 加载数据库驱动
- 1.2 建立数据库连接
- 1.3 创建Statement或者PreparedStatement用来执行SQL
- 1.4 开始执行SQL语句
- 1.5 处理结果集
- 1.6 关闭连接
- 1.7 完整代码
- 2 批量操作数据库
- 3 如何打印SQL语句
- 4 jdbc常用开源类库
1 JDBC实现往MySQL插入百万级数据
2 详解JDBC(Java Database connect)
0 说明
JDBC(Java 数据库连接)是 Java 语言中用来连接和操作关系型数据库的 API。使用 JDBC,我们可以通过编写 Java 代码来访问各种数据库,包括 MySQL、Oracle、SQL Server 等。
JDBC 是基于 Java 的标准接口,它提供了一组接口和类,可以让 Java 应用程序与各个数据库进行交互。JDBC 的工作原理如下:
1.、加载数据库驱动程序
在使用 JDBC 前,需要先加载相应的数据库驱动程序,不同的数据库使用的驱动程序不同。通常情况下,我们需要将驱动程序的 jar 文件添加到项目的类路径中,并在代码中使用 Class.forName() 方法来加载驱动程序。
2、连接数据库
使用 DriverManager 类来连接数据库,该类提供了一组方法来获取数据库连接。连接字符串通常由以下三部分组成:协议、主机名和数据库名称。
3、执行 SQL 语句
连接成功后,就可以通过 Connection 对象创建 Statement 或 PreparedStatement 对象,用于执行 SQL 语句。Statement 支持静态 SQL 语句,而 PreparedStatement 支持动态 SQL 语句。执行 SQL 语句后,可以通过 ResultSet 对象获取查询结果。
4.、关闭连接
完成数据库操作后,必须关闭 Connection、Statement 和 ResultSet 对象,释放资源。
1 如何使用jdbc操作数据库
1.1 加载数据库驱动
在代码中使用 Class.forName() 方法加载数据库驱动程序。
Class.forName("com.mysql.cj.jdbc.Driver");
1.2 建立数据库连接
使用 DriverManager 类的 getConnection() 方法,传入连接字符串、用户名和密码等参数来获取数据库连接。
private String url = "jdbc:mysql://localhost:3306/school";
private String user = "root";
private String password = "root";Connection conn = DriverManager.getConnection(url, user, password);
1.3 创建Statement或者PreparedStatement用来执行SQL
使用 Connection 对象的 createStatement() 或 prepareStatement() 方法创建 Statement 或 PreparedStatement 对象,用于执行 SQL 语句。
String sql = "select * from user limit 1";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
1.4 开始执行SQL语句
使用 Statement 或 PreparedStatement 对象的 executeQuery() 或 executeUpdate() 方法执行 SQL 语句,返回 ResultSet 或更新的行数。
String sql = "select * from user limit 1";
ResultSet rs = preparedStatement .executeQuery(sql);
int count = preparedStatement .executeUpdate();
1.5 处理结果集
使用 ResultSet 对象的 getXXX() 方法获取查询结果,例如 getInt()、getString() 等方法。
while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");
}
1.6 关闭连接
使用 Connection、Statement 和 ResultSet 对象的 close() 方法关闭连接,释放资源。
rs.close();stmt.close();conn.close();
1.7 完整代码
@Testpublic void t10() {String url = "jdbc:mysql://localhost:3306/school";String user = "root";String password = "root";try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {log.error("error msg:【{}】", e);throw new IllegalArgumentException(e);}try {Connection conn = DriverManager.getConnection(url, user, password);String sql = "select * from user limit 10";PreparedStatement preparedStatement = conn.prepareStatement(sql);ResultSet resultSet = preparedStatement.executeQuery(sql);int id = 0;String userName = null, sex = null, address = null;java.sql.Date birthday = null;while (resultSet.next()) {id = resultSet.getInt(1);userName = resultSet.getString(2);birthday = resultSet.getDate(3);sex = resultSet.getString(4);address = resultSet.getString(5);log.info("结果集:id-【{}】,userName-【{}】,birthday-【{}】,sex-【{}】,address-【{}】", id, userName, birthday, sex, address);}conn.close();preparedStatement.close();resultSet.close();} catch (SQLException e) {log.error("error msg:【{}】", e);throw new IllegalArgumentException(e);}}

2 批量操作数据库
说明1:url拼接 rewriteBatchedStatements=true
说明2:事务关闭自动提交,手动提交事务
connection.setAutoCommit(false);connection.commit();
说明3:executeBatch();批量执行
String url = "jdbc:mysql://localhost:3306/school?rewriteBatchedStatements=true";String user = "root";String password = "root";private void jdbcSave(List<User> cachedList) {Connection connection = null;PreparedStatement preparedStatement = null;try {Class.forName("com.mysql.cj.jdbc.Driver");connection = DriverManager.getConnection(url, user, password);String sql = "insert into user(user_name,birthday,sex,address) values (?,?,?,?)";preparedStatement = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);connection.setAutoCommit(false);for (User item : cachedList) {preparedStatement.setString(1, item.getUserName());preparedStatement.setDate(2, new Date(item.getBirthday().getTime()));preparedStatement.setString(3, item.getSex());preparedStatement.setString(4, item.getAddress());preparedStatement.addBatch();}preparedStatement.executeBatch();connection.commit();} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {log.error("error msg:[{}]", e);throw new RuntimeException(e);}}if (connection != null) {try {connection.close();} catch (SQLException e) {log.error("error msg:[{}]", e);}}}}
3 如何打印SQL语句
/*** @param sql 原始SQL* @param parameterList 参数列表* @return 返回SQL* @description jdbc打印执行SQL*/private static String showFinalSql(String sql, List<Object> parameterList) {//1 如果没有参数,说明是不是动态SQL语句int paramCount = 0;if (CollectionUtils.isNotEmpty(parameterList)) {paramCount = parameterList.size();}if (paramCount < 1) {return sql;}//2 如果有参数,则是动态SQL语句StringBuilder returnSql = new StringBuilder();String[] subSql = sql.split("\\?");for (int i = 0; i < paramCount; i++) {Object item = parameterList.get(i);if (item instanceof Integer) {returnSql.append(subSql[i]).append(" ").append(item).append(" ");} else if (item instanceof Date) {String formatStr = DateFormatUtils.format((Date) (item), "yyyy-MM-dd HH:mm:ss");returnSql.append(subSql[i]).append("'").append(formatStr).append("'");} else {returnSql.append(subSql[i]).append("'").append(item).append("'");}}if (subSql.length > parameterList.size()) {returnSql.append(subSql[subSql.length - 1]);}return returnSql.toString();}
核心代码,打印日志使用slf4j
// 组装入参数据
List<Object> list = Arrays.asList(item.getUserName(), new java.sql.Date(item.getBirthday().getTime()), item.getSex(), item.getAddress());
// 调用自定义方法打印SQL
showFinalSql(sql,list);
private void jdbcSave(List<User> cachedList) {SqlSession sqlSession = sqlSessionFactory.openSession();Connection connection = sqlSession.getConnection();PreparedStatement preparedStatement = null;sqlSessionFactory.getConfiguration();try {Class.forName("com.mysql.cj.jdbc.Driver");String sql = "insert into user(user_name,birthday,sex,address) values (?,?,?,?)";preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);connection.setAutoCommit(false);for (User item : cachedList) {preparedStatement.setString(1, item.getUserName());preparedStatement.setDate(2, new java.sql.Date(item.getBirthday().getTime()));preparedStatement.setString(3, item.getSex());preparedStatement.setString(4, item.getAddress());preparedStatement.addBatch();List<Object> list = Arrays.asList(item.getUserName(), new java.sql.Date(item.getBirthday().getTime()), item.getSex(), item.getAddress());showFinalSql(sql,list);}preparedStatement.executeBatch();connection.commit();} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {log.error("error msg:[{}]", e);throw new RuntimeException(e);}}if (connection != null) {try {connection.close();} catch (SQLException e) {log.error("error msg:[{}]", e);}}}}

4 jdbc常用开源类库
https://www.cnblogs.com/fnz0/p/5858546.html
相关文章:
JDBC处理批量数据提高效率
文章目录 0 说明1 如何使用jdbc操作数据库1.1 加载数据库驱动1.2 建立数据库连接1.3 创建Statement或者PreparedStatement用来执行SQL1.4 开始执行SQL语句1.5 处理结果集1.6 关闭连接1.7 完整代码 2 批量操作数据库3 如何打印SQL语句4 jdbc常用开源类库 1 JDBC实现往MySQL插入百…...
使用css和js给按钮添加微交互的几种方式
使用css和js给按钮添加微交互的几种方式 在现实世界中,当我们轻弹或按下某些东西时,它们会发出咔嗒声,例如电灯开关。有些东西会亮起或发出蜂鸣声,这些响应都是“微交互”,让我们知道我们何时成功完成了某件事。在本文…...
react面试之context的value变化时,内部所有子组件是否变化
上测试代码 // context const state {a: 1,b: 1, } const context createContext(state);export default context; // A组件 const A () > {const { a } useContext(context);return (<div>{a}</div>) } export default A;// B组件 const B () > {cons…...
使用okHttp不走代理问题
背景 某日使用okhttp设置代理并发送爬虫请求时,发现部分url请求没有走代理直接和目标url建立了连接,伪代码如下。初始化okhttpClient时设置了proxySelecter代理,但是调用okhttpClient.newCall请求时并没用调用proxySelecter.select函数获取代…...
python moviepy 自动化音视频处理实践
MoviePy是一个用于视频编辑的Python库。它提供了一种简单且直观的方式来处理视频文件,包括剪辑、合并、裁剪、添加文本、添加音频等操作。使用MoviePy,你可以通过编写Python代码来创建和编辑视频,而无需使用复杂的视频编辑软件。 MoviePy建立…...
聊聊混合动力汽车和纯电骑车的优势和劣势
混合动力汽车和纯电动骑车是两种不同的交通工具,它们都有各自的优势和劣势。本文将分别探讨混合动力汽车和纯电动骑车的优势和劣势,并为文章提供三个备选的好听的标题。 混合动力汽车是一种结合了内燃机和电动机的汽车,它可以同时利用燃油和电…...
算法训练Day39|62.不同路径 ● 63. 不同路径 II
LeetCode:62.不同路径 62. 不同路径 - 力扣(LeetCode) 1.思路 想象成矩阵填格子,两个关键点,初始化和递推公式。 初始化除点(0,0)第一行第一列均为1,递推公式推导dp[i][j] dp[i …...
react中hooks分享
一. HOOKS是什么 在计算机程序设计中,钩子一词涵盖了一系列技术,这些技术用来通过拦截函数调用、消息或在软件组件之间传递的事件来改变或增加操作系统、应用程序或其他软件组件的行为。处理这些被截获的函数调用、事件或消息的代码称为“hook”。 在r…...
LeetCode1207. 独一无二的出现次数
题干 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 示例1: 输入:arr [1,2,2,1,1,3] 输出:true 解释:在该…...
【maven】构建项目前clean和不clean的区别
其实很简单,但是百度搜了一下,还是没人能简单说明白。 搬用之前做C项目时总结结论: 所以自己在IDE里一遍遍测试程序能否跑通的时候,不需要clean,因为反正还要改嘛。 但是这个项目测试好了,你要打成jar包给…...
Stable Diffusion 硬核生存指南:WebUI 中的 CodeFormer
本篇文章聊聊 Stable Diffusion WebUI 中的核心组件,强壮的人脸图像面部画面修复模型 CodeFormer 相关的事情。 写在前面 在 Stable Diffusion WebUI 项目中,源码 modules 目录中,有一个有趣的目录叫做 CodeFormer,它就是本文的…...
从零开始理解Linux中断架构(24)软中断核心函数__do_softirq
1)概要 __do_softirq函数处理是总是尽可能的执行所有未决软中断。 (1)关闭软中断:在preempt_count设置软中断标志:SOFTIRQ_OFFSET 让in_interrupt检查条件为真,进入软中断处理临界区,后面进来的处理请求,需要检查in_interrupt(),从而达到禁止本cpu上的软中断嵌套的目…...
【云原生】Kubernetes中deployment是什么?
目录 Deployments 更新 Deployment 回滚 Deployment 缩放 Deployment Deployment 状态 清理策略 金丝雀部署 编写 Deployment 规约 Deployments 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。 你负责描述 Deployment 中的 目标状态,而 De…...
sk_buff操作函数学习
一. 前言 内核提供了大量实用的操作sk_buff的函数,在开发网络设备驱动程序和修改网络协议栈代码时需要用到。这些函数从功能上可以分为三类:创建,释放和复制socket buffer;操作sk_buff结构中的参数和指针;管理socket b…...
conda create时候出现JSONDecoderError解决方法
起因是我的conda出现了JSONDecoderError,这个我搜了一下是因为某些配置文件错误,所以让我update conda,于是我先用了下面的指令: conda update conda 但是在执行过程中依然会出现 JSONDecoderError的问题,后来参考了这…...
Electron 工具进程utilityProcess 使用中遇到的坑点汇集
简介 这是基于 node.js 中的子进程的概念推出来的,可参考链接:utilityProcess | Electron 官网有一句话非常重要,它提供一个相当于 Node.js 的 child_process.fork API,但使用 Chromium 的 Services API 代替来执行子进程。这句话…...
JdbcTemplate
目录 1、简介 2、开发步骤 2.1、导入坐标 2.2、创建表和类 2.3、创建JdbcTemplate对象 2.4、执行数据库操作 3、解耦 4、增删改查 ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹…...
PROFINET转TCP/IP网关profinet网线接头接法
大家好,今天要和大家分享一款自主研发的通讯网关,捷米JM-PN-TCPIP。这款网关可是集多种功能于一身,PROFINET从站功能,让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗?一起来看看吧&…...
【FPGA IP系列】FIFO的通俗理解
FPGA厂商提供了丰富的IP核,基础性IP核都是可以直接免费调用的,比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识,帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out,即先进先出。 FIFO是一个数…...
Kylin v10基于cephadm工具离线部署ceph分布式存储
1. 环境: ceph:octopus OS:Kylin-Server-V10_U1-Release-Build02-20210824-GFB-x86_64、CentOS Linux release 7.9.2009 2. ceph和cephadm 2.1 ceph简介 Ceph可用于向云平台提供对象存储、块设备服务和文件系统。所有Ceph存储集群部署都从…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
