Java-使用sqlSessionTemplate实现批量更新-模拟mybatis 动态sql

环境准备(非核心方法)

创建表

创建表的sql(下表是基于Oracle创建的)

CREATE TABLE "SYSTEM"."STUDENT" ("ID"       NUMBER(10, 0),"NAME"     VARCHAR2(20 BYTE),"ADDRES"   CLOB,PRIMARY KEY ( "ID" )USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICSSTORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOLDEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )TABLESPACE "SYSTEM"ENABLE
)
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGINGSTORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOLDEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
TABLESPACE "SYSTEM"LOB ( "ADDRES" ) STORE AS BASICFILE (TABLESPACE "SYSTEM"ENABLE STORAGE IN ROWCHUNK 8192RETENTIONNOCACHE LOGGINGSTORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOLDEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ));

表结构-具体使用什么数据库都行以自己的项目为准

image-20231014172102531

创建集成mybatis的springboot 项目(数据库是基于Oracle的)

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>mybatis-demo</name><description>测试mybaits</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- MyBatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- Oracle JDBC --><dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId><version>12.2.0.1</version></dependency></dependencies></project>

application

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=system
spring.datasource.password=oracle
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

制造假数据

代码

student表操作类

@Service
public class studentDaoTest {@Autowiredprivate SqlSessionTemplate sqlSessionTemplate;public void inster(){Connection connection = null;SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();SqlSession sqlSession = sqlSessionFactory.openSession();connection=sqlSession.getConnection();StringBuilder sql = new StringBuilder();sql.append("INSERT INTO student (id, name, addres) VALUES (?, ?, ?)");try (PreparedStatement statement = connection.prepareStatement(sql.toString())) {for (int i = 1; i <= 100; i++) {statement.setInt(1, i);statement.setString(2, "Name " + i);statement.setString(3, "Addres " + i);statement.addBatch();}statement.executeBatch();}catch (Exception e){System.out.println(e.getMessage());}}}

测试类

@SpringBootTest
class MybatisDemoApplicationTests {@Autowiredprivate studentDaoTest studentDaoTest;@Testvoid contextLoads() {studentDaoTest.inster();}}

结果

image-20231014173019081

批量更新sql拼接(核心方法)

更新方法

 public String testSQlAppendBatch(List<Map<String,Object>> prms){Connection connection = null;//具体的拼接参数(按顺序添加到此集合里)List<Object> params = new ArrayList<>();SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();SqlSession sqlSession = sqlSessionFactory.openSession();connection = sqlSession.getConnection();//获取拼接好的sqlString sql = sqlAppend(prms, params);try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {//设置预处理参数sqlAppendtemp(preparedStatement,params);//执行更新int i = preparedStatement.executeUpdate();System.out.println("jdbc更新成功"+i+"条数据");} catch (Exception e) {System.out.println(e.getMessage());} finally {if (connection != null) {try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}return "成功!";}

拼接sql

 // 拼接sqlprivate String sqlAppend(List<Map<String,Object>> temp,List<Object> par){//par 集合里保存-- 参数映射位置和内容(因为arraylist 是有序的),下面使用sqlAppendtemp 结合par 设置参数。String reslut="";StringBuilder sql = new StringBuilder();sql.append("UPDATE student SET ");sql.append("name = CASE ");for (Map<String, Object> stringObjectMap : temp) {if (null!=stringObjectMap.get("name")){sql.append("WHEN id = ? THEN ?");//添加参数par.add(stringObjectMap.get("id"));par.add(stringObjectMap.get("name"));}}sql.append("END, ");//去掉多余的 case endreslut = sql.toString().replace("name = CASE  END, ", " ");sql.append("addres = CASE ");for (Map<String, Object> stringObjectMap : temp) {if (null!=stringObjectMap.get("addres")){sql.append("WHEN id = ? THEN ?");//添加参数par.add(stringObjectMap.get("id"));par.add(stringObjectMap.get("addres"));}}sql.append("END, ");//去掉多余的 case endreslut = sql.toString().replace("addres = CASE  END, ", " ");sql.append("id = CASE ");for (Map<String, Object> stringObjectMap : temp) {if (null!=stringObjectMap.get("idd")){sql.append("WHEN id = ? THEN ?");//添加参数par.add(stringObjectMap.get("id"));par.add(stringObjectMap.get("idd"));}}sql.append(" END ");//去掉多余的 case endreslut = sql.toString().replace("id = CASE  END", " ");//判断是否需要截取最后一个逗号(去除空格)reslut= reslut.trim();String substring = reslut.substring(reslut.length() - 1, reslut.length());if (substring.equals(",")){reslut=reslut.substring(0,reslut.length()-1);}//拼接where 条件String strWhere=" where ";for (Map<String, Object> stringObjectMap : temp) {if (null!=stringObjectMap.get("id")){strWhere+="id = ? OR  ";par.add(stringObjectMap.get("id"));}}strWhere=strWhere.trim();String substring1 = strWhere.substring(strWhere.length() - 2, strWhere.length());if (substring1.equals("OR")){strWhere=strWhere.substring(0,strWhere.length()-2);}reslut+=" "+strWhere;return reslut;}

设置参数

 //设置预处理参数private void sqlAppendtemp(PreparedStatement preparedStatement,List<Object> parms){try {int index=1;for (Object parm : parms) {preparedStatement.setObject(index++,parm);}} catch (SQLException throwables) {throwables.printStackTrace();}}

测试类

package com.example.demo;import com.example.demo.test.studentDaoTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@SpringBootTest
class MybatisDemoApplicationTests {@Autowiredprivate studentDaoTest studentDaoTest;@Testvoid contextLoads() {List<Map<String,Object>> tem=new ArrayList<>();int temp=1001;for (int i = 1001; i < 1009; i++) {Map<String,Object> h=new HashMap<>();h.put("id",i);h.put("idd",temp);h.put("name",i+"kk");h.put("addres",i+"dd");tem.add(h);temp++;}String s = studentDaoTest.testSQlAppendBatch(tem);System.out.println(s);}}

更新效果

image-20231014173457142

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

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

相关文章

milvus和相似度检索

流程 milvus的使用流程是 创建collection -> 创建partition -> 创建索引(如果需要检索) -> 插入数据 -> 检索 这里以Python为例, 使用的milvus版本为2.3.x 首先按照库&#xff0c; python3 -m pip install pymilvus Connect from pymilvus import connections c…

mac电脑版数字图像处理软件:ACDSee Photo Studio 9最新 for Mac

ACDSee Photo Studio 9是一款由ACD Systems开发的功能强大的照片管理和编辑软件&#xff0c;专为Mac用户提供一站式解决方案&#xff0c;方便用户轻松浏览、管理和编辑照片。该软件提供了许多实用的工具和功能&#xff0c;包括高效的导入和排序工具、强大的编辑工具、智能组织和…

CustomTabBar 自定义选项卡视图

1. 用到的技术点 1) Generics 泛型 2) ViewBuilder 视图构造器 3) PreferenceKey 偏好设置 4) MatchedGeometryEffect 几何效果 2. 创建枚举选项卡项散列&#xff0c;TabBarItem.swift import Foundation import SwiftUI//struct TabBarItem: Hashable{ // let ico…

Java练习题-获取数组元素最大值

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…

Qt之给控件添加右键菜单

一、设置控件 在对应控件的属性中&#xff0c;将contextMenuPolicy设置为CustomContextMenu。 二、添加槽函数 在对应控件上右键选择槽函数customContextMenuRequested(QPoint)。 三、在槽函数中添加右键菜单 在槽函数中输入如下代码&#xff0c;添加右键菜单。 //右键菜单 …

Flutter 剪裁(Clip)

&#x1f525; ClipOval &#x1f525; 子组件为正方形时剪裁成内贴圆形&#xff1b;为矩形时&#xff0c;剪裁成内贴椭圆 裁剪纯色背景 ClipOval(child: Container(width: 300.w,height: 300.w,decoration: const BoxDecoration(color: Colors.red),),), 裁剪背景图片 裁剪前…

《Deep Residual Learning for Image Recognition》阅读笔记

论文标题 《Deep Residual Learning for Image Recognition》 撑起CV界半边天的论文Residual &#xff1a;主要思想&#xff0c;残差。 作者 何恺明&#xff0c;超级大佬。微软亚研院属实是人才辈出的地方。 初读 摘要 提问题&#xff1a; 更深层次的神经网络更难训练。 …

(vue3)大事记管理系统 文章管理页

[element-plus进阶] 文章列表渲染&#xff08;带搜索&到分页&#xff09; 表单架设&#xff1a;当前el-form标签配置一个inline属性&#xff0c;里面的元素就会在一行显示了 中英国际化处理&#xff1a;App.vue中el-config-provider标签包裹组件&#xff0c;意味着整个组…

【LeetCode高频SQL50题-基础版】打卡第6天:第31~35题

文章目录 【LeetCode高频SQL50题-基础版】打卡第6天&#xff1a;第31~35题⛅前言员工的直属部门&#x1f512;题目&#x1f511;题解 判断三角形&#x1f512;题目&#x1f511;题解 连续出现的数字&#x1f512;题目&#x1f511;题解 指定日期的产品价格&#x1f512;题目&am…

Java实现hack汇编器

Hack汇编语言是一种特定于计算机体系结构的汇编语言&#xff0c;使用Hack架构的机器码指令来编写程序。Hack是一种基于Von Neumann结构的计算机体系结构&#xff0c;由Harvard大学的Nand to Tetris项目开发出来&#xff0c;用于实现计算机硬件和软件。 Hack汇编语言主要用于在…

linux 内核中的pid和前缀树

前言&#xff1a; 写这个文章的初衷是因为今天手写了一个字典树&#xff0c;然后写字典树以后忽然想到了之前看的技术文章&#xff0c;linux kernel 之前的pid 申请方式已经从 bitmap 变成了 基数树&#xff0c;所以打算写文章再回顾一下这种数据结构算法 一、内核中pid的申请…

【学习笔记】minIO分布式文件服务系统

MinIO 一、概述 1.1 minIO是什么&#xff1f; MinIO是专门为海量数据存储、人工智能、大数据分析而设计的对象存储系统。&#xff08;早前流行的还有FastDFS&#xff09; 据官方介绍&#xff0c;单个对象最大可存储5T&#xff0c;非常适合存储海量图片、视频、日志文件、备…

java.sql.SQLFeatureNotSupportedException解决方法

使用MyBatis访问数据库查询数据时报错&#xff1a; Caused by: java.sql.SQLFeatureNotSupportedExceptionat com.alibaba.druid.pool.DruidPooledResultSet.getObject(DruidPooledResultSet.java:1771)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun…

03在命令行环境中创建Maven版的Java工程,了解pom.xml文件的结构,了解Java工程的目录结构并编写代码,执行Maven相关的构建命令

创建Maven版的Java工程 Maven工程的坐标 数学中使用x、y、z三个向量可以在空间中唯一的定位一个点, Maven中也可以使用groupId,artifactId,version三个向量在Maven的仓库中唯一的定位到一个jar包 groupId: 公司或组织域名的倒序, 通常也会加上项目名称代表公司或组织开发的一…

JDBC操作BLOB类型字段

JDBC中Statement接口本身不能直接操作BLOB数据类型 操作BLOB数据类型需要使用PreparedStatement或者CallableStatement(存储过程) 这里演示通过PreparedStatement操作数据库BLOB字段 设置最大传入字节 一般是4M 可以通过以下命令修改 set global max_allowed_packet1024*1…

网页在线打开PDF_网站中在线查看PDF之pdf.js

一、pdf.js简介 PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。 pdf.js 是社区驱动的&#xff0c;并由 Mozilla 支持。我们的目标是为解析和呈现 PDF 创建一个通用的、基于 Web 标准的平台。 pdf.js 将 PDF 文档转换为 HTML5 Canvas 元素&#xff0c;并使用 JavaScr…

Puppeteer结合测试工具jest使用(四)

Puppeteer结合测试工具jest使用&#xff08;四&#xff09; Puppeteer结合测试工具jest使用&#xff08;四&#xff09;一、简介二、与jest结合使用&#xff0c;集成到常规测试三、支持其他的几种四、总结 一、简介 Puppeteer是一个提供自动化控制Chrome或Chromium浏览器的Node…

MyBatis(中)

目录 1、动态sql&#xff1a; 1、if标签&#xff1a; 2、where标签&#xff1a; 3、 trim标签&#xff1a; 4、set标签&#xff1a; 5、choose when otherwise&#xff1a; 6、模糊查询的写法&#xff1a; 7、foreach标签&#xff1a; &#xff08;1&#xff09;批量删除…

施耐德Unity通过Modbus控制变频器

硬件设备 PLC: Unity Premium (CPU:TSX P57154) 通讯卡: TSX SCP 114 连接电缆: TSX SCP CM 4030 VSD: ATV 58 硬件连接 Unity Premium (CPU: TSX P57154)本身不带Modbus接口&#xff0c;因此&#xff0c;采用TSX SCP 114扩展一个Modbus接口。TSX SCP 114是一个RS-485接…

【已解决】No Python at ‘D:\Python\python.exe‘

起因&#xff0c;我把我的python解释器&#xff0c;重新移了个位置&#xff0c;导致我在Pycharm中的爬虫项目启动&#xff0c;结果出现这个问题。 然后&#xff0c;从网上查到了这篇博客: 【已解决】No Python at ‘D:\Python\python.exe‘-CSDN博客 但是&#xff0c;按照上述…