淘先锋技术网

首页 1 2 3 4 5 6 7

本文系转载

更新单条记录

UPDATE course SET name = 'course1' WHERE id = 'id1';

更新多条记录的同一个字段为同一个值

UPDATE course SET name = 'course1' WHERE id in ('id1', 'id2', 'id3);    

更新多条记录为多个字段为不同的值
比较普通的写法,是通过循环,依次执行update语句。
Mybatis写法如下:

<update id="updateBatch"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update course
        <set>
            name=${item.name}
        </set>
        where id = ${item.id}
    </foreach>      
</update>

一条记录update一次,性能比较差,容易造成阻塞。
MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。

UPDATE course
    SET name = CASE id 
        WHEN 1 THEN 'name1'
        WHEN 2 THEN 'name2'
        WHEN 3 THEN 'name3'
    END, 
    title = CASE id 
        WHEN 1 THEN 'New Title 1'
        WHEN 2 THEN 'New Title 2'
        WHEN 3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)

这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;依此类推。
在Mybatis中的配置则如下:
mybatis在 MySQL 中 单条件多值的批量更新

<update id="updateBatch" parameterType="list">
            update course
            <trim prefix="set" suffixOverrides=",">
             <trim prefix="peopleId =case" suffix="end,">
                 <foreach collection="list" item="i" index="index">
                         <if test="i.peopleId!=null">
                          when id=#{i.id} then #{i.peopleId}
                         </if>
                 </foreach>
              </trim>
                    <trim prefix="unitsid =case" suffix="end," >
                  <foreach collection="list" item="i" index="index">
                          <if test="i.unitsid!=null">
                           when id=#{i.id} then #{i.unitsid}
                          </if>
                  </foreach>
           </trim>
             </trim>
            where
            <foreach collection="list" separator="or" item="i" index="index" >
              id=#{i.id}
          </foreach>
</update>

注:

MyBatis的foreach语句详解
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:

    <select id="dynamicForeachTest" resultType="Blog">  
        select * from t_blog where id in  
        <foreach collection="list" index="index" item="item" open="(" separator="," close=")">  
            #{item}  
        </foreach>  
    </select>  

上述collection的值为list,对应的Mapper是这样的

public List<Blog> dynamicForeachTest(List<Integer> ids);  

测试代码:

    @Test  
    public void dynamicForeachTest() {  
        SqlSession session = Util.getSqlSessionFactory().openSession();  
        BlogMapper blogMapper = session.getMapper(BlogMapper.class);  
        List<Integer> ids = new ArrayList<Integer>();  
        ids.add(1);  
        ids.add(3);  
        ids.add(6);  
        List<Blog> blogs = blogMapper.dynamicForeachTest(ids);  
        for (Blog blog : blogs)  
            System.out.println(blog);  
        session.close();  
    }  

===============================
个人 觉得这个最实用

这个是 mybatis在 MySQL 中 多条件多值的批量更新

<update id="updateTreeListAreaData" parameterType="java.util.List">
    	update data_area_cate
        <trim prefix="set" suffixOverrides=",">
    	    pub_validly = 
    	    <foreach collection="list" item="item" open="case " close=" end,">
    		when area_code = #{item.areaCode} AND cate_id = #{item.cateId} then #{item.pubValidly}
    	    </foreach>
             pub_modi_person = 
    	    <foreach collection="list" item="item" open="case " close=" end,">
    		when area_code = #{item.areaCode} AND cate_id = #{item.cateId} then #{item.pubModiPerson}
    	    </foreach>
         pub_modi_date = 
    	    <foreach collection="list" item="item" open="case " close=" end,">
    		when area_code = #{item.areaCode} AND cate_id = #{item.cateId} then #{item.pubModiDate}
    	    </foreach>
        </trim>
    	<where>
    		<foreach collection="list" item="item" open="( " separator=") or (" close=" )">
    		area_code = #{item.areaCode} AND cate_id = #{item.cateId}
    	</foreach>
    	</where>
    </update>

如果上面的批量跟新错误,就是这里出问题了。
当你更新一条时,不会发生问题,但是执行多条就出现了错误
he error occurred while setting parameters
改正
原因是mysql 配置jdbc:driver 应该添加&allowMultiQueries=true

url:jdbc:mysql://localhost:3306/mei?characterEncoding=utf8&allowMultiQueries=true