动态SQL常用标签

动态 SQL

目的:为了摆脱在不同条件拼接 SQL 语句的痛苦

在不同条件在生成不同的SQL语句

本质上仍然是SQL语句,不过是多了逻辑代码去拼接SQL,只要保证SQL的正确性按照格式去排列组合

可以先写好SQL语句

 

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

 

if,          where(可以自动去除多余的and)

复制代码
    <select id="queryBlog_if"  parameterType="map" resultType="Blog">
        select * from mybatis.blog
        <where>
        <if test="title !=null">
            and title=#{title}
        </if>
        <if test="author !=null">
            and author=#{author}
        </if>
        </where>
    </select>
View Code
复制代码

choose(when, otherwise)

从多个条件中选择一个使用,有点像 Java 中的 switch 语句

复制代码
    <select id="queryBlog_choose" parameterType="map" resultType="Blog">
        select * from mybatis.blog
        <where>
        <choose>
            <when test="title !=null ">
                title=#{title}
            </when>
            <when test="author!=null ">
                author=#{author}
            </when>
<!--            <otherwise>-->
<!--                and views=#{views}-->
<!--            </otherwise>-->
<!--  没有otherwise的时候可以不用传值,有的话得至少传一个值-->

        </choose>
        </where>
    </select>
View Code
复制代码

set(可以去除多余的逗号,  )    [update]

复制代码
    <update id="updateBlog" parameterType="map" >
        update mybatis.blog
<set>
    <if test="title != null">
        title=#{title},
    </if>
    <if test="author != null">
        author=#{author},
    </if>

</set>
    where id=#{id}
    </update>
View Code
复制代码

SQL片段(提取共有的SQL语句,达到便捷复用的作用)  [尽量只要if判断的就行]

复制代码
    <sql id="oo_sb">
        <if test="title != null">
            title=#{title},
        </if>
        <if test="author != null">
            author=#{author},
        </if>
    </sql>


<!--          然后就用下面方式,写到原有的位置-->


 <include refid="oo_sb"></include>
View Code
复制代码
  
 foreach
复制代码
    <select id="queryBlogget1_3" parameterType="map" resultType="Blog">
        select * from mybatis.blog
        <where>
            <foreach collection="ids" item="id_"
                     open="id in (" separator="," close=")">
                #{id_}
            </foreach>
        </where>
    </select>

SQL:select * from mybatis.blog where id in(1,2,3)


ids=通过万能map传入的集合名称  
item=遍历的每个元素的值
open 前缀
separator 分隔
close  后缀
 #{iid}     前缀和后缀里面的东西  等于遍历的元素
collection取值不用加#{}

方法二:

    <select id="queryBlogget1_3" parameterType="map" resultType="Blog">
        select * from mybatis.blog
        <where>
            <foreach collection="ids" item="id_"
                     open=" (" separator="or" close=")">
                id=#{id_}
            </foreach>
        </where>
    </select>

SQL:select * from mybatis.blog where(id=? or id=?)
View Code
复制代码
复制代码
//测试代码片段

        HashMap map = new HashMap();
            ArrayList<Integer> ids = new ArrayList<>();
            ids.add(1);
            ids.add(2);
            ids.add(3);
            map.put("ids",ids);
            List<Blog> blogs=  mapper.queryBlogget1_3(map);
View Code
复制代码

 

posted @   磕伴  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?
点击右上角即可分享
微信分享提示