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

本文主要是介绍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

这篇关于Java-使用sqlSessionTemplate实现批量更新-模拟mybatis 动态sql的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/220374

相关文章

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La