mybatis补充:批量insert ,批量update,批量delete,(foreach实现)以及标签以及sql的case-switch-then语句

标签:当where里面的条件出现null造成的查询失败后会自动修改去掉and或者or,还会选择执不执行where语句,和一样,用于去掉多余的逗号。
可参考
标签同理:
当 update 语句中没有使用 if 标签时,如果有一个参数为 null,都会导致错误。

当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值。set 标签元素主要是用在更新操作的时候,它的主要功能和 where 标签元素其实是差不多的,主要是在包含的语句前输出一个 set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果 set 包含的内容为空的话则会出错。有了 set 元素就可以动态的更新那些修改了的字段
参考

sql的case-switch-then语句

直接上代码
–sql中类似switch case语句的用法

     select getdate()as 日期,
             case month(getdate())   
             when 11 then '十一'   
             when 12 then '十二'   
             else substring('一二三四五六七八九十',month(getdate()),1)   
             end +'月' as 月份
             --在一般SELECT中的应用:CASE 的典型用法
SELECT a.ReturnTkRate_DisCountRate, 
    'Range' = 
    CASE 
       when a.ReturnTkRate_StaHoursInterval>0 then '正数'
       when a.ReturnTkRate_StaHoursInterval<0 then '负数'
       else '0' 
    END 
FROM BaseInfo.ReturnTkRate a

说白了就是意思是case是一个变量,当他等于when后面条件成立就等于then后面的值,else是除了前面的所有情况得到的,要加end才可以正常结束
批量更新
注意:这种方法必须在配置连接数据库url后面带一个参数 &allowMultiQueries=true,表示允许批量操作,例 jdbc:mysql://localhost:3306/mysqlTest?characterEncoding=utf-8&allowMultiQueries=true
第一种:使用标签:把update语句也嵌套在里面
接口:

 /**
     * 批量更新新库存
     * @param list
     * @return
     */
    int updateNewStock(@Param(value = "list") List<GreenBeanMsg> list);

Mapper.xml

<update id="updateNewStock" parameterType="java.util.List">
        <foreach collection="list" item="bean" index="index" open="" close="" separator=";">
            UPDATE green_beans
            <set>
                stock=#{bean.stock}
            </set>
            <where>
                beanUid = #{bean.beanUid}
            </where>
        </foreach>
    </update>

第二种:使用case-when-then-end语句参考

<update id="updateBatch" parameterType="java.util.List">
        update mydata_table
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="status =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                     when id=#{item.id} then #{item.status}
                </foreach>
            </trim>
        </trim>
        where id in
        <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
            #{item.id,jdbcType=BIGINT}
        </foreach>
    </update>

批量更新:+判断
mappper接口

 int addEmpsBatch(@Param("emps") List<Employee> emps); -->

Mapper.xml文件

<insert id="addEmpsBatch">
  INSERT INTO emp(ename,gender,email,did)
  VALUES
  <foreach collection="emps" item="emp" separator=",">
  (#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
  </foreach>
 </insert>

批量删除:
Mapper接口

/**
	 * 批量删除
	 * 
	 * @param arr
	 * @return
	 */
	public boolean doRemoveeMore(int[] arr);

mapper.xml文件

<!-- 批量删除 -->
	<delete id="deleteMoreEmp" parameterType="int[]">
		<!-- delete from emp where empno in(7789,7790) -->
		<!-- forEach : 用来循环 collection : 用来指定循环的数据的类型 可以填的值有:array,list,map item 
			: 循环中为每个循环的数据指定一个别名 index : 循环中循环的下标 open : 开始 close : 结束 separator : 数组中元素之间的分隔符 -->
		delete from emp where empno in
		<foreach collection="array" item="arr" index="no" open="("
			separator="," close=")">
			#{arr}
		</foreach>
	</delete>

foreach和in一起用实现select查询

参数list里面可以是一个实体类,和批量插入一样的用法,item.。。。

public List<Blog> dynamicForeachTest(List<Integer> ids);  
<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>


版权声明:本文为weixin_42765975原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。