mybatis-动态SQL
随着用户输入或外部条件的变化而变化的SQL语句, 我们称之为动态SQL.
一. <if>标签
根据三个信息来查询员工, 如果我们只想通过其中一个信息(只填写一个信息在代码中其他信息为null)来查询是无法查询出来的, 促使就要用到动态SQL中的<if>.
修改后因为从第二个条件开始每个条件的开头都使用and连接 如果前面的不成立 在生成代码时就会在where和条件之间多出一个and导致不能正常运行此时可以用<where></where>标签代替包裹条件体
<where>标签, 只要有一个条件成立它就会自动在运行时生成where,并且会去除掉影响运行的and
案例: 动态更新员工信息
<!-- 动态更新员工信息-->
<update id="update">
update mybatis.emp
set
<if test="username != null">username =#{username},</if>
<if test="name != null">name = #{name},</if>
<if test="gender != null">gender = #{gender},</if>
<if test="image != null">image = #{image},</if>
<if test="job != null">job = #{job},</if>
<if test="entrydate != null">entrydate = #{entrydate},</if>
<if test="dept_id != null">dept_id = #{deptId},</if>
<if test="update_time != null">update_time = #{updateTime}</if>
where id = #{id}
</update>
但是如果后面的信息为null在生成代码时前一条最后会有一个" , "导致语法出错,此时就要用到<set>
<!-- 动态更新员工信息-->
<update id="update">
update mybatis.emp
<set>
<if test="username != null">username =#{username},</if>
<if test="name != null">name = #{name},</if>
<if test="gender != null">gender = #{gender},</if>
<if test="image != null">image = #{image},</if>
<if test="job != null">job = #{job},</if>
<if test="entrydate != null">entrydate = #{entrydate},</if>
<if test="deptId != null">dept_id = #{deptId},</if>
<if test="updateTime != null">update_time = #{updateTime}</if>
</set>
where id = #{id}
</update>
二. <foreach>标签
<!-- 批量删除员工(13, 14, 15)-->
<!--
如果只删除一个数据指定id时可以直接 where id = #{id}
但是要想批量删除, 就不能这么写了, 要用遍历标签在运行时去生成代码
标签内的容结果参考(?, ?, ?)
collection: 遍历的集合
item: 遍历出来的元素
separator: 数据之间的分隔符
open: 遍历开始前拼接的SQL片段
close: 遍历结束后拼接的SQL片段
-->
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
三. <sql>&<include>标签
此代码标注内容重复如果要修改每个都要修改, 此时就可以用到 <sql>&<include>标签 至于这里为啥不用 * 直接代替所有元素是因为用 * 的性能比较低