使用JdbcTemplate 结合预编译预计批量插入数据

使用JdbcTemplate 结合预编译预计批量插入数

    • 1. 方法功能概述
    • 2. 代码详细分析
      • 2.1 预编译语句设置器(BatchPreparedStatementSetter)
      • 2.2 数据插入操作
    • 3. 整体总结

使用JdbcTemplate 结合预编译预计批量插入数据

1. 方法功能概述

它通过使用预编译语句(PreparedStatement)和 Spring 的 JdbcTemplate 来实现高效的数据插入操作。

2. 代码详细分析

2.1 预编译语句设置器(BatchPreparedStatementSetter)

  • 创建与目的:
在方法内部创建了一个匿名内部类实现 BatchPreparedStatementSetter 接口。
这个接口主要用于为批量插入操作中的预编译语句(PreparedStatement)设置参数值。
  • getBatchSize() 方法:
 功能:该方法用于返回此次要插入数据的批次大小。在这里,它通过获取传入的 batchMessArgs 列表的大小来确定批次大小,告诉数据库服务器本次批量操作涉及的数据量。@Override
public int getBatchSize() {return batchMessArgs.size();
}
  • setValues(PreparedStatement ps, int i) 方法:
功能:此方法用于为预编译语句 ps 设置具体的参数值。
对于每一条要插入的数据(由索引 i 确定在批次中的位置),它从 batchMessArgs 列表中获取对应的 LoginLog 对象,
并根据对象的各个属性依次设置预编译语句中的参数。

参数设置细节:

  • 对于字符串类型的属性(如 appId、operateType 等),使用 ps.setString() 方法设置参数。
  • 对于整数类型的属性(如 result、failCode 等),使用 ps.setInt() 方法设置参数。
  • 在设置 create_time 和 update_time 这两个时间戳相关的字段时,先获取当前上海(东八区)的时间(通过
    ZonedDateTime.now(ZoneId.of(“Asia/Shanghai”)) 获取 ZonedDateTime 类型的时间),然后将其转换为 Timestamp 类型(通过Timestamp.from(shanghaiTime.toInstant())),最后使用 ps.setTimestamp()方法分别设置这两个字段的值。

代码示例:

@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {LoginLog obj = batchMessArgs.get(i);ps.setString(1, obj.getAppId());ps.setString(2, obj.getOperateType());ps.setString(3, obj.getIdentification());ps.setInt(4, de.obj.getResult());ps.setInt(5, obj.getFailCode());ps.setString(6, obj.getOrgId());ps.setInt(7, obj.getAction());ps.setString(8, obj.getPasswordServicePlatformType());ps.setInt(9, obj.getLevel());ps.setString(10, obj.getSource());// 指定时区为上海(东八区)ZonedDateTime shanghaiTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));Timestamp timestamp = Timestamp.from(shanghaiTime.toInstant());ps.setTimestamp(11, timestamp);ps.setTimestamp(12, timestamp);
}

2.2 数据插入操作

  • SQL 语句定义:
功能:定义了要执行的插入数据的 SQL 语句模板,用于将 LoginLog 类型的数据插入到 login_log 表中。
语句中明确列出了要插入数据的各个字段以及对应的占位符 ?,以便后续通过预编译语句设置具体的值。
final String sql ="insert into login_log (app_id, operate_type, identification, result, fail_code,org_id,action,"+ "password_service_platformType, level, source, create_time, update_time) values"+ " (?,?,?,?,?,?,?,?,?,?,?,?)";
  • 执行批量插入:
    • 功能:使用 Spring 的 JdbcTemplate 的 batchUpdate() 方法来执行批量插入操作。它传入定义好的
      SQL 语句和前面创建的预编译语句设置器 messSetter,这样 JdbcTemplate
      就会根据设置器中的逻辑为每一条数据设置参数并执行插入操作。 异常处理:在执行过程中,如果出现异常,会通过日志记录下来(假设 log
      是已经正确配置的日志对象),以便后续排查问题。

    • 代码示例:

       // 数据入表try {final String sql ="insert into login_log (app_id, operate_type, identification, result, fail_code,org_id,action,"+ "password_service_platform_type, level, source, create_time, update_time) values"+ " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";jdbcTemplate.batchUpdate(sql, messSetter);} catch (Exception e) {log.error(">>>>>>> messageBatchInsert ", e);}

3. 整体总结

saveAll 方法通过合理利用预编译语句和 Spring 的 JdbcTemplate,高效且准确地实现了将一批 LoginLog 类型的数据批量插入到数据库表中的功能,同时还处理了时间戳相关的设置以及异常情况。这种批量插入的方式可以提高数据插入的效率,减少数据库服务器编译 SQL 语句的次数,从而提升整个应用程序与数据库交互的性能。

            private void saveAll(List<LoginLog> batchMessArgs) {// 预编译语句,节省数据库服务器编译 sql 语句的成本BatchPreparedStatementSetter messSetter = new BatchPreparedStatementSetter() {// 用来返回批次的大小@Overridepublic int getBatchSize() {return batchMessArgs.size();}// 用来为PreparedStatement设值。@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {LoginLog obj = batchMessArgs.get(i);ps.setString(1, obj.getAppId());ps.setString(2, obj.getOperateType());ps.setString(3, obj.getIdentification());ps.setInt(4, obj.getResult());ps.setInt(5, obj.getFailCode());ps.setString(6, obj.getOrgId());ps.setInt(7, obj.getAction());ps.setString(8, obj.getPasswordServicePlatformType());ps.setInt(9, obj.getLevel());ps.setString(10, obj.getSource());// 指定时区为上海(东八区)ZonedDateTime shanghaiTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));Timestamp timestamp = Timestamp.from(shanghaiTime.toInstant());ps.setTimestamp(11, timestamp);ps.setTimestamp(12, timestamp);}};// 数据入表try {final String sql ="insert into login_log (app_id, operate_type, identification, result, fail_code,org_id,action,"+ "password_service_platform_type, level, source, create_time, update_time) values"+ " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";jdbcTemplate.batchUpdate(sql, messSetter);} catch (Exception e) {log.error(">>>>>>> messageBatchInsert ", e);}}

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

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

相关文章

DepthAI 2.29版本 发布

2024年11月29日 增加在设备运行时使用新的 dai::Device.setCalibration() 更改设备校准能力的方法&#xff0c;并使用 dai::Device.getCalibration() 进行检索校准 1&#x1f343; 新的立体深度预设属性&#xff1a; 预设 面部 高细节 机器人 2&#x1f343; 多项摄像…

【C++习题】24.二分查找算法_0~n-1中缺失的数字

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 剑指 Offer 53 - II. 0&#xff5e;n-1中缺失的数字 题目描述&#xff1a; 解法 哈希表&#xff1a; 建立一个hash表看哪个数字出现次数为0 直接遍历找结果&#xff1…

jQuery学习建议:从入门到精通的指南

大家好&#xff0c;我是小黄。 引言 jQuery&#xff0c;这个轻量级的JavaScript库&#xff0c;以其简洁的语法和强大的功能&#xff0c;成为了前端开发者的首选工具之一。无论你是初学者还是有一定经验的开发者&#xff0c;学习jQuery都能极大地提升你的开发效率和网页交互性…

ESP32开发板在micropython里直接用requests向web服务器发送请求:ESP32S3开发板通过fastapi中转成功连接星河大模型

在micropython里用requests连web服务器 本来想在ESP32开发板里直接连百度星河大模型&#xff0c;但是一直有报错&#xff0c;没调通&#xff0c;于是转而用fastapi进行中转&#xff0c;也就是先用ESP32连fastapi的中转服务器&#xff0c;该中转服务器再去连百度星河大模型。 W…

Qt 面试题学习13_2024-12-1

Qt 面试题 1、 QString与基本数据类型如何转换?2、常用数据结构3、进程之间的道信方式有哪些? 1、 QString与基本数据类型如何转换? 1、将QString转换为基本数据类型通过QString的各种转换函数&#xff0c;可以将QString转换为int、float、double等基本数据类型。 QStri…

(即插即用模块-Convolution部分) 一、(ICLR 2022) ODConv 全维动态卷积

文章目录 1、Omni-dimensional Dynamic Convolution2、代码实现 paper&#xff1a;OMNI-DIMENSIONAL DYNAMIC CONVOLUTION Code&#xff1a;https://github.com/OSVAI/ODConv 1、Omni-dimensional Dynamic Convolution 论文首先分析了现有动态卷积的局限性&#xff0c;论文指出…

深度学习Python基础(2)

二 数据处理 一般来说PyTorch中深度学习训练的流程是这样的&#xff1a; 1. 创建Dateset 2. Dataset传递给DataLoader 3. DataLoader迭代产生训练数据提供给模型 对应的一般都会有这三部分代码 # 创建Dateset(可以自定义) dataset face_dataset # Dataset部分自定义过的…

[2024.11.25-12.1] 一周科技速报

2024 世界传感器大会在郑州开幕 时间&#xff1a;12月1日至2日。 会议内容&#xff1a;大会以 “感知世界 智创未来” 为主题&#xff0c;由 “一会两赛一峰会” 组成。开幕式上发布了 “郑州宣言”&#xff0c;倡导行业携手打造合作共赢的产业新生态&#xff0c;还首发了《2…

(超详细图文详情)Navicat 配置连接 Oracle

1、下载依赖文件 Oracle官网下载直链&#xff1a;https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 夸克网盘下载&#xff08;oracle19c版本&#xff09;&#xff1a;https://pan.quark.cn/s/5061e690debc 官网下载选择对应 Oracle 版…

jdk各个版本介绍

Java Development Kit&#xff08;JDK&#xff09;是Java平台的核心组件&#xff0c;它包含了Java编程语言、Java虚拟机&#xff08;JVM&#xff09;、Java类库以及用于编译、调试和运行Java应用程序的工具。 JDK 1.0-1.4&#xff08;经典时代&#xff09; • JDK 1.0&#xff…

基于 Python 的自动化框架示例

以下是一个基于Python的自动化测试代码框架示例&#xff0c;包含了 app_lib&#xff08;库模块&#xff0c;用于存放通用功能相关代码&#xff09;、app_test&#xff08;测试用例相关模块&#xff09;、config&#xff08;配置文件及配置读取相关部分&#xff09;等模块&#…

二分法篇——于上下边界的扭转压缩间,窥见正解辉映之光(1)

前言 二分法&#xff0c;这一看似简单却又充满哲理的算法&#xff0c;犹如一道精巧的数学之门&#xff0c;带领我们在问题的迷雾中找到清晰的道路。它的名字虽简单&#xff0c;却深藏着智慧的光辉。在科学的浩瀚星空中&#xff0c;二分法如一颗璀璨的星辰&#xff0c;指引着我们…

基于 FFmpeg/Scrcpy 框架构建的一款高性能的安卓设备投屏管理工具-供大家学习研究参考

支持的投屏方式有:USB,WIFIADB,OTG,投屏之前需要开启开发者选项里面的USB调试。 主要功能有: 1.支持单个或多个设备投屏。 2.支持键鼠操控。 3.支持文字输入。 4.支持共享剪切板(可复制粘贴电脑端文字到手机端,也可导出手机剪切板到电脑端)。 5.支持视频图片上传,可单…

【Go底层】time包Ticker定时器原理

目录 1、背景2、go版本3、源码解释【1】Ticker结构【2】NewTicker函数解释 4、代码示例5、总结 1、背景 说到定时器我们一般想到的库是cron&#xff0c;但是对于一些简单的定时任务场景&#xff0c;标准库time包下提供的定时器就足够我们使用&#xff0c;本篇文章我们就来研究…

Docker 部署Nginx 数据卷挂载 配置文件挂载

启动容器 docker run -d --name nginx \-v /etc/local/nginx/dist:/usr/share/nginx/html \-p 80:80 \--restart always \nginx宿主机站点 /etc/local/nginx/dist 容器内html /usr/share/nginx/html 复制配置文件到主机 docker cp nginx:/etc/nginx/nginx.conf /etc/local/n…

【论文笔记】A Token-level Contrastive Framework for Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: A Token-level Contrastiv…

ROS2教程 - 3 HelloWorld

更好的阅读体验&#xff1a;https://www.foooor.com 3 HelloWorld 下面从 HelloWorld 开始&#xff0c;讲解 ROS2 的开发。 ROS 开发主要使用 C 或 Python 实现&#xff0c;如果要实现的功能&#xff0c;对性能有要求&#xff0c;可以使用 C 实现&#xff0c;如果对性能没有…

洛谷 B3626 跳跃机器人 C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/B3626 题目描述 地上有一排格子&#xff0c;共 n 个位置。机器猫站在第一个格子上&#xff0c;需要取第 n 个格子里的东西。 机器猫当然不愿意自己跑过去&#xff0c;所以机器猫从口袋里掏出了一个机器人&#xff01;这…

【AI】Sklearn

长期更新&#xff0c;建议关注、收藏、点赞。 友情链接&#xff1a; AI中的数学_线代微积分概率论最优化 Python numpy_pandas_matplotlib_spicy 建议路线&#xff1a;机器学习->深度学习->强化学习 目录 预处理模型选择分类实例&#xff1a; 二分类比赛 网格搜索实例&…

⭐️ GitHub Star 数量前十的工作流项目

文章开始前&#xff0c;我们先做个小调查&#xff1a;在日常工作中&#xff0c;你会使用自动化工作流工具吗&#xff1f;&#x1f64b; 事实上&#xff0c;工作流工具已经变成了提升效率的关键。其实在此之前我们已经写过一篇博客&#xff0c;跟大家分享五个好用的工作流工具。…