mybatis使用in语句,拼接逗号的使用、拼接sql语句实现批量插入、批量更新的案例处理
2023-02-26 09:49:33 时间
关于循环查询的方式,使用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的形式进行批量更新的操作。
相关文章
- 每天20分钟之服务的等级
- FLStudio21新版水果DAW宿主软件有哪些新功能
- 2023会声会影软件新增八大功能介绍
- mathtype2023数学符号编辑器软件下载使用教程
- Kubernetes1.25.6 cri-docker 部署文档
- Google Chrome CVE-2022-3656 漏洞
- 2022爱分析・智能客服厂商全景报告 | 爱分析报告
- clickhouse简单操作
- TKE中使用Nginx Ingress Controller 开启SSL-Passthrough
- macOS 13 Ventura (苹果最新系统) v13.2.0正式版
- 使用Terraform创建QCS角色
- Target 塔吉特DVS EDI 业务测试指南
- 商场会员小程序运营4大难题
- 手机号码归属地可以应用在哪些地方呢?
- BERT vs GPT:了解自然语言处理中的关键差异
- windows提权
- 一篇文章告诉你 golang 环境变量的所有基础操作
- 服装厂如何做精益布局设计?
- 振弦采集模块配置工具VMTool 扩展功能指令生成器与实时曲线
- RNA-seq 详细教程:分析流程介绍(1)