(八)动态 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>
原文地址:https://www.cnblogs.com/young-youth/p/11665673.html