mybatis4:动态sql

一.动态sql

1.整体框架

在这里插入图片描述

2.动态sql解决问题

  • 例子:
    出现一个选项框,选择里面的条件来进行sql查询结果的过滤,我们需要动态调整sql语句
  • 帮助拼接sql
  • 出现问题:判断接受的数据是什么?
    可能是null:即最开始并未获取到数据参数
    可能是空字符串:即提交但是并未选择任何条件
  • 由服务器判断是否来拼接条件到where后

3.具体语句

①if标签

  • test属性可以判断是否成立从而是否加入文本内容到sql语句
  • 细节注意:
    where后需要增加1=1 否则可能出现where后没有值的情况
    test为true的内容需要增加and 否则出现无连接符的情况
<!--List<Emp> getEmpListByCondition(Emp emp);-->
<select id="getEmpListByMoreTJ" resultType="Emp">
select * from t_emp where 1=1
<if test="ename != '' and ename != null">
and ename = #{ename}
</if>
<if test="age != '' and age != null">
and age = #{age}
</if>
<if test="sex != '' and sex != null">
and sex = #{sex}
</if>
</select>

②where标签

  • where帮助解决if中的难题(where标签内添加if)
  • where特性:
    如果where里面的条件都不成立,则也不会有where
    如果where里的条件有成立,则会添加where标签
    如果添加了where标签后最前面有多余的and,where自动去除(无法去除后面的and)
<select id="getEmpListByMoreTJ2" resultType="Emp">
select * from t_emp
<where>
<if test="ename != '' and ename != null">
ename = #{ename}
</if>
<if test="age != '' and age != null">
and age = #{age}
</if>
<if test="sex != '' and sex != null">
and sex = #{sex}
</if>
</where>
</select>

③trim标签

  • 对where标签的出现和and标签出现的控制
  • trim标签的属性
    prefix:在trim标签中的内容的前面添加某些内容
    prefixOverrides:在trim标签中的内容的前面去掉某些内容
    suffix:在trim标签中的内容的后面添加某些内容
    suffixOverrides:在trim标签中的内容的后面去掉某些内容
<select id="getEmpListByMoreTJ" resultType="Emp">
select * from t_emp
<trim prefix="where" suffixOverrides="and">
<if test="ename != '' and ename != null">
ename = #{ename} and
</if>
<if test="age != '' and age != null">
age = #{age} and
</if>
<if test="sex != '' and sex != null">
sex = #{sex}
</if>
</trim>
</select>

④choose、when、otherwise解决选择单个条件

  • 即choose内部只会有一个条件被添加则where后面(满足则跳出)
<!--List<Emp> getEmpListByChoose(Emp emp);-->
<select id="getEmpListByChoose" resultType="Emp">
select <include refid="empColumns"></include> from t_emp
<where>
<choose>
<when test="ename != '' and ename != null">
ename = #{ename}
</when>
<when test="age != '' and age != null">
age = #{age}
</when>
<when test="sex != '' and sex != null">
sex = #{sex}
</when>
<when test="email != '' and email != null">
email = #{email}
</when>
</choose>
</where>
</select>

⑤foreach标签(用于批量添加和批量删除)

  • collections属性 可以是数组或列表
    注意:此时最好加入@param 否则数组和列表都会放入map中,不清楚其键名为什么
  • item属性 为得到的数组或列表中的元素
  • separater:分割符以什么分开
  • 注意区分总体括号还是单条数据括号
<!--int insertMoreEmp(List<Emp> emps);-->
<insert id="insertMoreEmp">
insert into t_emp values
<foreach collection="emps" item="emp" separator=",">
(null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)
</foreach>
</insert>
<!--int deleteMoreByArray(int[] eids);-->
<delete id="deleteMoreByArray">
delete from t_emp where
<foreach collection="eids" item="eid" separator="or">
eid = #{eid}
</foreach>
</delete>
<!--int deleteMoreByArray(int[] eids);-->
<delete id="deleteMoreByArray">
delete from t_emp where eid in
<foreach collection="eids" item="eid" separator="," open="(" close=")">
#{eid}
</foreach>
</delete>

⑥sql片段(解决某些字段用次数过多)

<sql id="empColumns">
eid,ename,age,sex,did
</sql>
select <include refid="empColumns"></include> from t_emp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值