mybatis批量执行sql的处理 spring boot

举报
小马哥学JAVA 发表于 2023/02/18 17:48:25 2023/02/18
【摘要】 前言:在实际工作中会用到批量执行sql的一些命令,比如说批量的查询处理,批量的插入处理、批量的更新处理处理等等,本次代码主要介绍几种实际工作当中的解决办法。批量的查询:关于循环查询的方式,使用in方式   #{id}里面的变量,ids代表是一个list的string类型的,id代表循环里面的自定义变量。and business_id代表的是查询语句里面的sql语句。在可以确定查询的id是多条...

前言:

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

批量的查询:

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

   #{id}

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

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


   select      from t_fdrb_expand_form_ext${tableNo} expand         expand.tenant_id = #{tenantId}                                 #{id}         


需要特别注意下,这个传参不是实体类而是一个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 queryExpandFormExtByBusinessIds(List 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语句如下:

 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

   

      (#{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})

   


对应的接口定义如下:

@Override

public void insertBatchContractBalanceByMysql(List 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的形式进行批量更新的操作。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。