mybatis 中动态 sql 标签的学习

mybatis 中动态 sql 标签的学习

在mybatis中,进行数据库操作时,不仅仅根据单一的标准来进行的增删改查,有时候,可能需要根据一个复杂的条件来操作,比如:根据一个用户的部分信息,查找一个用户;根据一个用户的id集合,查找该集合中的所有用户。这时候,可以使用一些动态的 sql 标签来辅助操作数据库,可以更加灵活、方便。

if 标签

假设一个用户类的属性有 username,id,sex,address 四个属性,我们需要根据其中某些属性来查找该用户的信息,比如:根据单一的属性 username,id ,sex ,address,又或者根据组合属性 username 和 id,username 和 address等等,使得 sql 语句用起来特别不方便,还要书写多条语句。这时候,if 标签就可以排上用场了。如:

<!--根据用户部分属性查询用户-->
    <select id="findUserByCondition" parameterType="***.User" resultType="***.User">
        select * from user where 1=1
        <if test="username!=null">    添加查找的条件
            and username=#{username}
        </if>
        <if test="id!=null">
            and id=#{id}
        </if>
        <if test="sex!=null">
            and sex=#{sex}
        </if>
        <if test="address!=null">
            and address=#{address}
        </if>
    </select>

select标签中的属性:
id:调用 sql 语句的函数
parameterType:传进来的参数类型,上例是 user
resultType:结果集的返回类型
这里不作详细解释。主要讲解 sql 标签。

if 标签中的 test 属性表示判断,首先判断传进来的用户存不存在 username 属性,存在则判断是否匹配,不存在则判断下一个属性,依次类推。

where 标签

where 标签可以表示 sql 语句中的 where 的条件限制,将条件限制语句包裹在 where 标签中,使得代码更整洁、易懂。如,上例也可以写成:

<!--根据用户部分属性查询用户-->
    <select id="findUserByCondition" parameterType="***.User" resultType="***.User">
        select * from user
	    <where>
            <if test="username!=null">
                username=#{username}
            </if>
            <if test="id!=null">
                and id=#{id}
            </if>
            <if test="sex!=null">
                and sex=#{sex}
            </if>
            <if test="address!=null">
                address=#{address}
            </if>
        </where>
    </select>

foreach 标签

当需要根据一个用户的 id 集合来查找用户时,foreach 标签可以遍历每一个 id,再根据相应的 sql 语句来查询。如:

<!--根据一个的ids集合查询用户-->
    <select id="***" parameterType="***" resultType="***">
        select * from user
        <where>
            <if test="ids!=null">
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>

foreach 标签中的 collection 属性表示传入的集合参数,open 和 close 表示的语句为 “and id in (ids)",and 表示一个逻辑与的条件判断,id in (ids) 表示 ids 集合中的每一个 id。item 表示从 ids 集合中取出来的每一个元素的名称为 uid,separator 表示分隔符。

sql 标签

在 sql 的操作中,我们发现有一些 sql 语句经常重复着写,这时候,可以采用 sql 标签将该语句包裹成为一个模板,需要使用时,直接用 include 标签引入即可。
配置模板:

    <sql id="defaultSelect">
        select * from user
    </sql>

将 select * from user 包裹起来,也可以包裹多条 sql 语句。
使用模板:

<include refid="defaultSelect"></include>

注意模板的结尾有没有分号了。如果有分号,在与其他 sql 语句拼接时,会出现错误。在数据库的使用中,sql 语句没有分号结尾,并不会影响。
如,上例中采用模板也可以写成:

<!--根据一个的ids集合查询用户-->
    <select id="***" parameterType="***" resultType="***">
        <include refid="defaultSelect"></include>
        <where>
            <if test="ids!=null">
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值