MyBatis 动态SQL

MyBatis 动态SQL

简介

动态 SQL是MyBatis强大特性之一。极大的简化我们拼装SQL的操作动态 。SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似

应用

if/where/trim

通过表达式拼接SQL
:添加where关键字,同时去掉多余and

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

:选择某一个when或otherwise拼接SQL
:通过test表达式拼接SQL
:当when都不符合条件,就会选择otherwise拼接SQL

<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 &amp;&amp; lastName!=&quot;&quot;">

????????????????????????????????????? last_name = #{lastName},

????????????????????????????</if>

????????????????????????????<if test="email!=null and email.trim()!=‘‘">

????????????????????????????????????? email = #{email} ,

????????????????????????????</if>

????????????????????????????<if test="&quot;m&quot;.equals(gender) or &quot;f&quot;.equals(gender)">

?????????????????????????????????????gender = #{gender} 

????????????????????????????</if>

???????????????????</set>

??????????????????? where id =#{id}

?????????</update>


设置公共sql

:设置一段SQL片段,即公共SQL,可以被当前映射文件中所有的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>


MyBatis 动态SQL

上一篇:JDBC的开发步骤


下一篇:【Mysql】双主双从同步配置