前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis批量执行sql的处理 spring boot

mybatis批量执行sql的处理 spring boot

作者头像
小马哥学JAVA
发布2023-07-15 15:43:37
2820
发布2023-07-15 15:43:37
举报
文章被收录于专栏:JAVA开发专栏JAVA开发专栏

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

代码语言:javascript
复制
<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的方式进行查询,避免打开或者关闭数据库的时候浪费大量的时间。

代码语言:javascript
复制
<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进行参数的传值

代码语言:javascript
复制
@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语句如下:

代码语言:javascript
复制
<!-- 批量插入记录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>

对应的接口定义如下:

代码语言:javascript
复制
@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的形式进行批量更新的操作。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-03-24,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 小马哥学JAVA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com