MyBatis批量更新
操作oracle
XML文档中,update标签中的语句使用了标签$和#来传递参数。通常前者用来传递数据库对象,如字段名、表名;后者传递参数值。
#方式能够很大程度防止sql注入。
<?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
<update id="updateCoordinatesByTableAndId" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
UPDATE ${item.table_name} t
<set>
t.AMAP_LAT = #{item.lat},
t.AMAP_LON = #{item.lon}
</set>
WHERE t.id = #{item.id}
</foreach>
</update>
</mapper>
其中批量更新的参数通过List传递,List元素为Map对象,对象中的Key-Value对和上述XML文档中的保持一致,如下:
package com.autonavi.method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.autonavi.domain.Coordinate;
import com.autonavi.service.impl.DataUpdateServiceImpl;
public class DataUpdate {
public static Integer update(List<Coordinate> list){
List<Map<String,String>> listmap = new ArrayList<Map<String,String>>();
for(Coordinate coor : list){
Map<String,String> map = new HashMap<String,String>();
map.put("table_name", coor.getName());
map.put("lon", coor.getLon()+"");
map.put("lat", coor.getLat()+"");
map.put("id", coor.getId()+"");
//System.out.println("table_name:"+coor.getName());
listmap.add(map);
}
Integer counts = new DataUpdateServiceImpl().updateDataByPara(listmap);
return counts;
}
}
MyBatis默认批量更新成功,返回结果counts=-1, 而不是返回更新的纪录条数。