Spring JdbcTemplate使用临时表+事务会话管理实现数据新增、查询及自动清除功能

需求描述:

        由于某些情况下当查询过滤参数过大时,执行sql由于参数过大而报错,此时 需要使用临时表的方式,即 当参数超过某个阀值(如 1000,可调整)新增一张临时表,将原表 与 该临时表进行inner join 达到条件筛选过滤的目的(当然,除了这种方式,还可以考虑 将参数进行切片后分批次查询组装)。

实操步骤:

        1,建表语句

CREATE TABLE T3 (STRING_VALUE VARCHAR(512),DATA_TYPE VARCHAR(128),STRING_VALUE1 VARCHAR(512),STRING_VALUE2 VARCHAR(1024)
);CREATE GLOBAL TEMPORARY TABLE T3_DATA_TEMP (STRING_VALUE VARCHAR(512),DATA_TYPE VARCHAR(128),STRING_VALUE1 VARCHAR(512),STRING_VALUE2 VARCHAR(1024)
);

        2,引入需要的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>testMybatis</artifactId><version>1.0-SNAPSHOT</version><!-- 父项目信息 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.8</version><relativePath/></parent><properties><maven.compiler.source>15</maven.compiler.source><maven.compiler.target>15</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><!-- 高斯DB驱动 --><dependency><groupId>com.huawei.gauss</groupId><artifactId>com.huawei.gauss.jdbc.ZenithDriver</artifactId><version>1.2.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

        3,编写application.properties文件

       

spring.datasource.url=jdbc:zenith:@xxx:xxxx
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.huawei.gauss.jdbc.inner.GaussDriver
mybatis.mapper-locations=classpath:mapper/*.xmlorg.apache.springframework.jdbc.core.JdbcTemplate = debug

        4,编写 dao 层接口代码

package com.example.dao;import com.example.entity.DataTemp;import java.util.List;public interface DataTempDao {void batchInsert(String dataType, List<?> values);void batchInsert(List<DataTemp> records);List<String> queryForList();void batchInsertmy_session_data(List<DataTemp> records);void createTempTable();List<String> queryValueList();List<String> queryValueListT3();void batchInsertT3(List<DataTemp> records);
}

        5,dao 层实现

package com.example.dao.impl;import com.example.dao.DataTempDao;
import com.example.entity.DataTemp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;import java.util.List;
import java.util.stream.Collectors;@Repository
public class DataTempDaoImpl implements DataTempDao {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic void batchInsert(String dataType, List<?> values) {if (CollectionUtils.isEmpty(values)) {return;}batchInsert(values.stream().map(value -> new DataTemp(dataType, value.toString())).collect(Collectors.toList()));}@Overridepublic void batchInsert(List<DataTemp> records) {String sql = "insert into t_comm_data_temp(data_type, string_value, string_value1, string_value2) values(?, ?, ?, ?)";jdbcTemplate.batchUpdate(sql, records, records.size(), (ps, record) -> {ps.setString(1, record.getDataType());ps.setString(2, record.getStringValue());ps.setString(3, record.getStringValue1());ps.setString(4, record.getStringValue2());});}@Overridepublic void batchInsertT3(List<DataTemp> records) {
//        String sql = "insert into t3(data_type, string_value, string_value1, string_value2) values(?, ?, ?, ?)";String sql = "insert into t3_data_temp(data_type, string_value, string_value1, string_value2) values(?, ?, ?, ?)";jdbcTemplate.batchUpdate(sql, records, records.size(), (ps, record) -> {ps.setString(1, record.getDataType());ps.setString(2, record.getStringValue());ps.setString(3, record.getStringValue1());ps.setString(4, record.getStringValue2());});}@Overridepublic List<String> queryForList() {String sql = "select string_value from t_comm_data_temp";return jdbcTemplate.queryForList(sql, String.class);}@Overridepublic List<String> queryValueListT3() {
//        String sql = "select string_value from t3";String sql = "select string_value from t3_data_temp";return jdbcTemplate.queryForList(sql, String.class);}@Overridepublic void batchInsertmy_session_data(List<DataTemp> records) {String sql = "insert into `#my_session_data`(data_type, string_value, string_value1, string_value2) values(?, ?, ?, ?)";jdbcTemplate.batchUpdate(sql, records, records.size(), (ps, record) -> {ps.setString(1, record.getDataType());ps.setString(2, record.getStringValue());ps.setString(3, record.getStringValue1());ps.setString(4, record.getStringValue2());});}@Overridepublic void createTempTable() {String sql = "CREATE TEMPORARY TABLE `#my_session_data` (  \n" +"    STRING_VALUE VARCHAR(512),\n" +"    DATA_TYPE VARCHAR(128),\n" +"    STRING_VALUE1 VARCHAR(512),\n" +"    STRING_VALUE2 VARCHAR(1024)\n" +")";jdbcTemplate.execute(sql);}@Overridepublic List<String> queryValueList() {String sql1 = "select string_value from `#my_session_data`";return jdbcTemplate.queryForList(sql1, String.class);}
}

        6,启动类

        

package com.example;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

        7,编写单元测试类(涵盖业务流程)


import com.example.DemoApplication;
import com.example.dao.DataTempDao;
import com.example.dao.T1Dao;
import com.example.entity.DataTemp;
import com.example.entity.T1;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.ColumnMapRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
@Slf4j
public class SpringTest {@AutowiredDataTempDao dataTempDao;@AutowiredJdbcTemplate jdbcTemplate;@AutowiredT1Dao t1Dao;@Testpublic void test1(){List<DataTemp> list = new ArrayList<>(10);DataTemp dataTemp = new DataTemp();dataTemp.setDataType("test");dataTemp.setStringValue("111");dataTemp.setStringValue1("1");dataTemp.setStringValue2("2");list.add(dataTemp);dataTempDao.batchInsert(list);//查询List<String> dataTemps = dataTempDao.queryForList();log.info("查询有:{}条数据!",dataTemps.size());}/*** 测试查询*/@Testpublic void test2(){//查询String sql = "select * from T1";List<Map<String, Object>> query = jdbcTemplate.query(sql, new ColumnMapRowMapper());query.stream().forEach(v->{v.entrySet().stream().forEach(w->{log.info("key:{},value:{}",w.getKey(),w.getValue());});});}/*** 测试单条新增*/@Testpublic void test3(){T1 t1 = new T1();
//        t1.setId(1L);t1.setData(new Timestamp(System.currentTimeMillis()));t1.setA("A");t1.setB("B");t1Dao.save(t1);}/*** 测试批量新增*/@Testpublic void test4(){List<T1> list = new ArrayList<>(4);for (int i = 0; i < 4; i++) {T1 t1 = new T1();t1.setId(Long.valueOf(i));t1.setData(new Timestamp(System.currentTimeMillis()));t1.setA("A"+i);t1.setB("B"+i);list.add(t1);}t1Dao.batchInsert(list);}/*** 临时表测试* 同一个 session下的表才能查询到,即 每次创建完表执行操作后,session结束时会自动把数据及表清除掉,下次再执行时重新开始*/@Testpublic void test5(){dataTempDao.createTempTable();log.info("建表完成!");List<DataTemp> list = new ArrayList<>(10);DataTemp dataTemp = new DataTemp();dataTemp.setDataType("test");dataTemp.setStringValue("111");dataTemp.setStringValue1("1");dataTemp.setStringValue2("2");list.add(dataTemp);dataTempDao.batchInsertmy_session_data(list);//查询List<String> dataTemps = dataTempDao.queryValueList();log.info("总共有:{} 条数据!",dataTemps.size());}@Test@Transactionalpublic void test6(){List<DataTemp> list = new ArrayList<>(10);DataTemp dataTemp = new DataTemp();dataTemp.setDataType("test");dataTemp.setStringValue("111");dataTemp.setStringValue1("1");dataTemp.setStringValue2("2");list.add(dataTemp);dataTempDao.batchInsertT3(list);//查询List<String> dataTemps = dataTempDao.queryValueListT3();log.info("查询有:{}条数据!",dataTemps.size());}}

        注意:要想实现 插入数据 与 查询 在同一个会话中实现,这里采用最简单的实现方式:事务  来实现,即 方法上加上注解   @Transactional 即可

8,整个项目代码结构

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

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

相关文章

代码随想录算法训练营第六十二天|503.下一个更大元素II、42.接雨水

代码随想录算法训练营第六十二天|503.下一个更大元素II、42.接雨水 503.下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元…

第十一篇:操作系统新纪元:智能融合、量子跃迁与虚拟现实的交响曲

操作系统新纪元&#xff1a;智能融合、量子跃迁与虚拟现实的交响曲 1 引言 在数字化的浪潮中&#xff0c;操作系统如同一位智慧的舵手&#xff0c;引领着信息技术的航船穿越波涛汹涌的海洋。随着人工智能、物联网、量子计算等前沿技术的蓬勃发展&#xff0c;操作系统正站在一个…

富士Apeos 2350 NDA复印机报062 360代码故障

故障描述&#xff1a; 富士Apeos 2350 NDA复印机新机器刚拆箱安装&#xff0c;开机正常&#xff0c;自检扫描头一卡一卡的往前动几下就不动了、扫描灯也不亮扫描头也不能正常复位&#xff1b;按机器的复印键直接报062 360代码&#xff1b; 解答&#xff1a; 此代码为扫描故障&a…

PDF高效编辑:一键批量,PDF转图片的快速解决方案

在数字化时代&#xff0c;PDF文件已成为工作和学习中不可或缺的一部分。然而&#xff0c;有时我们可能需要将PDF转换为图片&#xff0c;以便更轻松地编辑、共享或处理。为了满足这一需求&#xff0c;许多高效的PDF编辑工具应运而生&#xff0c;其中“办公提效工具”一键批量PDF…

【每日八股】淘天一面

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 rocketmq的消息重复发送问题&#xff1f;如何保证幂等&#xff1f; 如何保证幂等性&#xff1a; 消息 Key 设置&#xff1a;不建议…

如何自定义Markdown中插入图片的位置

工作中常常需要在VsCode下写Markdown笔记&#xff0c;在写笔记的过程中不免需要插入图片。  Markdown中插入笔记的操作往往是比较繁琐的&#xff0c;比如&#xff1a;在文档中引用本地某个文件夹下的图片&#xff0c;首先需要你先保存图片到本地路径&#xff0c;然后需要你在文…

Vue-Cli脚手架项目的搭建【新手快速入手】

目录 一、Vue CLI脚手架简介☺ 1.Node.js前置环境的安装 2.安装npm管理器 3.安装淘宝镜像(cnpm) 二、安装vue-cli 1. 版本号查看 2.旧版本卸载 3.新版本安装 4.检查 三、Vue项目的搭建 &#x1f4cc;进入Vue项目管理器 ★命令方式创建 若localhost拒绝访问怎么办&…

技术速递|Python in Visual Studio Code 2024年5月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2024 年 5 月发布&#xff01; 此版本包括以下公告&#xff1a; “Implement all inherited abstract classes”代码操作新的自动缩进设置Debugpy 从 Python 扩展中删除&#…

Unity TileMap入门

概述 相信很多同学学习制作游戏都是从2D游戏开始制作的吧&#xff0c;瓦片地图相信大家都有接触&#xff0c;那接下来让我们学习一下这部分的内容吧&#xff01; Tilemap AnimationFrameRate:设置每帧动画的播放速率。Color:瓦片地图的颜色TileAnchor:锚点&#xff0c;&#x…

Docker容器创建各种镜像

目录 1.Docker创建Mysql容器 2.Docker创建Redis容器 3.Docker 创建minio容器 1.Docker创建Mysql容器 拉取镜像 docker pull mysql:8.0.20 宿主机创建挂载目录 /opt/mysql/conf /opt/mysql/data /opt/mysql/log 启动命令 docker run --name mysql -p 3306:3306 -v /opt/…

Set接口

Set接口的介绍 Set接口基本介绍 无序&#xff08;添加和取出的顺序不一致&#xff09;&#xff0c;没有索引不允许重复元素&#xff0c;所以最多包含一个nullJDK API中Set接口的实现类&#xff1a;主要有HashSet&#xff1b;TreeSet Set接口的常用方法 和List 接口一样&am…

Windows11提示升级,我要点确定吗?

Windows 11自2021年10月推出以来&#xff0c;一直保持着缓慢而稳定的增长&#xff0c;相对来说在游戏PC上的影响力较大&#xff0c; 而Windows 10也即将于2025年10月结束支持。 截至2024年&#xff0c;Windows 11的主要版本包括24H2、 23H2、22H2和21H2。 24H2&#xff1a;20…

k8s遇到的常见问题及解决

1. error: open /var/lib/kubelet/config.yaml: no such file or directory 解决&#xff1a;关键文件缺失&#xff0c;多发生于没有做 kubeadm init就运行了systemctl start kubelet。 要先成功运行kubeadm init 2. 执行初始化kubeadm init ------的时候报错 The HTTP call…

五一超级课堂---Llama3-Tutorial(Llama 3 超级课堂)---第四节Llama 3 高效部署实践(LMDeploy 版)

课程文档&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 课程视频&#xff1a; https://space.bilibili.com/3546636263360696/channel/collectiondetail?sid2892740&spm_id_from333.788.0.0 操作平台&#xff1a; https://studio.intern-ai.org.cn/consol…

GAMMA Lab——知识图谱和LLM大模型

图机器学习的发展与分类 图基础模型 LLM基础模型 GNN LLM 前沿工作

JUC下的CompletableFuture详解

详细介绍 CompletableFuture是Java 8引入的一个实现Future接口的类&#xff0c;它代表一个异步计算的结果。与传统的Future相比&#xff0c;CompletableFuture提供了更丰富的功能&#xff0c;比如链式调用、组合异步操作、转换结果、异常处理等&#xff0c;极大地增强了Java在…

TikTok shop多账户需要防关联吗?

TikTok是一个非常垂直的平台&#xff0c;每个账号的内容都应该尽可能的垂直&#xff0c;这样平台才能引流更多的流量。但是&#xff0c;TikTokShop只有一两个账号&#xff0c;流量往往难以保证&#xff0c;所以很多商家选择了TikTok的多账号运营模式。 众所周知&#xff0c;多店…

什么是SOL链跟单机器人与阻击机器人?

SOL链作为一个快速增长的区块链生态系统&#xff0c;为各种应用程序提供了丰富的发展机会。在SOL链上&#xff0c;智能合约的应用已经开始蓬勃发展&#xff0c;其中包括了许多与加密货币交易相关的应用。在本文中&#xff0c;我们将介绍在SOL链上开发的阻击机器人&#xff08;S…

【静态分析】软件分析课程实验A3-死代码检测

官网&#xff1a; 作业 3&#xff1a;死代码检测 | Tai-e 参考&#xff1a; https://www.cnblogs.com/gonghr/p/17981720 --------------------------------------------------------------------- 1 作业导览 为 Java 实现一个死代码&#xff08;dead code&#xff09;检…

【计算机毕业设计】springboot果蔬种植销售一体化服务平台

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对果蔬种植销售一体化服务管理进行规范而严格是十分有必要的&#xff0c;所以许许多多的 信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套果蔬种植销售一体化服务平台&…