SQL Server大批量数据插入
数据库连接及相关操作
public class DataBase {/*** 驱动*/private static final String DRIVER = PropertiesUtil.getString("spring.datasource.driver-class-name");/*** 数据库地址*/private static final String URL = PropertiesUtil.getString("spring.datasource.url");/*** 数据库用户名*/private static final String NAME = PropertiesUtil.getString("spring.datasource.username");/*** 数据库密码*/private static final String PASSWORD = PropertiesUtil.getString("spring.datasource.password");/*** 数据库连接,定义为全局变量,方便调用*/private Connection con;//导入驱动,静态代码块的作用为只运行一次,异常无法向上抛出,只能及时处理static {try {Class.forName(DRIVER);} catch (ClassNotFoundException e) {//打印异常相关信息e.printStackTrace();}}/*** 无参构造方法,连接数据库*/public DataBase() {try {con = DriverManager.getConnection(URL, NAME, PASSWORD);} catch (SQLException throwable) {throwable.printStackTrace();}}/*** 数据查找,返回查找的内容,向上抛异常** @param sql* @param object* @return* @throws SQLException*/public ResultSet executeSQL(String sql, Object... object) throws SQLException {PreparedStatement ps = con.prepareStatement(sql);for (int i = 0; i < object.length; i++) {//ps传入参数的下标是从1开始ps.setObject(i + 1, object[i]);}//返回结果集return ps.executeQuery();}/*** 关闭数据库连接** @throws SQLException*/public void close() throws SQLException {con.close();}/*** 设置 AutoCommit 模式为 false** @throws SQLException*/public void setAutoCommit(boolean flag) throws SQLException {// 设置 AutoCommit 模式con.setAutoCommit(flag);}/*** 事务提交** @throws SQLException*/public void commit() throws SQLException {// 手动提交事务con.commit();}/*** 事务回滚** @throws SQLException*/public void rollback() throws SQLException {con.rollback();}
}
批量插入数据
public class BulkCopyUtil {/*** 批量插入数据** @param tableName 表名* @param list 数据集合* @throws SQLException*/public static <T> void insertBatch(String tableName, List<T> list) throws Exception {// 查询出空值用于构建 CachedRowSetImpl 对象以省去列映射的步骤DataBase dataBase = new DataBase();// 从源表中获取数据作为 ResultSetResultSet resultSet = dataBase.executeSQL("select * from " + tableName + " where 1=0");CachedRowSetImpl crs = new CachedRowSetImpl();crs.populate(resultSet);ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();String[] dbFieldNames = new String[columnCount];for (int i = 1; i <= columnCount; i++) {dbFieldNames[i-1] = metaData.getColumnName(i);}// 循环批量插入for (T t : list) {if (ObjectUtil.isNotEmpty(t)) {// 移动指针到“插入行”,插入行是一个虚拟行crs.moveToInsertRow();// 向 CachedRowSet 对象插入一条数据populate(crs, t, dbFieldNames);// 插入虚拟行crs.insertRow();// 移动指针到当前行crs.moveToCurrentRow();}}// 进行批量插入bulkCopyHelp(dataBase, crs, tableName, list.size());}/*** 批量插入数据** @param dataBase 数据库连接相关操作* @param crs CachedRowSet* @param tableName 表名* @param size 拷贝列表大小*/public static void bulkCopyHelp(DataBase dataBase, CachedRowSetImpl crs, String tableName, int size) throwsSQLException {// 数据库地址String url = PropertiesUtil.getString("spring.datasource.url");// 数据库用户名String name = PropertiesUtil.getString("spring.datasource.username");// 数据库密码String password = PropertiesUtil.getString("spring.datasource.password");// 数据库连接字符串String urlStr = url + ";user=" + name + ";password=" + password;// 使用 KeepIdentity 选项和 BatchSize 设置大容量复制对象SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();copyOptions.setKeepIdentity(true);copyOptions.setBatchSize(size);// 开启数据库事务copyOptions.setUseInternalTransaction(true);// 设置超时时间copyOptions.setBulkCopyTimeout(60000);SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(urlStr);bulkCopy.setBulkCopyOptions(copyOptions);// 设置拷贝目标表名bulkCopy.setDestinationTableName(tableName);// 将 crs 写入目标try {// 设置 AutoCommit 模式为 falsedataBase.setAutoCommit(false);// 执行数据库操作bulkCopy.writeToServer(crs);// 手动提交事务dataBase.commit();} catch (SQLException e) {e.printStackTrace();// 回滚dataBase.rollback();}crs.close();bulkCopy.close();}/*** 这里主要是通过表的列名,通过反射,拿到待插入对象的属性值** @param crs* @param record* @param dbFieldNames* @param <T>* @throws Exception*/private static <T> void populate(CachedRowSetImpl crs, T record, String[] dbFieldNames) throws Exception {Class<?> clazz = record.getClass();for (String fieldName : dbFieldNames) {StringBuilder getMethodName = new StringBuilder("get");if (fieldName.contains("_")) {String[] singleWords = fieldName.split("_");for (String singleWord : singleWords) {getMethodName.append(upperFirstChar(singleWord));}} else {getMethodName.append(upperFirstChar(fieldName));}Method method = clazz.getMethod(getMethodName.toString(), null);Object value = method.invoke(record, null);updateCrs(crs, fieldName, value);}}/*** 根据数据值的类型,将值设置到rowset里--这里value是否为空,都要做crs.update操作,否则会出bug** @param crs* @param dbFieldName* @param value* @throws SQLException*/private static void updateCrs(CachedRowSetImpl crs, String dbFieldName, Object value) throws SQLException {if (value instanceof String) {crs.updateString(dbFieldName, (String) value);} else if (value instanceof Integer) {crs.updateInt(dbFieldName, (int) value);} else if (value instanceof Double) {crs.updateDouble(dbFieldName, (double) value);} else if (value instanceof Long) {crs.updateLong(dbFieldName, (long) value);} else if (value instanceof Float) {crs.updateFloat(dbFieldName, (float) value);} else if (value instanceof Timestamp) {crs.updateTimestamp(dbFieldName, (Timestamp) value);} else if (value instanceof java.util.Date) {crs.updateDate(dbFieldName, new java.sql.Date(((java.util.Date) value).getTime()));} else {crs.updateObject(dbFieldName, value);}}/*** 首字母大写* @param camelCaseStr* @return*/private static String upperFirstChar(String camelCaseStr) {return camelCaseStr.substring(0, 1).toUpperCase() + camelCaseStr.substring(1);}
}
备注(数据库连接取值)
# 配置数据源
spring:datasource:driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriverurl: jdbc:sqlserver://ip:port;DatabaseName=collectionusername: sapassword: 123456
相关文章:
SQL Server大批量数据插入
数据库连接及相关操作 public class DataBase {/*** 驱动*/private static final String DRIVER PropertiesUtil.getString("spring.datasource.driver-class-name");/*** 数据库地址*/private static final String URL PropertiesUtil.getString("spring.da…...
在 Ubuntu 下通过 Docker 部署 Caddy 服务器
嘿,伙伴们!今天我们来聊聊如何在 Ubuntu 系统下通过 Docker 部署 Caddy 服务器。Caddy 是一个现代的 Web 服务器,支持自动 HTTPS,简单易用,特别适合快速搭建网站。而 Docker 则是一个让你可以隔离和管理应用的神器。结…...

ZooKeeper注册中心实现
具体步骤 安装ZooKeeper(启动端口占用,2181:客户端,8080:管理端)引入客户端依赖实现注册中心接口SPI补充ZooKeeper注册中心 引入依赖 <!-- zookeeper --> <dependency><groupId>org.a…...
数仓建模:如何进行实体建模?
目录 1 如何进行实体建模? 业务建模 领域建模 逻辑建模 2 实体建模具体步骤 需求分析...

Python编程技术
设计目的 该项目框架Scrapy可以让我们平时所学的技术整合旨在帮助学习者提高Python编程技能并熟悉基本概念: 1. 学习基本概念:介绍Python的基本概念,如变量、数据类型、条件语句、循环等。 2. 掌握基本编程技巧:教授学生如何使…...
「Mac玩转仓颉内测版55」应用篇2 - 使用函数实现更复杂的计算
本篇教程基于仓颉编程语言扩展了计算器功能,支持加减乘除的基础运算,以及幂运算和开平方等高级功能。代码经过简化后,移除了对输入的复杂校验,提升了程序的可维护性和交互效率。 关键词 仓颉编程语言函数封装高级运算 一、功能说…...
map参数详解
const items new Array(15).fill(null).map((_, index) > ({key: index 1,label: nav ${index 1}, })); $.map() 函数用于使用指定函数处理数组中的每个元素(或对象的每个属性),并将处理结果封装为新的数组返回。 注意:1. 在jQuery 1.6 之前&#…...

OSI 七层模型 | TCP/IP 四层模型
注:本文为 “OSI 七层模型 | TCP/IP 四层模型” 相关文章合辑。 未整理去重。 OSI 参考模型(七层模型) BeretSEC 于 2020-04-02 15:54:37 发布 OSI 的概念 七层模型,亦称 OSI(Open System Interconnection…...
高转速风扇|无刷暴力风扇方案设计
在当今科技高速发展的时代,电子设备的性能不断提升,散热问题也日益成为关注的焦点。而 13w 高转速暴力风扇方案的出现,为解决各种设备的散热难题提供了强大的技术支持。 一、高转速暴力风扇的重要性 随着电子设备的不断升级,其功率…...

GPU 进阶笔记(三):华为 NPU/GPU 演进
大家读完觉得有意义记得关注和点赞!!! 1 术语 1.1 CPU1.2 GPU1.3 NPU / TPU1.4 小结2 华为 DaVinci 架构:一种方案覆盖所有算力场景 2.1 场景、算力需求和解决方案2.2 Ascend NPU 设计3 路线一:NPU 用在手机芯片&…...

计算机网络 (13)信道复用技术
前言 计算机网络中的信道复用技术是一种提高网络资源利用率的关键技术。它允许在一条物理信道上同时传输多个用户的信号,从而提高了信道的传输效率和带宽利用率。 一、信道复用技术的定义 信道复用(Multiplexing)就是在一条传输媒体上同时传输…...

数据库约束和查询
一 约束意义 这个后面的字段是什么意思呢? 先前说数据类型是一种约束,约束我们只能放该类型的数据,还有其它的约束来保证数据的合法性,下面的字段就和约束有关。 编译器的编译就是一个约束,保证我们的代码一定是语法合格的。我们…...
网工日记:FTP两种工作模式的区别
FTP 的主动模式和被动模式在连接建立的发起方、数据传输端口以及对网络环境的适应性等方面存在明显区别: 1. 连接发起方 主动模式:数据连接由服务器主动发起。在控制连接建立后,客户端通过 PORT 命令告知服务器自己用于接收数据的临时端口号…...

NLP模型工程化部署
文章目录 一、理论-微服务、测试与GPU1)微服务架构2)代码测试3)GPU使用 二、实践-封装微服务,编写测试用例和脚本,并观察GPU1)微服务封装(RestFul和RPC)2)测试编写(unit_test\api_test\load_tes…...

分布式版本管理工具——git 中忽略文件的版本跟踪(初级方法及高级方法)
git工具忽略指定文件的版本跟踪 一、简单方式实现二、复杂方式实现(模式匹配)1. 相关规则2. 应用案例a) 忽略所有内容b) 忽略所有目录(不忽略当前目录的具体文件)c)忽略指定目录下的所有文件,但排除某文件d)…...

【LangChain】Chapter4 - Question and Answer Over Documents
说在前面 文档问答,是常见的一类LLM应用,给定一段可能是从 PDF文件、网页或某公司内部文档库中提取的文本,使用LLM回答关于这些文档内容的问题。这样的应用非常的强大,它可以将LLM与完全没被训练的数据相结合,可以灵活…...
TCP/IP 协议演进中的瓶颈,权衡和突破
所有(去掉 “几乎” 修饰)问题都来自于生长速度的不一致,换句话说,膨胀不是均匀的,从而产生瓶颈甚至触碰极限,TCP/IP 从协议到实现面临的多方问题与动物体型不能无限大,摩天大楼不能无限高本质上一样。 如今被高性能网…...

软件测试面试八股文,查漏补缺(附文档)
大家好,最近有不少小伙伴在后台留言,准备面试了,又不知道从何下手!为了帮大家节约时间,特意准备了一份面试相关的资料,内容非常的全面,真的可以好好补一补,希望大家在都能拿到理想的…...

IDEA工具使用介绍、IDEA常用设置以及如何集成Git版本控制工具
文章目录 一、IDEA二、建立第一个 Java 程序三、IDEA 常用设置四、IDEA 集成版本控制工具(Git、GitHub)4.1 IDEA 拉 GitHub/Git 项目4.2 IDEA 上传 项目到 Git4.3 更新提交命令 一、IDEA 1、什么是IDEA? IDEA,全称为 IntelliJ ID…...
YOLOv10-1.1部分代码阅读笔记-transformer.py
transformer.py ultralytics\nn\modules\transformer.py 目录 transformer.py 1.所需的库和模块 2.class TransformerEncoderLayer(nn.Module): 3.class AIFI(TransformerEncoderLayer): 4.class TransformerLayer(nn.Module): 5.class TransformerBlock(nn.Module)…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...