动态SQL
MyBatis框架的动态SQL技术是一种根据特定条件动态拼接SQL语句的功能,它存在的意义是为了解决 拼接SQL语句字符串时的痛点问题
if
public interface DynamicSQLMapper {
List<Emp> getEmpByCondition(Emp emp);
}
<mapper namespace="com.bijing.mybatis.mapper.DynamicSQLMapper">
<!--
动态SQL:
1.if,通过test属性中的表达式判断标签中内容是否有效,(是否会拼接到SQL中)
-->
<!-- List<Emp> getEmpByCondition();-->
<select id="getEmpByCondition" resultType="Emp">
SELECT *
FROM t_emp
WHERE
<!-- 当下面条件都不成立会多了个where-->
<if test="empName!=null and empName!=''">
emp_name = #{empName}
</if>
<!-- 当第一个标签不成立时第二个标签中多了个and-->
<if test="age!=null and age!=''">
and age =#{age}
</if>
<if test="gender != null and gender !=''">
and gender = #{gender}
</if>
</select>
</mapper>
where
<select id="getEmpByCondition" resultType="Emp">
SELECT *
FROM t_emp
<where>
<!-- 2.where标签-->
<!-- a.若where标签中有条件成立会自动生成where关键字-->
<!-- b.会自动将where标签中内容 前 多余的and去掉,但是内容后如果有and不能去掉(所以and不加在后面不就ok了吗?)-->
<!-- c.若where标签中没有任何一个条件成立,则where没有任何功能-->
<if test="empName!=null and empName!=''">
emp_name = #{empName}
<!-- emp_name = #{empName} and -->
</if>
<!-- 当第一个和第三个条件不成立又会多了个and-->
<if test="age!=null and age!=''">
and age =#{age}
<!-- age =#{age} and -->
</if>
<if test="gender != null and gender !=''">
and gender = #{gender}
<!-- gender = #{gender} and -->
</if>
</where>
</select>
trim
- prefix,suffix:在标签中内容前或者后面添加指定内容
- prefixOverrides, suffixOverrides:在标签中内容前或者后面去掉指定内容
<select id="getEmpByCondition" resultType="Emp">
SELECT *
FROM t_emp
<trim prefix="where" suffixOverrides="and">
<if test="empName!=null and empName!=''">
<!-- emp_name = #{empName}-->
emp_name = #{empName} and
</if>
<!-- 当第一个和第三个条件不成立又会多了个and-->
<if test="age!=null and age!=''">
<!-- and age =#{age}-->
age =#{age} and
</if>
<if test="gender != null and gender !=''">
<!-- and gender = #{gender}-->
gender = #{gender} and
</if>
</trim>
</select>
choose、when、otherwise
- 相当于java中的if…else if…else
- when至少设置一个,otherwise最多设置一个,相当于else
<select id="getEmpByChoose" resultType="Emp">
SELECT *
FROM t_emp
<where>
<choose>
<when test="empName!=null and empName!=''">
emp_name = #{empName}
</when>
<when test="age !=null and age!=''">
age = ${age}
</when>
<when test="gender !=null and gender!=''">
gender = ${gender}
</when>
</choose>
</where>
</select>
foreach
- collection:设置要循环的数组或集合
- item:用一个字符串表示数组或集合中的每一个数据
- separator:设置每次循环的数据之间的分隔符
- open:循环的所有内容以什么开始
- close:循环的所有内容以什么结束
<!-- void insertMoreEmp(@Param("emps") List<Emp> emps);-->
<insert id="insertMoreEmp">
INSERT INTO t_emp
VALUES
<foreach collection="emps" item="emp" separator=",">
(null,#{emp.empName},#{emp.age},#{emp.gender},null)
</foreach>
</insert>
<!-- void deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
<delete id="deleteMoreEmp">
<!-- DELETE-->
<!-- FROM t_emp-->
<!-- WHERE emp_id IN-->
<!-- -- open以什么开始,close以什么结束,此时括号是在foreach外面的,括号在里面不能用-->
<!-- <foreach collection="empIds" item="empId" separator="," open="(" close=")">-->
<!-- #{empId}-->
<!-- </foreach>-->
DELETE FROM t_emp WHERE
<foreach collection="empIds" item="empId" separator="or">
emp_id = #{empId}
</foreach>
</delete>
SQL片段
可以记录一段sql,在需要用的地方用include标签进行引用
<sql id="empColumns">
emp_id,emp_name,age,gender,dept_id
</sql>
<select id="getEmpByCondition" resultType="Emp">
SELECT
<include refid="empColumns"></include>
FROM t_emp
<trim prefix="where" suffixOverrides="and">
<if test="empName!=null and empName!=''">
<!-- emp_name = #{empName}-->
emp_name = #{empName} and
</if>
<!-- 当第一个和第三个条件不成立又会多了个and-->
<if test="age!=null and age!=''">
<!-- and age =#{age}-->
age =#{age} and
</if>
<if test="gender != null and gender !=''">
<!-- and gender = #{gender}-->
gender = #{gender} and
</if>
</trim>
</select>