标签:当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>