myBatis动态sql

myBatis动态sql中

1.基础OGNL表达式

使用规则:

  • 运算符 + - * / %
  • or and eq neq lt lte gt gte in not in

  • 构造一个对象 new java.util.ArrayList()
  • 对象的属性的访问: 对象名.属性名
  • 成员方法的调用: 对象名.方法()
  • 静态方法/变量 的调用: @包名.类名@方法() @包名.类名@变量
    • @java.lang.Math@PI @java.util.UUID@randomUUID()

  • 集合的伪属性
    • Map, List & Set
      • size: The size of the collection
      • isEmpty: Evaluates to true if the collection is empty
    • list、set
      • iterator: Evalutes to an Iterator over the List.
    • Map
      • keys: Evalutes to a Set of all keys in the Map
      • values: Evaluates to a Collection of all values in the Map
    • Iterator
      • next: Evalutes to the next object from the Iterator
      • hasNext: Evaluates to true if there is a next object available from the Iterator
    • Enumeration
      • next: Evalutes to the next object from the Enumeration
      • hasNext: Evaluates to true if there is a next object available from the Enumeration
      • nextElement: Synonym for next
      • hasMoreElements: Synonym for hasNext

2.if标签

用于判断
if标签中test属性是必须的,作为判断条件,因为我设置的传递进来的参数是Map,所以在test条件时可以直接使用Key值传递
List<Employee> getByMap(Map<String,Object> map);

    <select id="getByMap" resultType="employee">
        select * from private.employee where 1=1
        <if test="id!=null">
            and id=#{id}
        </if>
    </select>

3. where标签

用于去除sql语句后面的不必要的and
上面if标签的查询限制条件是必须在前面加where 1=1来保证当条件不传递时语句的完整性,而where标签可以解决这样的问题

    <select id="getByMap" resultType="employee">
        select * from private.employee
        <where>
            <if test="id!=null">
                and id=#{id}
            </if>
        </where>
    </select>

发送的sql语句对比:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3. set标签

用于去除sql语句后面不必要的,
针对修改时,当最后一项参数传递完,需要在最后加id=#{id}来防止前面的逗号造成语句错误

    <update id="getByMap" parameterType="employee">
        update private.employee set 
            <if test="id!=null">
               id=#{id},
            </if>
            <if test="name!=null">
               name=#{name},
            </if>
            id=#{id}
            where id=#{id}
    </update>

修改为:

    <update id="getByMap" parameterType="employee">
    
        update private.employee set 
        <set>
            <if test="id!=null">
               id=#{id},
            </if>
            <if test="name!=null">
               name=#{name},
            </if>
       	</set>
            where id=#{id}
    </update>

但是当条件都不传递时,会造成语句错误,所以要防止错误,需要在前面加条件保持语句完整

    <update id="getByMap" parameterType="employee">
    
        update private.employee set 
        <set>
         	id=#{id},
            <if test="id!=null">
               id=#{id},
            </if>
            <if test="name!=null">
               name=#{name},
            </if>
       	</set>
            where id=#{id}
    </update>

4.trim标签

用于整合where和set标签,可以指定语句前面增加的内容
和去除语句最前面和最后的符号和字符

    <select id="getByMap" resultType="employee">
        select * from private.employee
        <trim prefix="where" suffixOverrides="and | or">
            <if test="id!=null">
                 id=#{id} or
            </if>
            <if test="name!=null">
                name=#{name} and
            </if>
        </trim>
    </select>

prefix 用于在语句前面增加字段,suffixOverrides用于删除语句后面的字段

5.choose标签

选择特定的条件
根据子标签when进行选择,当第一个条件成立时就直接返回第一个条件的值,否则往后进行判断

    <select id="getByMap" resultType="employee">
        select * from private.employee
        <where>
            <choose>
                <when test="name !=null">
                    name like #{name}
                </when>
                <when test="id !=null">
                    id = #{id}
                </when>
            </choose>
        </where>
	</select>

6. foreach标签

用于遍历循环

    <select id="getByList" resultType="employee">
        select * from private.employee
        <if test="list != null">
	        <foreach collection="list" item="i" open="where id in (" close=")" separator=",">
	            #{i}
	        </foreach>
        </if>
    </select>

传递的参数列表不能为空

  • collection表示传递进来的参数类型,
  • item表示定义的变量名,
  • open表示已什么开始,
  • close表示以什么结束,
  • separator表示传递时各个item变量之间的分隔符

7. bind标签

用来将一个变量进行预处理,例如给一个字符前后拼接%
<bind name ="likeName" value = " '%' +name+'%' "></bind>,后面就可以使用likeName变量进行语句查询

    <select id="getByName" resultType="employee">
        <bind name="likeName" value="'%'+name+'%'"></bind>
        select * from private.employee
        where name like #{likeName}
    </select>

8.sql标签

用于公共信息的分离提取

    <sql id="abc">
        *
    </sql>
    <select id="getByList" resultType="employee">

        select <include refid="abc"/> from private.employee
        <foreach collection="list" item="i" open="where id in (" close=")" separator=",">
            #{i}
        </foreach>
    </select>

将常用的信息提取到sql标签中,然后使用时用include标签引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值