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存储集群部署都从…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...