动态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>
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>
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>
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>
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=?)

//测试代码片段 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);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?