主要关键词

• if:判断
• choose (when, otherwise):分支选择;带了break的swtich-case
	如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个
• trim 字符串截取(where(封装查询条件), set(封装修改条件))
• foreach 遍历集合

IF

//mapper方法
<!-- 查询员工,要求,携带了哪个字段查询条件就带上这个字段的值 -->
public List<Employee> getEmpsByConditionIf(Employee employee);

//映射文件
<select id="getEmpsByConditionIf" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee
      <!-- where -->
      <where>
	<!-- test:判断表达式(OGNL)OGNL参照PPT或者官方文档。c:if  test
	           从参数中取值进行判断  遇见特殊符号应该去写转义字符:&&:-->
	<if test="id!=null">
	      id=#{id}
	</if>
	<if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
	      and last_name like #{lastName}
	</if>
	<if test="email!=null and email.trim()!=&quot;&quot;">
	      and email=#{email}
	</if> 
	<!-- ognl会进行字符串与数字的转换判断  "0"==0 -->
	<if test="gender==0 or gender==1">
		and gender=#{gender}
	</if>
      </where>
</select>
注:对于where条件,因为考虑到 and 存在的问题,因此有些公司会在前面加 1=1 来进行拼接。
   MyBatis对给我们提供了 <where> 标签,可以自动识别, and 必须放在前面,这样才不会出错

后面多出的and或者or where标签不能解决:
<select id="getEmpsByConditionTrim" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee
<!-- prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
                    prefix给拼串后的整个字符串加一个前缀 
prefixOverrides="":
		前缀覆盖:去掉整个字符串前面多余的字符
suffix="":后缀
		suffix给拼串后的整个字符串加一个后缀 
suffixOverrides=""
		后缀覆盖:去掉整个字符串后面多余的字符-->
	<!-- 自定义字符串的截取规则 -->
	<trim prefix="where" suffixOverrides="and">
	   <if test="id!=null">
	      id=#{id} and
	   </if>
	   <if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
	      last_name like #{lastName} and
	   </if>
	   <if test="email!=null and email.trim()!=&quot;&quot;">
	      email=#{email} and
           </if> 
	   <!-- ognl会进行字符串与数字的转换判断  "0"==0 -->
	   <if test="gender==0 or gender==1">
	      gender=#{gender}
	   </if>
       </trim>
</select>

CHOOSE

<select id="getEmpsByConditionChoose" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee 
<where>
      <!-- 如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个 -->
      <choose>
	<when test="id!=null">
	      id=#{id}
	</when>
	<when test="lastName!=null">
	      last_name like #{lastName}
	</when>
	<otherwise>
	      gender = 0
	</otherwise>
      </choose>
</where>
</select>

TRIM

update tbl_employee 
<trim prefix="set" suffixOverrides=",">
	<if test="lastName!=null">
		last_name=#{lastName},
	</if>
	<if test="email!=null">
		email=#{email},
	</if>
	<if test="gender!=null">
		gender=#{gender}
	</if>
</trim>
where id=#{id}

SET

<update id="updateEmp">
<!-- Set标签的使用 -->
update tbl_employee 
<set>
      <if test="lastName!=null">
      	last_name=#{lastName},
      </if>
      <if test="email!=null">
      	email=#{email},
      </if>
      <if test="gender!=null">
      	gender=#{gender}
      </if>
</set>
where id=#{id} 

foreach

动态SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建IN 条件语句的时候。
<foreach collection="ids" item="item_id" separator=","open="where id in(" close=")">
      #{item_id}
</foreach>

foreach

bind 元素可以从OGNL 表达式中创建一个变量并将其绑定到上下文
<select id="getEmpsTestInnerParameter" resultType="com.atguigu.mybatis.bean.Employee">
      <!-- bind:可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值 -->
      <bind name="_lastName" value="'%'+lastName+'%'"/>
      <if test="_databaseId=='mysql'">
            select * from tbl_employee
            <if test="_parameter!=null">
                  where last_name like #{lastName}
            </if>
      </if>
</select>
posted on 2020-11-30 13:08  LeavesCai7  阅读(75)  评论(0)    收藏  举报