Mysql批量更新及插入(参数为Map)
来源:互联网 发布:深入理解nginx第二版 编辑:程序博客网 时间:2024/04/29 22:44
前言
这个问题困扰了整整一天。
当遇到多条记录需要插入或者更新的时候,往往会使用批量操作来提高效率,提高性能。然而在使用过程中确是出现了各种问题,真的是有些坑只有趟过才知道!!!
好了,话不多说,进入正题。
注:数据库Mysql 持久层框架 Mybatis
一、批量更新
需求如下代码:
Map<String,Object> ucmap = new HashMap<String, Object>();ucmap.put("updateUser","zyong");ucmap.put("updateTime", time);ucmap.put("list", updateClist);connectorInfoMapper.updateBatch(ucmap);
这里的需求是对设备的信息进行批量更新,利用Map来传参,Map中包含了一个List,这个List包含了需要更新的对象集合,也就是多条记录。
sql片段如下:
<update id="updateBatch" parameterType="java.util.Map"> <foreach collection="list" item="item" index="index" separator=";"> update connector_info set Connector_Type = #{item.connectorType,jdbcType=INTEGER}, Voltage_Upper_Limits = #{item.voltageUpperLimits,jdbcType=INTEGER}, Voltage_Lower_Limits = #{item.voltageLowerLimits,jdbcType=INTEGER}, Current = #{item.current,jdbcType=INTEGER}, Power = #{item.power,jdbcType=DOUBLE}, National_Standard = #{item.nationalStandard,jdbcType=INTEGER}, Update_User = #{updateUser,jdbcType=VARCHAR}, Update_Time = FROM_UNIXTIME(#{updateTime,jdbcType=TIMESTAMP}) where Connector_ID = #{item.connectorId,jdbcType=VARCHAR} </foreach> </update>
可以看到,这里使用了foreach标签进行迭代,item代表着每一个元素,item.power等代表的就是每个元素的属性,而没有加上item的参数如updateUser、updateTime等则是存放在Map中的参数,从需求代码中能看得更加明显。
当我检查了多遍后,感觉没问题之后,运行。
控制台的错误让我明白还是太年轻——报错了!!!仔细一看,是Sql语法错误,What?我把sql放入Navicat中美化,又检查了好几遍,这明明没有错啊!
于是开启了百度,各种查:
- 有的说把separator=";"中的分号换成——separator="UNION ALL",测试,还是报同样的错误。
- 将几个属于Map的字段删除再测试,依然报错
查了很多并没有什么实质性的进展,将多条数据改成一条数据进行更新,测试,竟然通过了!——原因很明显:批量操作的原因导致。
再百度,终于找到了答案:
并不是Sql的原因,而是数据库设置的原因————Mysql需要打开批量更新的设置。
需要在数据库JDBC链接中加入: &allowMultiQueries=true
如下:
jdbc.url=jdbc:mysql://139.224.35.81:3306/evshare?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
在添加了这个“开关”之后,成功批量更新多条数据。
二、批量插入
相比于批量更新,批量插入则没有类似的设置。
一个简单的示例Sql:
<insert id="insertBatch" parameterType="java.util.Map"> insert into connector_info (Equipment_Seq, Connector_ID, Connector_Type, Voltage_Upper_Limits, Voltage_Lower_Limits, Current, Power, National_Standard,Create_User,Create_Time,Update_Time) values <foreach collection="list" item="item" index="index" separator=","> (#{item.equipmentSeq,jdbcType=BIGINT}, #{item.connectorId,jdbcType=VARCHAR}, #{item.connectorType,jdbcType=INTEGER}, #{item.voltageUpperLimits,jdbcType=INTEGER}, #{item.voltageLowerLimits,jdbcType=INTEGER}, #{item.current,jdbcType=INTEGER}, #{item.power,jdbcType=DOUBLE}, #{item.nationalStandard,jdbcType=INTEGER}, #{createUser,jdbcType=VARCHAR}, FROM_UNIXTIME(#{createTime,jdbcType=TIMESTAMP}), FROM_UNIXTIME(#{updateTime,jdbcType=TIMESTAMP})) </foreach> </insert>
总结: 1. 有时候问题并不是出现在代码上,可以往系统环境和配置方面考虑。
2. 对于批量更新Mysql需要设置,而Oracle则不需要设置,但sql可能要变化
阅读全文
1 0
- Mysql批量更新及插入(参数为Map)
- mysql批量插入更新加参数rewriteBatchedStatements
- mysql批量插入,更新优化
- mysql,oracle批量插入,更新
- Mysql批量更新/插入数据
- mysql 批量插入和批量更新的
- MySql快速插入以及批量更新
- mysql批量插入,更新的sql语句
- 提高mysql 批量插入和更新性能
- mybatis(mysql)批量插入 更新 删除
- Mysql批量插入更新性能优化
- mysql批量插入更新去重
- C# 数据批量插入及更新
- Mybatis批量更新数据库与批量插入数据库(以oracle为例)
- c# 批量 插入转换为mysql日期
- mysql导入CSV文件及JAVA读取CSV文件和MYSQL批量插入和更新及ibatis常用SQL语句
- ibatis- 批量插入(对象转map)
- 带parameter参数的批量插入和更新
- MySQL 对于千万级的大表要怎么优化?
- FreeMarker对null值的处理
- Sublime Text3 教程
- 关于项目管理知识的几点概括
- 从CSS盒子模型说起
- Mysql批量更新及插入(参数为Map)
- rpcinfo
- json转义内容带有引号的数据
- 关于URL编码
- TextSwitcher与ViewSwitcher学习笔记
- 用Nginx+Lua实现高性能、高可靠、安全的登陆验证
- MySQL索引类型总结和使用技巧以及注意事项
- POJ 3299
- Python类和对象