spring+mybatis一个方法执行多条更新语句,实现批量DML

2024-03-14 13:32

本文主要是介绍spring+mybatis一个方法执行多条更新语句,实现批量DML,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在实际开发中,经常会遇到一个方法里需要更新多张表的情况,在使用spring+mybatis的时候,我们一般写多个dao方法分别与mapper中<update>或<insert>标签对应,然后在service中调用这么多个dao方法,这样不仅浪费人力物力,代码也不好看,全是updateXx1/updateXx2/insertXx3/insertXx4等。

笔者经过查看mybatis的源码,发现mybatis确实不支持一个<update>中写多条语句,这是因为mybatis底层其实是使用PreparedStatement实现的,这个东西在初始化的时候就得传一个sql语句进去,然后对于?参数再使用setXxx()填充进去,mybatis为了偷懒就没有实现多条语句的操作。

笔者经过慎重思考及实验,得出以下三种实现方法:

  1. 使用Statement,把sql语句写在代码里,通过其addBatch(sql)方法(此方法无法在PreparedStatement中使用)把sql语句加进去,然后批量执行,但是这种方法有个问题,你得先把参数写死在sql中,这当然是不建议的啦,sql注入,你懂的~~
  2. 使用存储过程,这当然是最简单的方法啦,但是,你得先能干得过DBA,再说了,你不能每次两次以上的更新都去麻烦DBA,不是么~~
  3. 自己通过mybatis的API改造出来一个可以多次更新的方法,以下介绍的方法就使用这种方法_

笔者把mybatis的API翻了个底朝天,终于写出了以下方法,直接上代码:
(以下代码,为节约空间,把package和import都干掉了)

/*** VO 公共数据库操作dao* * @version 1.0*/
public class BaseSqlDaoImpl<T> implements BaseSqlDao<T> {private static Logger logger = LoggerFactory.getLogger(BaseSqlDaoImpl.class);/*** Mapper包路径*/private String baseMapperPackage;public String getBaseMapperPackage() {return baseMapperPackage;}public void setBaseMapperPackage( String baseMapperPackage ) {this.baseMapperPackage = baseMapperPackage;}@Resourceprivate SqlSessionFactory sqlSessionFactory;/*** Alan添加,用于一个mapper更新多个表* 注:* (1)Connection不用close,mybatis自己会回收;* (2)使用此方法可以使用spring的事务管理* * @param params* @return* @throws DaoException*/@Overridepublic void updateMultiTables( Map<String, Object> params ) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();PreparedStatement ps = null;try {String selectVoName =params.get("selectVoName") == null ? "baseSelectListByVo" : params.get("selectVoName").toString();//此处getBaseMapperPackage()如果取不到值,可以直接写*Mapper.java类所在的包名String mapperName = getBaseMapperPackage() + "." + params.get("mapperClassType");Connection connection = sqlSession.getConnection();BoundSql boundSql =sqlSession.getConfiguration().getMappedStatement(mapperName + "." + selectVoName).getBoundSql(params);String[] sqls = boundSql.getSql().split(";");List

这篇关于spring+mybatis一个方法执行多条更新语句,实现批量DML的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.