MyBatis 动态SQL
简介
动态 SQL是MyBatis强大特性之一。极大的简化我们拼装SQL的操作动态 。SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似
应用
if/where/trim
prefix:在操作的SQL语句前加入某些内容
suffix:在操作的SQL语句后加入某些内容
prefixOverrides:把操作的SQL语句前的某些内容去掉
suffixOverrides:把操作的SQL语句后的某些内容去掉
<select id="getEmpsListByMoreTJ" resultType="<u>Emp</u>">
??????????select <u>eid</u>,<u>ename</u>,age,sex,did from <u>emp</u>
??????????where 1=1
??????????<if test="<u>eid</u> != null">
??????????????and <u>eid</u> = #{<u>eid</u>}
??????????</if>
??????????<if test="<u>ename</u> != null and <u>ename</u> != ‘‘">
??????????????and <u>ename</u> = #{<u>ename</u>}
??????????</if>
??????????<if test="age != null">
??????????????and age = #{age}
??????????</if>
??????????<if test="sex == ‘男‘ or sex == ‘女‘">
??????????????and sex = #{sex}
??????????</if>
?????</select>
<select id="getEmpsListByMoreTJ" resultType="Emp">
??????????<!-- select <u>eid</u>,<u>ename</u>,age,sex,did from <u>emp</u> -->
??????????<include refid="empColumns"></include>
??????????<trim prefix="where" suffixOverrides="and|or">
??????????????<if test="eid != null">
???????????????????<u>eid</u> = #{<u>eid</u>} and
??????????????</if>
??????????????<if test="ename != null and ename != ‘‘">
???????????????????<u>ename</u> = #{<u>ename</u>} and
??????????????</if>
??????????????<if test="age != null">
???????????????????age = #{age} or
??????????????</if>
??????????????<if test="sex == 1 or sex == 0">
???????????????????sex = #{sex}
??????????????</if>
??????????</trim>
?????</select>
choose
<select id="getEmpsListByChoose" resultType="Emp">
??????????select <u>eid</u>,<u>ename</u>,age,sex from <u>emp</u>
??????????where
??????????<choose>
??????????????<when test="eid != null">
???????????????????<u>eid</u> = #{<u>eid</u>}
??????????????</when>
??????????????<when test="ename != null and ename != ‘‘">
???????????????????<u>ename</u> = #{<u>ename</u>}
??????????????</when>
??????????????<when test="age != null">
???????????????????age = #{age}
??????????????</when>
??????????????<otherwise>
???????????????????sex = #{sex}
??????????????</otherwise>
??????????</choose>
?????</select>
foreach
对一个数组或集合进行遍历
collection:指定要遍历的集合或数组
item:设置别名
close:设置循环体的结束内容
open:设置循环体的开始内容
separator:设置每一次循环之间的分隔符
index:若遍历的是list,index代表下标;若遍历的是map,index代表键
<delete id="deleteByList">
??????????delete from <u>emp</u> where <u>eid</u> in
??????????<foreach collection="list" item="eid"
separator="," open="(" close=")">
??????????????#{<u>eid</u>}
??????????</foreach>
?????</delete>
set
主要是用于解决修改操作中SQL语句中可能多出逗号的问题
<update id="updateEmpByConditionSet">
???????????????????update? tbl_employee?
???????????????????<set>
????????????????????????????<if test="lastName!=null && lastName!=""">
????????????????????????????????????? last_name = #{lastName},
????????????????????????????</if>
????????????????????????????<if test="email!=null and email.trim()!=‘‘">
????????????????????????????????????? email = #{email} ,
????????????????????????????</if>
????????????????????????????<if test=""m".equals(gender) or "f".equals(gender)">
?????????????????????????????????????gender = #{gender}
????????????????????????????</if>
???????????????????</set>
??????????????????? where id =#{id}
?????????</update>
设置公共sql
<include refid="empColumns">:访问某个SQL片段
<sql id="empColumns">select <u>eid</u>,<u>ename</u>,age,sex,did from
<u>emp</u> </sql>
?????<select id="getEmpByEid"
resultType="com.atguigu.bean.Emp">
??????????<include refid="empColumns"></include> where <u>eid</u>
= #{<u>eid</u>}
?????</select>