mybatis批量执行sql的处理 spring boot

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mybatis批量执行sql的处理 spring boot

前言:

在实际工作中会用到批量执行sql的一些命令,比如说批量的查询处理,批量的插入处理、批量的更新处理处理等等,本次代码主要介绍几种实际工作当中的解决办法。

批量的查询:

关于循环查询的方式,使用in方式

<foreach collection="ids" item="id" open="and business_id in (" separator="," close=")">

  #{id}

</foreach>

里面的变量,ids代表是一个list的string类型的,id代表循环里面的自定义变量。and business_id代表的是查询语句里面的sql语句。

在可以确定查询的id是多条的情况下,比如说可能是10条以上的话,最好的方式进行in的方式进行查询,避免打开或者关闭数据库的时候浪费大量的时间。


<select id="queryExpandFormExtByBusinessIds" parameterType="java.util.Map" resultType="com.iss.cms.fdrb.common.dao.entity.ExpandFormExt">

  select

  <include refid="expandColumn"/>

  from t_fdrb_expand_form_ext${tableNo} expand

  <where>

     expand.tenant_id = #{tenantId}

     <!--         <if test="templateCode!=null and templateCode!=''">-->

     <!--            template_code = #{templateCode}-->

     <!--         </if>-->

     <foreach collection="ids" item="id" open="and business_id in (" separator="," close=")">

        #{id}

     </foreach>

  </where>

</select>


需要特别注意下,这个传参不是实体类而是一个Map类型的,所以在定义方法的时候,要定义这个类型的

/**

* @Project:根据业务id查询拓展字段数据

* @Module: com.iss.cms.tshd

* @Deion:

* @author: hycaid

* @date: 2021/4/22 10:22

*/

List queryExpandFormExtByBusinessIds(List ids);

具体的实现类型是这样的,使用Map进行参数的传值

@Override

public List<ExpandFormExt> queryExpandFormExtByBusinessIds(List<String> ids) {

  ExpandFormExt expandFormExt = new ExpandFormExt();

  Map map=new HashMap<>();

  map.put("ids",ids);

  map.put("tenantId",expandFormExt.getTenantId());

  map.put("tableNo",expandFormExt.getTableNo());

  return this.sqlSessionTemplate.selectList(NAMESPACE + "queryExpandFormExtByBusinessIds", map);

}

通过实现的方式可以看出来,这个map进行动态的赋值操作,比如说,进行三个参数的传参处理。

批量的插入处理:

批量插入的处理代码,sql语句如下:

<!-- 批量插入记录mysql -->

<insert id="insertBatchContractBalanceByMysql"  parameterType="java.util.Map" >

insert into t_fdrb_bl_contract_balance${tableNo}(

      id,

      create_by_code,

      create_by_name,

      create_time,

      update_by_code,

      update_by_name,

      update_time,

      data_version,

      data_status,

      contract_code,

      contract_id,

      loan_date,

      balance,

      contract_type,

     loan_org_id,

     loan_org_code,

     loan_org_name,

     currency_name,

     currency_type,

     tenant_id

)

values

  <foreach collection ="list" item="item" separator =",">

     (#{item.id},

     #{item.createByCode},

     #{item.createByName},

     #{item.createTime},

     #{item.updateByCode},

     #{item.updateByName},

     #{item.updateTime},

     #{item.dataVersion},

     #{item.dataStatus},

     #{item.contractCode},

     #{item.contractId},

     #{item.loanDate},

     #{item.balance},

     #{item.contractType},

     #{item.loanOrgId},

     #{item.loanOrgCode},

     #{item.loanOrgName},

     #{item.currencyName},

     #{item.currencyType},

     #{item.tenantId})

  </foreach >


</insert>

对应的接口定义如下:

@Override

public void insertBatchContractBalanceByMysql(List<ContractBalance> list) {

  ContractBalance contractBalance = new ContractBalance();

  Map map = new HashMap<>();

  map.put("tableNo",contractBalance.getTableNo());

  map.put("list",list);

  this.sqlSessionTemplate.insert(NAMESPACE + "insertBatchContractBalanceByMysql", map);

}

批量的更新处理:

这一部分的内容,可以参考批量的查询处理,由于更新都是根据多个条件进行更新的。

最后总结:

通过上面的两段代码可以看出来,整个map的集合,然后map的第二个key、value传值的是一个list的集合,而不是实体类的形式,这样通过sql拼接的方式实现插入的处理,避免存在多条插入语句异常导致的部分插入失败的情况。

通过上面的两个例子可以延申出来,更新的时候也可以使用拼接sql的形式进行批量更新的操作。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL XML Java
|
6天前
|
SQL
【MybatisPlus】条件构造器、自定义SQL、Service接口
【MybatisPlus】条件构造器、自定义SQL、Service接口
17 0
【MybatisPlus】条件构造器、自定义SQL、Service接口
|
8天前
|
Java 关系型数据库 数据库连接
MyBatis-Plus介绍及Spring Boot 3集成指南
MyBatis-Plus是一个MyBatis扩展工具,旨在简化Java开发中的CRUD操作。它具有无侵入性、低损耗、强大的CRUD功能、Lambda表达式支持、主键自动生成、ActiveRecord模式、全局操作和内置代码生成器等特点。在Spring Boot 3中集成MyBatis-Plus,需在pom.xml添加依赖,排除特定版本的mybatis-spring,并用@MapperScan注解指定Mapper接口路径。此外,还介绍了如何使用MyBatis-Plus代码生成器自动生成Mapper、Model、Service和Controller层代码,以加速开发。
47 2
MyBatis-Plus介绍及Spring Boot 3集成指南
|
9天前
|
SQL Java 关系型数据库
基于SpringBoot使用MyBatisPlus,MyBatisPlus标准数据层开发(CRUD)、MyBatisPlus分页功能的使用
基于SpringBoot使用MyBatisPlus,MyBatisPlus标准数据层开发(CRUD)、MyBatisPlus分页功能的使用
19 2
|
9天前
|
Java 关系型数据库 MySQL
SpringBoot整合JUnit、MyBatis、SSM
SpringBoot整合JUnit、MyBatis、SSM
19 4
|
9天前
|
Java 数据库连接 数据库
Spring整合Mybatis、Spring整合JUnit
Spring整合Mybatis、Spring整合JUnit
18 1
Spring整合Mybatis、Spring整合JUnit
|
9天前
|
SQL XML Java
MyBatis的强大特性--动态SQL
MyBatis的强大特性--动态SQL
25 2
|
9天前
|
SQL Java 数据库连接
实时计算 Flink版产品使用合集之怎么将MyBatis-Plus集成到SQL语法中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
18天前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
139 1
|
16天前
|
算法 Java 数据库连接
Spring+MySQL+数据结构+集合,Alibaba珍藏版mybatis手写文档
Spring+MySQL+数据结构+集合,Alibaba珍藏版mybatis手写文档