MyBatis动态SQL操作

本文详细介绍了MyBatis框架中的动态SQL特性,包括if、choose、where、set和trim等标记的应用,以及如何使用foreach进行循环查询和赋值。

在JDBC编程中,往往会去拼装sql语句,拼装的时候往往根据条件的不同,拼装成不同的sql语句。
MyBatis通过动态sql来实现这个过程,即动态生成sql,MyBatis是通过配置文件中的各种标记来实现的。

标记类型:

  • if、choose标记
  • where、set和trim标记
  • foreach标记

if、choose标记:条件判断和多重条件判断

<!--if标记-->
    <select id="selectReaderMoney" resultType="Reader" parameterType="Reader">
        select * from reader 
            where 1=1
            <if test="money!=null">
                and money>#{money}
            </if>
    </select>

<!-- where 1=1 本来可以去掉,这里是因为可能会有多个if造成and写与不写的问题,  加个1=1 方便拼装sql 是一种习惯-->    


    <!-- choose 多重条件判断-->
    <select id="selectUserChoose" resultType="User" parameterType="User">
        select * from User where 1=1
        <choose>
            <when test="name!=null">
                and name like #{name}
            </when>
            <when test="id!=0">
                and id =#{id}
            </when>

            <otherwise>
                and password is not null
            </otherwise>
        </choose>
    </select>

where、set和trim标记:

1. where标记=智能条件 用于Select操作

在if和choose中,我们会了方便拼装sql使之不会出错,特地加了一个看似没有意义的where 1 = 1,来让后面语句都 + and。
在这里,MyBatis提供了where标记,能够智能通过判断条件来决定是否把前缀的and 去掉,即如果上一个条件没有或者不成立,下一个sql句段前面的and就是自动删除

    <!--where-->
    <select id="selectUserWhere" resultType="User" parameterType="User">
        select * from User
        <where>
            <if test="name!=null">
                and name like #{name}
            </if>
            <if test="id!=null">
                and id =#{id}
            </if>
        </where>
    </select>

2. set=智能赋值 用于Update操作

与where类似,这里的智能性体现在 对语句末 ,的处理

    <!-- set-->
    <update id="updateSet" parameterType="User">
        update JiKeUser
        <set>
            <if test="name != null">name=#{name},</if>
            <if test="password != null">password=#{password},</if>
        </set>
        where id=#{id}
    </update>

3. trim = 装修,格式化

trim标记=格式化标记
可以与其它标记组合完成where与set标记功能,更加强大

标记意义
prefix前缀添加
suffix后缀添加
prefixOverrides自动判断前置
suffixOverrides自动判断后置

代替set

在sql语句前置添加set,后置添加WHERE id = #{id},同时智能判断后置 , 是否添加或者去除

    <update id="updateUserTrim" parameterType="User">
        UPDATE User
        <trim prefix="SET" suffixOverrides="," suffix="WHERE id = #{id}" >
            <if test="name != null and name != '' ">
                name = #{name},
            </if>
            <if test="password != null and password != '' ">
                password=#{password},
            </if>
        </trim>
    </update>

代替where

    select * from user  
      <trim prefix="where"   prefixOverrides="and|or">  
            <if test="userName!=null">
                and userName like #{userName}
            </if>
            <if test="id!=null">
                and id =#{id}
            </if>
    </trim>

foreach标记:

用于循环查询和循环赋值

循环查询:

<foreach item="item" index="index" collection="list" 
    open="(" separator="," close=")"> 
            #{item} 
</foreach>
属性描述
item每一次迭代结果
collection循环集合或指定类型
separator元素之间的分隔符,可选
open开始符号,可选
close关闭符号,可选
indexlist和数组的序号,可选
    <!-- foreach 循环查询-->
    <select id="selectUserForeach" resultType="User" parameterType="list">
        select * from user
        <where>
            id in
            <foreach item="item" index="index" collection="list"
                     open="(" separator="," close=")">
                #{item}
            </foreach>
        </where>
    </select>

//测试
ArrayList<Integer> ides=new ArrayList();
ides.add(2);
……
List<User> ap=session.selectList("selectUserForeach", ides);
    <!-- foreach 循环赋值-->
    <insert id="insertUserForeach">
        insert into User (name, password) values
        <foreach item="item" index="key" collection="list"
                 open="" separator="," close="">(#{item.name}, #{item.password})
        </foreach>
    </insert>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值