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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M