业务要求
批量插入时间价格表,如果某个套餐的某天的价格存在,则更新,不存在则插入
实现思路
oracle 9i
及其以后版本支持的merge into
语句,用于实现insertOrUpdate
的功能mybatis
的动态SQL
语法foreach
循环插入,待插入的实体bean
的List
通过查询数据库dual
形成表,通过foreach
的separator
属性设置每次循环的隔离词为union
连接每次形成的表为一个总表- 总表于条件匹配,符合条件update,不符合insert
- 更新的数据来源于
java.util.List
中的实体的属性
缺陷
采用union
拼接sql
,导致问题sql
过长,耗时,性能不好,且达到一定量会超出sql
长度限制,不推荐;
一般20
字段以内的表新增,数据2000
条以内可用,经过测试。
注意 union all
会把所有结果集拼接在一起,union
也会拼接所有结果,但会去除重复
mapper配置实现
1 | <insert id="merge" parameterType="java.util.List"> |