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>