方法一:
@Mapper
public interface LogMapper {
/**
* 批量插入多条记录
* @param ipMapList ipmap列表
* @return 成功插入的条数
*/
@Insert({
"<script>",
"insert into log_ip(ip, address) values ",
// collection 和 value对应 item代表循环中List的这一项IpMap
"<foreach collection='ipMapList' item='item' index='index' separator=','>",
"(#{item.ip}, #{item.address})",
"</foreach>",
"</script>"
})
int addIpMapBatch(@Param(value="ipMapList") List<IpMap> ipMapList);
}
感觉容易理解 ,但是字符串+标签的拼接感觉非常不优雅…
方法二:
@Mapper
public interface LogMapper {
/**
* 批量插入多条记录
* @param ipMapList
* @return
*/
@InsertProvider(type = LogMapperProvider.class, method = "insertIpMapBatch")
int addIpMapBatch1(@Param(value="ipMapList") List<IpMap> ipMapList);
}
LogMapperProvider.class:
public class LogMapperProvider {
public String insertIpMapBatch(Map map) {
// 参数必须得用map
List<IpMap> ipMaps = (List<IpMap>) map.get("ipMapList");
StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO log_ip ");
sb.append("(ip, address) ");
sb.append("VALUES ");
// ipMapList 改成自己的
MessageFormat mf = new MessageFormat("( #'{'ipMapList[{0}].ip}, #'{'ipMapList[{0}].address})");
for (int i = 0; i < ipMaps.size(); i++) {
sb.append(mf.format(new Object[]{i}));
if (i < ipMaps.size() - 1) {
sb.append(",");
}
}
return sb.toString();
}
}
@InsertProvider是通过SQL工厂类及对应的方法生产SQL语句