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

news2024/11/24 4:32:37

环境准备(非核心方法)

创建表

创建表的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 STATISTICS
            STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
            DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
        TABLESPACE "SYSTEM"
    ENABLE
)
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
    STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
    DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
TABLESPACE "SYSTEM"
    LOB ( "ADDRES" ) STORE AS BASICFILE (
        TABLESPACE "SYSTEM"
        ENABLE STORAGE IN ROW
        CHUNK 8192
        RETENTION
        NOCACHE LOGGING
        STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
        DEFAULT 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 {


    @Autowired
    private 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 {


    @Autowired
    private studentDaoTest studentDaoTest;

    @Test
    void 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();
         //获取拼接好的sql
        String 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

 // 拼接sql
    private 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 end
        reslut = 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 end
        reslut = 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 end
        reslut = 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 {


    @Autowired
    private studentDaoTest studentDaoTest;

    @Test
    void 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.coloradmin.cn/o/1092014.html

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

相关文章

Studio One6.5全新版本更新功能详情介绍

Studio One是一款专业的音乐制作软件&#xff0c;由美国PreSonus公司开发。该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One的主要特点…

一文2000字从0到1手把手教你jmeter分布式压测

一、jmeter为什么要做分布式压测 jmeter本身的局限性 一台压力机的 Jmeter 支持的线程数受限于 Jmeter 其本身的机制和硬件配置&#xff08;内存、CPU等&#xff09;是有限的由于 Jmeter 是 Java 应用&#xff0c;对 CPU 和内存的消耗较大&#xff0c;在需要模拟大量并发用户…

论文中的算法/伪代码怎么写/理解

文章目录 第零步 基础知识第一步 创建latex文档&#xff0c;导入安装包第二步 写伪代码第三步 美化伪代码补充&#xff1a;latex无法显示中文 准备工作&#xff1a; overleaf&#xff1a;在线的latex文档编辑平台 algorithm2e&#xff1a;Latex的一个写算法的库 第零步 基础知识…

【树莓派 picamera】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言https://www.cnblogs.com/uestc-mm/p/7606855.html 一、picamera是什么&#xff1f;二、使用步骤1.引入库2.先要安装opencv 总结 前言 想用树莓派libcamera &a…

发货100虚拟商品自动发货系统存在SQL注入

漏洞描述 该系统存在SQL注入漏洞&#xff0c;可获取敏感信息及账号密码。 漏洞复现 构造SQL注入延时payload&#xff1a; M_id11%20AND%20(SELECT%208965%20FROM%20(SELECT(SLEEP(5)))sdhh)&typeproduct漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;…

C语言网络编程基础(linux)

目录 文件描述符与套接字网络编程的基本流程基础的函数和结构体&#xff08;持续更新&#xff09;socket函数sockaddr和sockaddr_in结构体bind函数listen函数accept函数recv函数writev函数readv函数connect函数fcntl函数 epoll相关函数epoll_createepoll_ctl函数epoll_wait函数…

竞赛 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

生物标志物发现中的无偏数据分析策略

目录 0. 导论基本概念 1. 生物标志物发现的注意事项2. 数据预处理2.1 高质量原始数据和缺失值处理2.2 数据过滤2.3 数据归一化 3. 数据质量评估3.1 混杂因素3.2 类别分离3.3 功效分析3.4 批次效应 4. 生物标志物发现4.1 策略4.2 数据分析工具4.3 模型优化策略 0. 导论 组学技术…

Pytorch之MobileViT图像分类

文章目录 前言一、Transformer存在的问题二、MobileViT1.MobileViT网络结构&#x1f353; Vision Transformer结构&#x1f349;MobileViT结构 2.MV2(MobileNet v2 block)3.MobileViT block&#x1f947;Local representations&#x1f948;Transformers as Convolutions (glob…

三十四、【进阶】MySQL索引的操作

1、创建索引 &#xff08;1&#xff09;基础语法 &#xff08;2&#xff09;唯一索引 唯一索引与普通索引不同的是&#xff0c;索引列的数值必须唯一&#xff0c;但允许有空值null&#xff1b; 唯一索引与主键索引不同的是&#xff0c;主键索引不允许出现空值null&#xff0…

Webmin 远程命令执行漏洞_CVE-2019-15107

Webmin 远程命令执行漏洞_CVE-2019-15107 文章目录 Webmin 远程命令执行漏洞_CVE-2019-15107在线漏洞详情&#xff1a;漏洞描述&#xff1a;版本影响&#xff1a;环境搭建漏洞复现使用BP进行抓包POC发送以下POST请求来执行命令id:复现成功 漏洞利用-shell反弹执行反弹指令bp的i…

【Flutter Widget】AppBar 和 PopupMenu

App Bar 可以视为页面的标题栏&#xff0c;在 Flutter 中用AppBar组件实现&#xff1b;Popup Menu 是弹出菜单&#xff0c;用PopupMenuButton实现。下面结合这两个组件说明其用法。 1. 代码实现 一个简单的AppBar实现代码如下&#xff1a; import package:flutter/material.…

同源策略和跨域问题

1.跨域问题产生的原因 浏览器的同源策略影响&#xff0c;同源策略是一种安全机制&#xff0c;它限制了一个网页中的脚本只能访问同源的资源。 跨源网络访问的三种方式&#xff1a;跨域写操作&#xff0c;跨域资源嵌入&#xff0c;跨域读操作 2.跨域问题案例 ip和域名不一致…

使用 Certbot 为 Nginx 自动配置 SSL 证书

发布于 2023-07-13 on https://chenhaotian.top/linux/certbot-nginx/ 使用 Certbot 为 Nginx 自动配置 SSL 证书 配置步骤 以 Debian 11 为例 1. 安装Certbot和Nginx插件 sudo apt-get update sudo apt-get install certbot python3-certbot-nginx2. 获取和安装证书 运行…

nginx的location的优先级和匹配方式和nginx的重定向

在http模块有server,在server模块才有location,location匹配的是uri /test /image 在一个server当中有多个location,如何来确定匹配哪个location。 nginx的正则表达式&#xff1a; ^&#xff1a;字符串的起始位置 $&#xff1a;字符串的结束位置 *&#xff1a;匹配所有 &am…

【宏offsetof详解和模拟实现】

文章目录 一. 什么是offsetof&#xff1f;二. 用宏模拟实现offsetof三. 代码重点讲解四. 结束语 一. 什么是offsetof&#xff1f; 1.** 注意&#xff1a;offsetof不是函数而是一个宏** 2. 返回值是size_t无符号整形&#xff0c;头文件是<stddef.h>&#xff0c;参数是&…

智慧工地解决方案,智慧工地平台源码

一、现状描述 建筑工程建设具有明显的生产规模大宗性与生产场所固定性的特点。建筑企业70%左右的工作都发生在施工现场&#xff0c;施工阶段的现场管理对工程成本、进度、质量及安全等至关重要。同时随着工程建设规模不断扩大&#xff0c;工艺流程纷繁复杂&#xff0c;如何搞好…

腾讯云我的世界mc服务器多少钱一年?

腾讯云我的世界mc服务器多少钱&#xff1f;95元一年2核2G3M轻量应用服务器、2核4G5M带宽优惠价218元一年、4核8G12M带宽轻量服务器446元一年&#xff0c;云服务器CVM标准型S5实例2核2G优惠价280元一年、2核4G配置服务器748元一年&#xff0c;腾讯云百科txybk.com分享腾讯云我的…

Spring MVC 和Spring JDBC

目录 Spring MVC MVC模式 核心组件 工作流程 Spring JDBC Spring JDBC功能和优势 Spring JDBC的关键组件 Spring MVC Spring MVC&#xff08;Model-View-Controller&#xff09;是Spring框架的一个模块&#xff0c;用于构建Web应用程序。它的主要目标是将Web应用程序的不…

【Python】Python语言基础(上)

第一章 前言 1. Python简介 Python语言并不是新的语言&#xff0c;它早于HTTP 1.0协议5年&#xff0c;早于Java语言 4年。 ​ Python是由荷兰人Guido van Rossum&#xff08;吉多范罗苏姆&#xff09;于1989年圣诞节期间在阿姆斯特丹休假时为了打发无聊的假期而编写的一个脚本…