• (八)动态 sql


    目录


    什么是动态 sql

    我们之前在映射文件中,配置 sql 的时候,其实都是静态的 ;

       <!--复杂查询-->
        <select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen" >
            SELECT * from user where sex = #{userStrengthen.sex} and  name like '%${userStrengthen.name}%'
        </select>

    比如这样的 sql ,我们只能根据条件进行查询了;

    但是有时候,我们总要查询满足其中 部分条件 的结果,这时候,难道需要我们再次配置新的 sql 吗?

    mybatis 没有那么傻,它有个 动态sql 技术 ;(动态sql 用法跟我们之前学的 jstl 差不多);

    我们使用 动态sql 改写上面的映射关系文件 :

        <select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen" >
            SELECT * from user
    
            <!-- where 标签会自动的删除第一个条件前面的 and -->
            <where>
                <if test="userStrengthen != null">
                    <if test="userStrengthen.sex != null and userStrengthen.sex != '' ">
                        AND sex = #{userStrengthen.sex}
                    </if>
                    <if test="userStrengthen.name != null and userStrengthen.name != '' ">
                        and  name like '%${userStrengthen.name}%'
                    </if>
                </if>
            </where>
        </select>

    sql 片段

    向上面的查询条件,我们可能会在其他地方也使用,我们总不能每次都复制粘贴一次吧,那样重复代码太多了,mybatis 有一个 sql片段 技术 ;

    就是为一段 sql 一句,起个名字,放在那,在使用的时候,直接进行引用 ;

    创建 sql片段 代码

    <!--定义 sql片段 -->
        <!--
            一点经验:  
            1、在定义sql片段的时候,不要将 where 标签定义进来,不然 就无法做到条件的拼接了
            2、定义 sql片段,只在单表中进行定义,这样复用性更强 
        -->
        <sql id="query_user_name_sex">
            <if test="userStrengthen != null">
                <if test="userStrengthen.sex != null and userStrengthen.sex != '' ">
                    AND sex = #{userStrengthen.sex}
                </if>
                <if test="userStrengthen.name != null and userStrengthen.name != '' ">
                    and name like '%${userStrengthen.name}%'
                </if>
            </if>
        </sql>

    在需要的地方,引用我们定义的 sql片段

     <select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen">
            SELECT * from user
            <!-- where 标签会自动的删除第一个条件前面的 and -->
            <where>
            <!-- 引用 sql 片段-->
                <include refid="query_user_name_sex"></include>
            </where>
        </select>

    foreach 标签

    有些时候,我们传入的条件是一个集合,这样,我们就可以用 foreach 标签进行迭代 ;

    比如,拼接下面一个 sql

    and id in(1,11,22)

    使用 foreach 遍历 :

     <sql id="query_user_ids">
            <if test="ids != null">
                <!--
                collection : 集合引用的名字
                item : 为每次从集合中迭代出来的对象,取个名字 
                open :sql 条件语句开始的部分
                close : sql 条件语句结束的部分
                separator : 迭代对象进行拼接中间的部分
                -->
                <foreach collection="ids" item="id" open="and id in(" close=")" separator=","> 
                  #{id}
                </foreach>
            </if>
        </sql>
  • 相关阅读:
    MTU 理解和遇到的一些问题
    tm使用
    C++字符串中转义符
    安卓系统修改host文件简单教程
    公有继承的一个理解
    模板打印函数
    linux 设置时区
    ACE中的inline
    SecureCRT中脚本进行交互,发送Ctrl+C
    C++中多态的实现原理
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665673.html
Copyright © 2020-2023  润新知