使用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.rhkb.cn/news/481417.html

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

相关文章

redis的应用----缓存

redis的应用----缓存 一、缓存的概念二、使用redis作为缓存2.1使用redis作为缓存的原因2.2缓存机制的访问步骤 三、缓存的更新策略3.1定期更新3.2实时更新3.3淘汰策略 四、缓存常见的问题4.1缓存预热(Cache preheating)4.2缓存穿透(Cache penetration)4.3缓存雪崩(Cache avalan…

【S500无人机】--地面端下载

之前国庆的时候导师批了无人机&#xff0c;我们几个也一起研究了几次&#xff0c;基本把无人机组装方面弄的差不多了&#xff0c;还差个相机搭载&#xff0c;今天我们讲无人机的调试 硬件配置如下 首先是地面端下载&#xff0c;大家可以选择下载&#xff1a; Mission Planne地…

C++设计模式(装饰模式)

一、介绍 1.动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c;由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b;并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的组合&#xff0…

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway)

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway) 一、服务网关 1.1 什么是网关 在微服务架构中&#xff0c;服务网关是一个至关重要的组件。它作为系统的入口&#xff0c;负责接收客户端的请求&#xff0c;并将这些请求路由到相应的后端服务…

MySQL底层概述—7.优化原则及慢查询

大纲 1.Explain概述 2.Explain详解 3.索引优化数据准备 4.索引优化原则详解 5.慢查询设置与测试 6.慢查询SQL优化思路 1.Explain概述 使用Explain关键字可以模拟查询优化器来执行SQL查询语句&#xff0c;从而知道MySQL是如何处理SQL语句的&#xff0c;从而分析出查询语句…

【前端】Vue3+Vite如何进行多环境配置呢

在项目或产品的迭代过程中需要分不同的环境&#xff0c;那么使用vitevue3开发时&#xff0c;该如何进行配置呢 1、添加配置文件 .env.xxx .env.xxx 需要与src在同一级目录下 例如&#xff1a; 开发环境&#xff1a; .env.development 开发环境&#xff1a; .env.test 生产环…

FreeSWITCH 简单图形化界面36 -使用mod_sms发送短消息

FreeSWITCH 简单图形化界面36 -使用mod_sms发送短消息 0、测试环境1、mod_sms模块安装2、编写聊天规则2.1 使用xml文件测试一下 2.2 使用脚本文件测试一下 0、测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密码&#xff1a;admin FreeSWITCH界面…

广域网技术

企业需要通过广域网将这些分散在不同地理位置的分支机构连接起来 早期广域网技术概述 广域网&#xff1a;连接不同地区局域网的网络&#xff0c;能够横跨几个洲提供远距离通信&#xff0c;形成国际性的远程网络 广域网设备角色介绍&#xff1a; CE&#xff1a;用户端连接服务…

[GKCTF 2021]签到

[GKCTF 2021]签到 wireshark跟踪http流&#xff0c;基本编解码&#xff0c;倒叙&#xff0c;栅栏密码 找到cat /f14g 把包里返回的字符串先hex解码&#xff0c;再base64解码&#xff0c;看到一个时间是倒叙&#xff0c;不含flag 继续往下面翻&#xff0c;可以看到cat%2Ff14g%7…

ROS VSCode调试方法

VSCode 调试 Ros文档 1.编译参数设置 cd catkin_ws catkin_make -DCMAKE_BUILD_TYPEDebug2.vscode 调试插件安装 可在扩展中安装(Ctrl Shift X): 1.ROS 2.C/C 3.C Intelliense 4.Msg Language Support 5.Txt Syntax 3.导入已有或者新建ROS工作空间 3.1 导入工作…

Socket编程(TCP/UDP详解)

前言&#xff1a;之前因为做项目和找实习没得空&#xff0c;计算机网络模块并没有写成博客&#xff0c;最近得闲了&#xff0c;把计算机网络模块博客补上。 目录 一&#xff0c;UDP编程 1&#xff09;创建套接字 2&#xff09;绑定端口号 3&#xff09;发送与接收数据 4&…

虚拟机VMware安装OpenWrt镜像

前提已经安装VMware Workstation Pro,我使用的是VM16 一.下载OpenWrt系统固件 固件有很多种&#xff0c;我选择下面这个链接的固件: Index of /releases/23.05.3/targets/x86/64/ 二.把固件转换成虚拟机能识别的格式 转换工具下载地址&#xff1a;https://www.starwindsoft…

【Canvas与雷达】点鼠标可暂停金边蓝屏雷达显示屏

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>点鼠标可暂停金边蓝屏雷达显示屏 Draft1</title><style typ…

计算机编码存储+char占用空间+final作用

内存中存储的是对应的编码&#xff0c;与对应的形状库一起能够在显示器显示出来对应的字符。 磁盘中存储的是文件信息。 内存中存储的是变量&#xff08;虽然也是在磁盘里&#xff0c;等到使用的时候再调入进来&#xff09;。 因为编码实质就是二进制串&#xff0c;所以也可以比…

vue3项目搭建-6-axios 基础配置

axios 基础配置 安装 axios npm install axios 创建 axios 实例&#xff0c;配置基地址&#xff0c;配置拦截器,目录&#xff1a;utils/http.js 基地址&#xff1a;在每次访问时&#xff0c;自动作为相对路径的根 // axios 基础封装 import axios from "axios";…

2-2-18-9 QNX系统架构之文件系统(一)

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…

Python基于滑动窗口CNN损伤梁桥数据、故宫城墙图像数据分类可视化|数据分享

全文链接&#xff1a;https://tecdat.cn/?p38442 分析师&#xff1a;Yufei Guo 在现代土木结构工程领域&#xff0c;结构损伤的准确识别与定位对于保障基础设施的安全性和耐久性具有极为关键的意义。传统的人工检查方法&#xff0c;如目视检查以及借助专业设备进行检测&#x…

MyBatis的if标签的基本使用

在MyBatis框架中&#xff0c;if标签用于在构建SQL语句时&#xff0c;根据参数条件判断的结果&#xff0c;动态地选择加入或不加where条件中。 一 常见使用 在使用MyBatis处理查询逻辑的时候&#xff0c;常用的是判断一些参数是否为空&#xff0c;列举常用的几种情况展示 1.1…

RabbitMQ原理架构解析:消息传递的核心机制

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1、简单模式3.2、工作模式3.3、发布订阅3.4、路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1、单机部署5.2、集群部署&#xff08;镜像模式&#xff09;5.3、K8s部署…

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…