目前碰到的业务场景是会一次收到一批数据,在java中使用List来接收
新增:
新增的时候如果循环去调用新增方法的话,会频繁的打开和关闭数据库连接,会增加数据库的负载,所以建议使用批量新增,但是Oracle批量新增和Mysql不同,不能使用INSERT INTO VALUES()。所以用这种方式可以实现批量新增。结合mybatis使用。
这样可以实现批量新增数据,
1:其中DUAL是Oracle中的一种特殊表,主要是用来实现一些特殊的查询需求。比如查询系统时间:
SELECT SYSDATE FROM DUAL。
2:foreach标签中,collection参数:主要是mapper接口中,此新增方法的list<>参数。比如:
3:foreach标签中:index参数,这个参数主要是用于获取当前迭代元素或者数组中索引的位置,作用是:对于当前元素在集合中的位置进行访问和操作。这个参数是可选参数,可选择不使用。
4:item参数:主要是用于指定循环过程中每个元素的名称或者是引用,表示的是集合或者数组中每个元素在循环的时候被赋予的名称,这个参数的内容可以根据自己的需求定义名称。
修改:
对于一批数据,在Oracle中需要批量更新的时候:
如果是Mysql 数据库的话,结合Mybatis的时候,应该是这么写的
<update id="batchUpdate" parameterType="java.util.List">
<foreach collection="list" item="item" separator=";">
UPDATE your_table
SET column1 = #{item.column1},
column2 = #{item.column2},
column3 = #{item.column3}
WHERE id = #{item.id}
</foreach>
</update>
但是在Oracle中,语法是不支持这样更新多条记录的,所以可以使用这种替代方案
MERGE INTO YOURTABLE yo
USING (
<foreach collection="ListParamName" item="item" separator="UNION ALL" index="index">
SELECT
#{item.yourcolumn1} AS column1,
#{item.yourcolumn2} AS column2,
#{item.yourcolumn3} AS column3,
#{item.yourcolumn4} AS column4
FROM DUAL
</foreach>
)src
ON (yo."column_name" = src.column1)
WHEN MATCHED THEN
UPDATE SET "column2" = src.column2,"column3" = src.column3,"column4" = src.column4;
1:MERGE INTO:主要是指定了将要更新的数据合并到的目标表中,yourtable就是自己的表名,
2:USING (...) src:是用来只能制指定了用于合并的数据源,其中的foreach是查询了list中所有的数据,
3:ON (yo."column_name" = src.column1):指定了合并的添加,就是根据这个字段去修改一条记录的值。
4:WHEN MATCHED THEN UPDATE SET:指定了源数据和目标数据匹配到了的话要执行什么操作,这里指定是更新数据操作,
通过这种方式就可以实现在Oracle中批量的更新数据。这样就可以避免频繁的去打开和释放数据库连接,造成性能损失。