1.什么是动态sql?
动态sql是MyBatis特性之一,可以根据用户传入的条件,
借助xml标签对sql语句进行拼接,生成符合条件的sql语句.
sql映射文件:多个sql映射文件之间,namespace名称不能相同
2.动态sql语句的用法
2.1分支结构
<if test = " "> </if>
test中内容为true,拼接上标签sql语句,为false不拼接
<choose>
<when test = " "></when>
<otherwise></otherwise>
</choose>
<!-- 查询员工信息 -->
<mapper namespace = com.zhou.model.Emp>
<!-- 如果传入了部门编号,就查询该部门下所有员工信息
如果没有传入部门编号,就查询所有员工信息-->
<select id = "queryEmps" parameterType="emp" resultType="emp">
select * from emp
<!--有判断有没有部门编号-->
<if test = "deptno != 0">
where deptno = #{deptno}
</if>
</select>
<!-- 根据薪资查询员工
如果传入了薪资,就查询大于此薪资的员工信息
如果没有传入薪资,查询薪资大于6000的员工信息 -->
<select id = "queryEmpsBySalary" parameterType="emp" resultType="emp">
select * from emp where salary >
<!--如果传入薪资-->
<if test="salary != 0">
#{salary}
</if>
<!--如果没有传入薪资-->
<if test="salary == 0">
6000
</if>
</select>
<!-- 根据性别查询员工信息
如果传入了性别,就查询此性别的员工
如果没有传入性别,就查询所有男性员工-->
<select id="selectEmpBySex" parameterType="emp" resultType="emp">
select * from emp where sex =
<!--判断有没有传入性别-->
<choose>
<!--如果传入性别-->
<when test="sex" != null>
#{sex}
</when>
<!--如果没有传入性别-->
<otherwise>'男'</otherwise>
</choose>
</select>
</mapper>
2.2关键字标签
where关键字
(1)充当sql语句中一个where关键字
(2)去掉sql语句拼接完成之后多余的and or关键字
<mapper namespace = com.zhou.model.Emp>
<!-- 根据job和salary两个条件查询员工信息
如果只传入了job,则查询该职位的员工信息
如果只传入了salary,则查询薪水大于此salary的员工信息
如果两个条件都传入,就查询该职位下薪资大于此salary的员工信息
如果两个条件都没有传入,就查询所有的员工信息-->
<select id="queryEmpBySalaryAndJob" parameterType="emp" resultType="emp">
select * from emp
<where>
<if test="job != null">
and job = #{job}
</if>
<if test="salary != 0">
and salary > #{salary}
</if>
</where>
</select>
</mapper>
set关键字
(1)充当sql语句中一个set关键字
(2)去掉拼接完sql语句后多余的逗号
<mapper namespace = com.zhou.model.Emp>
<!-- 修改emp员工信息,判断传入了几项数据,传入了几项数据,就要去修改几项数据 -->
<update id="updateEmp" parameterType="emp">
update emp
<set>
<if test="name != null">
name=#{name},
</if>
<if test="sex != null">
sex = #{sex},
</if>
<if test="job != null">
job = #{job},
</if>
<if test="salary != null">
salary = #{salary},
</if>
<if test="hiredate != null">
hiredate = #{hiredate},
</if>
<if test="deptno != null">
deptno = #{deptno}
</if>
</set>
where id = #{id}
</update>
</mapper>