MyBatis 动态 SQL:让 SQL 语句随条件灵活变化

简介: 本文详解MyBatis动态SQL核心标签:`<if>`条件判断、`<where>`智能拼接、`<set>`安全更新、`<choose>`多选一、`<foreach>`遍历集合,结合代码与图示,助你告别硬编码,一个方法搞定多条件查询与批量操作。(239字)

前言

本文来讲解MyBatis的动态SQL

集合代码和图片演示,旨在让大家更好的理解(๑•̀ㅂ•́)و✧

个人主页:艺杯羹🌿

系列专栏:本文ben'weben'wbenbeMyBbatis🚀

1. 动态SQL

一个查询的方法的Sql语句不一定是固定的
比如电影选片,根据不同要求,Sql语句就会添加不同的查询条件
如图:


此时就需要在方法中使用动态Sql语句

1.1. if

标签内的Sql片段在满足条件后才会添加,用法为:。例如:根据不同条件查询用户:

1.1.1. 持久层接口添加方法

// 用户通用查询
List<User> findByCondition(User user);

1.1.2. 映射文件添加标签

<select id="findByCondition" parameterType="com.yibeigen.pojo.User" resultType="com.itbaizhan.pojo.User">
   select * from user where 1 = 1
  <if test = "username != null and username.length() != 0">
     and username like #{username}
  </if>
  <if test = "sex != null and sex.length() != 0">
     and sex = #{sex}
  </if>
  <if test="address != null and address.length() != 0">
     and address = #{address}
  </if>
</select>

1.1.3. 编写测试方法

@Test
public void testFindByCondition(){
  User user = new User();
  List<User> users1 = userMapper2.findByCondition(user);
  //users1.forEach(System.out::println);
  user.setUsername("%金%");
  List<User> users2 = userMapper2.findByCondition(user);
  users2.forEach(System.out::println);
  user.setAddress("北京");
  List<User> users3 = userMapper2.findByCondition(user);
  users3.forEach(System.out::println);
}
  1. if中的条件不能使用 && / ||,而应该使用 and / or
  2. if中的条件可以直接通过属性名获取参数POJO的属性值,并且该值可以调用方法。
  3. where后为什么要加1=1?
    任意条件都可能拼接到Sql中。如果有多个条件,从第二个条件开始前都需要加And关键字。加上1=1这个永久成立的条件,就不需要考虑后面的条件哪个是第一个条件,后面的条件前都加And关键字即可

1.2. where

可以代替sql中的 where 1=1 和 第一个and  更符合程序员的开发习惯,使用后的映射文件如下:

if 标签放在 where 里

<select id="findByCondition" resultType="com.itbaizhan.user.User" parameterType="com.itbaizhan.user.User">
   select * from user
  <where>
    <if test="username != null and username.length() != 0">
       username like #{username}
    </if>
    <if test="sex != null and sex.length() != 0">
       and sex = #{sex}
    </if>
  </where>
</select>

1.3. set

标签用在update语句中  借助,可以只对有具体值的字段进行更新  会自动添加set关键字,并去掉最后一个if语句中多余的逗号

<update id="update" parameterType="com.yibeigen.user.User">
   update user
  <set>
    <if test="username != null and username.length() > 0">
       username = #{username},
    </if>
    <if test="sex != null and sex.length() > 0">
       sex = #{sex},
    </if>
  </set>
  <where>
     id = #{id}
  </where>
</update>

1.4. choose、when、otherwise

这些标签表示多条件分支,类似JAVA中的switch...case
类似switch  类似case  类似default  用法如下:

<select id="findByCondition" resultType="com.yibeigen.user.User" parameterType="com.yibeigen.user.User">
   select * from user
  <where>
    <choose>
      <when test="username.length() &lt; 5">
         username like #{username}
      </when>
      <when test="username.length() &lt; 10">
         username = #{username}
      </when>
      <otherwise>
         id = 1
      </otherwise>
    </choose>
  </where>
</select>

这段代码的含义为:
用户名 < 5 时使用 模糊查询
用户名 >= 5 并且 < 10 时使用 精确查询
否则查询id为1的用户

1.5. foreach

类似 JAVA 中的for循环,可以遍历集合或数组。有如下属性:

  • collection:遍历的对象类型
  • open:开始的sql语句
  • close:结束的sql语句
  • separator:遍历每项间的分隔符
  • item:表示本次遍历获取的元素,遍历List、Set、数组时表示每项元素,遍历map时表示键值对的值
  • index:遍历List、数组时表示遍历的索引,遍历map时表示键值对的键

1.5.1. 遍历数组

我们使用遍历数组进行批量删除

  1. 持久层接口添加方法
void deleteBatch(int[] ids);

2. 映射文件添加标签

<delete id="deleteBatch" parameterType="int">
   delete from user
  <where>
    <foreach open="id in(" close=")" separator="," collection="array" item="id" >
       #{id}
    </foreach>
  </where>
</delete>

3. 编写测试方法

@Test
public void testDeleteBatch(){
  int[] ids = {5,8};
  userMapper.deleteBatch(ids);
  session.commit();
}


1.5.2. 遍历Collection

遍历List和Set的方法是一样的,我们使用遍历List进行批量添加。

  1. 持久层接口添加方法
void insertBatch(List<User> users);

2. 映射文件添加标签

<insert id="insertBatch" parameterType="com.yibeigen.user.User">
   insert into user values
  <foreach collection="list" item="user" separator=",">
     (null ,#{user.username},#{user.birthday},#{user.sex},#{user.address})
  </foreach>
</insert>

3. 编写测试方法

@Test
public void testInsertBatch(){
  User user1 = new User("程序员1", "男", "北京");
  User user2 = new User("程序员2", "女", "上海");
  List<User> users = new ArrayList();
  users.add(user1);
  users.add(user2);
  userMapper2.insertBatch(users);
  session.commit();
}

1.5.3. 遍历Map

我们使用遍历Map进行多条件查询

1. 持久层接口添加方法

/**
   * 多条件查询
   * @param map 查询的条件键值对 键:属性名 值:属性值
   * @return
    要给参数起一个参数名才能用!!!
   */
List<User> findUser(@Param("queryMap") Map<String,Object> map);

2. 映射文件添加标签

<select id="findUser" parameterType="map" resultType="com.yibeigen.pojo.User">
   select * from user
  <where>
    <foreach collection="queryMap" separator="and" index="key" item="value">
            -- 键是拼进来的,这个key和value是到时候会传进来的!!!
         -- ${} 是直接会加上的,#{},是会预编译的
        ${key} = #{value}
    </foreach>
  </where>
</select>

3. 编写测试方法

@Test
public void testFileUser(){
   Map<String, Object> queryMap = new HashMap<>();
   queryMap.put("sex", "男");
   queryMap.put("address", "北京");
   List<User> user = userMapper.findUser(queryMap);
   user.forEach(System.out::println);
}

2. 总结

现在就讲解完了动态SQL,希望对你有所帮助(๑•̀ㅂ•́)و✧

目录
相关文章
阿里云轻量应用服务器68元/年,新用户特价,不要退款,重新买价格459元,涨价了!
阿里云轻量应用服务器新用户专享价68元/年(2核2G、200M带宽、40GB ESSD),秒杀低至38元。⚠️地域选定后不可修改,退款将失去新用户资格,再购恢复原价459元/年!务必下单前确认地域,避免浪费优惠。阿里云轻量应用服务器官网:https://t.aliyun.com/U/dwftch
|
2月前
|
人工智能 安全 中间件
AI 帮你改了 20 个文件,最后 3 个忘了改——长任务为什么总是"差一口气"?
AI长任务常因“失忆”、误删、静默跳过、截断编造等问题翻车。UseIO通过Plan驱动拆解、检查点回滚、三级安全门控、结构化错误处理与交付前四点复查,构建工程级可靠性防护链,显著提升多文件重构等复杂任务的完成率与稳定性。(239字)
|
2月前
|
缓存 测试技术 API
大模型API中转站避坑:满血验证、倍率换算与降智识别(附压测代码)
从工程师视角系统梳理大模型API中转站的评估方法:讲清兑换比例与倍率的真实换算关系,给出满血模型验证三招(复杂推理压测、模型指认、长上下文压力测试)与可运行的Python压测脚本,并总结稳定性、协议兼容、计费透明等接入要点和先测后充的避坑建议。
|
2月前
|
缓存 人工智能 计算机视觉
Qwen3.8-Flash模型介绍:能力、上下文限制、费用定价详细说明
通义千问最新多模态大模型Qwen3.8-Flash(ID:qwen3.8-flash),原生支持百万级上下文(100万tokens)、文本/图像/视频输入,输出为文本。具备Function Calling、结构化输出、联网搜索(限北京/新加坡)等能力,兼容OpenAI/Anthropic协议,已在阿里云百炼平台开放免费试用(赠100万Tokens)。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
|
2月前
|
Java 程序员 应用服务中间件
Maven之初识与安装
本文详解Maven安装与配置全流程:从基础概念、下载安装、环境变量配置到版本验证,助新手一次理清逻辑、顺利完成部署;涵盖一键构建、依赖管理核心功能,并提供交流支持。
190 0
Maven之初识与安装
|
2月前
|
Java 应用服务中间件 数据库连接
Maven 之工程化开发核心指南:插件配置、pom 文件与依赖管理
本文详解Maven工程化开发核心:从IDEA中Maven插件配置、Web项目创建与目录结构搭建,到pom.xml关键配置(坐标、properties、dependencies、plugins)、依赖范围(provided等)原理与实战,助你掌握工程化思维,高效构建Java项目。(239字)
108 1
Maven 之工程化开发核心指南:插件配置、pom 文件与依赖管理
|
2月前
|
人工智能 C语言
二级C语言题解:十进制转其他进制、非素数求和、重复数统计
本文详解三类经典编程题:十进制转任意进制(填空)、非素数求和(修改)与重复数字统计(设计),含完整代码、逐空分析及易错点解析,助你夯实C语言基础。
136 2
二级C语言题解:十进制转其他进制、非素数求和、重复数统计
|
2月前
|
存储 C语言
C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调
本文详解C语言二级考试三类典型题:统计字母及非字母字符个数、数字字符串转双精度浮点数、二维数组上下三角区域数据对调。含题目解析、错误定位与完整代码,适合备考学生、中职生及编程爱好者提升实战能力。
130 1
C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调
|
2月前
|
SQL Java 数据库连接
MyBatis 之基础概念与框架原理详解
MyBatis是一款轻量级半自动ORM框架,封装JDBC,让开发者专注SQL编写与业务逻辑;支持XML/注解配置、动态SQL、高级映射,SQL与代码分离,灵活高效,显著提升持久层开发效率。(239字)
133 1
MyBatis 之基础概念与框架原理详解
|
2月前
|
弹性计算 NoSQL 网络安全
怎么在阿里云计算巢部署 TuGraph 图数据库?如何申请免费试用
TuGraph是蚂蚁集团研发的高性能图数据库,支持万亿级图数据处理与毫秒级复杂查询。现通过阿里云计算巢提供社区版免费试用,一键部署、免运维,含可视化控制台与丰富API,助力快速构建图应用。阿里云计算巢官网:https://t.aliyun.com/U/PEl9rE
83 0

热门文章

最新文章