Mybatis的动态sql

Mybatis的动态sql

1 if(条件判断)
    使用案例:
    < SELECT id = "queryUser" parameterType ="int" resultType = "UserEneity" > 
     SELECT
            *
        FROM
            USER
        WHERE
            age = '33' 
        <!-- 只有name这个字段的值不是null并且不是空串这个条件才会执行 -->
        <IF test = " name !=null and name!=''  " >
        AND NAME = #{name}
        </IF > 
    </ SELECT>

2 choose(when,otherwise)
    类似于 
        if(){}
        else if(){}
        else{} 的结构 
    使用案例:
    <select id="queryInfo" parameterType="Map" resultType="UserEneity">

        select * from user  where 1=1 
        <choose> 

        <when test="age!=null and age!=0">
            and age=#{age}
        </when>
        <when test="name!=null and name!='' ">
            and name=#{name}
        </when>
        <otherwise>
        <!--当都不满足时会执行这个  -->
            and id=6
        </otherwise>
        </choose>   
    </select>

3 trim(where set)
    <where>标签可以避免当传入空值时的一些sql问题
    比如:
        < SELECT id = "queryUser" parameterType = "int" resultType = "UserEneity" > 
            SELECT
                *
            FROM
                USER
            WHERE   
        <IF test = " name !=null  " >
            AND NAME = #{name}
            </IF >
    当 name传入null时 那么sql语句就是 select * from user where 那么sql语句就会报错 这时我们可以使用where标签
        < SELECT id = "queryUser" parameterType = "int" resultType = "UserEneity" > 
            SELECT
                    *
                FROM
                    USER
                <where>
                <IF test = " name !=null  " >
                    AND NAME = #{name}
                </IF >
            </where>
    当name=null sql最终的语句是 select * from user  查询全部的

<set>标签在修改数据的时候使用的比较多 
    使用案例:
        <update id="update" parameterType="map">
            update user 
            <set>
                <if test="name!=null and name!='' "> name=#{name}</if>
                <if test="age!=null and age!='' "> age=#{age}</if>
            </set>
            where id=#{id}
    </update>
3 foreach
        可以做一些循环的操作 比如动态的批量插入或是批量修改等 
        注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。
        使用案例:
        SELECT SUM(amount) as amount, sum(realpoliplanfee) as realpoliplanfee
            FROM hh_asset
            WHERE 1=1 AND jobnumber in
            <foreach collection="array" item="job" open="(" separator=","
                close=")">
                #{job}
            </foreach>
            <if test="paramters.type=='month'"><!-- 月 -->
                AND
                DATE_FORMAT(signdate,'%m')=DATE_FORMAT(NOW(),'%m')
            </if>
    </select>

传递数据组时 

Mybatis传入参数是基本类型的注意

1当传入参数是int类型时 
<select id="queryUser"  parameterType="int"resultType="UserEneity" >
    select * from user where 
    <if test=" id !=null">
        id=#{id}
    </if>
    </select>
则会报以下错误
 There is no getter for property named 'id' in 'class java.lang.Integer'
原因::
    Mybatis默认采用ONGL解析参数,所以会自动采用对象树的形式取Integer.cmpid。Integer对象没有cmpid属性。如果不解析参数,mybatis自动识别传入的参数,不会报错。
解决的办法:
    第一种:
        <select id="queryUser"parameterType="int"resultType="UserEneity" >
        select * from user where 
        <if test=" _parameter!=null">
            id=#{_parameter}
        </if>
    </select>

    第二种:
            在传递参数的方法中使用注解@Param
                    queryUser(@Param(value="id" )int id);
            在sql中
                    <select id="queryUser"  parameterType="int"
        resultType="UserEneity" >
            select * from user 
            where  1=1 
            <if test=" id !=null  ">
                and id=#{id}
            </if>
        </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值