一、mybatis批量操作-crud:
参考:
批量增删查:https://blog.csdn.net/luo4105/article/details/77892889
===主要难点:批量修改。上面博客里还有种 批量更新。感觉更适合我这里“数据同步的需求”:
能够实现照搬过来最新的,旧的作废。
List<Object>
这是一个批量保存(插入或修改)的例子
<insert id="insertList" parameterType="list" >
replace into xx (id, c1,c2) values
<foreach collection="list" item="it" separator=",">
(#{it.id},#{it.c1},#{it.c2})
</foreach>
</insert>
replace:会根据主键和唯一索引判断该记录是否存在,存在就删除在插入(修改),不存在就插入(insert)。
---------------------
作者:逝兮诚
来源:CSDN
原文:https://blog.csdn.net/luo4105/article/details/77892889
版权声明:本文为博主原创文章,转载请附上博文链接!
===批量插入:经验就是:不需要判断if字段是否存在。所有字段一起插入即可。因为可以插入null。
批量改:https://www.cnblogs.com/exmyth/p/5757137.html
项目应用:
同步客户数据:从一张表每天凌晨2点,同步到当前系统客户表。
有的更新,没有的插入。唯一标识cid客户id。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aliyun.home.dao.mapper.PublicCloudCustomerApiMapper">
<!--仿照DeliverApi,自定义mapper。-->
<update id="batchUpdate" parameterType="list">
update public_cloud_customer
<trim prefix="set" suffixOverrides=",">
<trim prefix="cid =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.cid!=null">
when cid=#{i.cid} then #{i.cid}
</if>
</foreach>
</trim>
<trim prefix="customer_name =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.customerName!=null">
when cid=#{i.cid} then #{i.customerName}
</if>
</foreach>
</trim>
<trim prefix="industry_area_line =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.industryAreaLine!=null">
when cid=#{i.cid} then #{i.industryAreaLine}
</if>
</foreach>
</trim>
<trim prefix="tl_group =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.tlGroup!=null">
when cid=#{i.cid} then #{i.tlGroup}
</if>
</foreach>
</trim>
<trim prefix="customer_tam =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.customerTam!=null">
when cid=#{i.cid} then #{i.customerTam}
</if>
</foreach>
</trim>
<trim prefix="customer_cbm =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.customerCbm!=null">
when cid=#{i.cid} then #{i.customerCbm}
</if>
</foreach>
</trim>
<trim prefix="customer_gc_level =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.customerGcLevel!=null">
when cid=#{i.cid} then #{i.customerGcLevel}
</if>
</foreach>
</trim>
<trim prefix="gmt_create =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.gmtCreate!=null">
when cid=#{i.cid} then #{i.gmtCreate}
</if>
</foreach>
</trim>
<trim prefix="gmt_modified =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.gmtModified!=null">
when cid=#{i.cid} then #{i.gmtModified}
</if>
</foreach>
</trim>
<trim prefix="is_valid =case" suffix="end,">
<foreach collection="list" item="i" index="index">
<if test="i.isValid!=null">
when cid=#{i.cid} then #{i.isValid}
</if>
</foreach>
</trim>
</trim>
where
<foreach collection="list" separator="or" item="i" index="index" >
cid=#{i.cid}
</foreach>
</update>
<insert id="batchInsert" parameterType="list" >
insert into public_cloud_customer
(
cid,
customer_name,
industry_area_line,
tl_group,
customer_tam,
customer_cbm,
customer_gc_level,
gmt_create,
gmt_modified,
is_valid
)
values
<foreach collection="list" item="i" separator=",">
(#{i.cid},#{i.customerName},#{i.industryAreaLine},#{i.tlGroup},#{i.customerTam},
#{i.customerCbm},#{i.customerGcLevel},#{i.gmtCreate},#{i.gmtModified},#{i.isValid})
</foreach>
</insert>
</mapper>
public interface PublicCloudCustomerApiMapper {
int batchUpdate(@Param("list")List<PublicCloudCustomerBean> toCustomerList);
int batchInsert(@Param("list")List<PublicCloudCustomerBean> toCustomerList);
}
二、自定义mapper:很简单。
仿照生成的即可。
自定义sql语句。
自定义mapper,防止出现:自己写的sql如果写在了生成的mapper.xml时,
加字段,重新生成selectByExample这种配置时,导致自己写的sql丢失。
简单单表api生成的,不用写sql。减少错误。
多表api的sql,自己写sql,写到自定义mapper里。