当前位置: 首页 > article >正文

Mybatis高级(动态SQL)

MyBatis 是一个优秀的持久层框架,它支持定制化的 SQL、存储过程以及高级映射。在 N

Batis 中,动态 SQL是一个非常强大的特性,它允许你根据不同的条件来生成不同的 SQ

语句。这主要通过使用 MyBatis 提供的 XML 映射文件中的动态 SQL元素来实现,或者在

注解中使用 OGNL(Object-Graph NavigationLanguage)表达式。

1.使用 XML 映射文件

在 MyBatis 的 XML 映射文件中,你可以使用以下动态 SQL元素:

<choose>

<when>

<otherwise>

<where>

<set>

<foreach>

<trim>

<bind>

示例:使用

<if>和<foreach>

假设你有一个查询用户信息的场景,根据不同的条件(如用户名、年龄等)来构建 SQL。

<select id="selectUsers" resultType="User">

  SELECT * FROM users

  <where>

    <if test="username != null">

      AND username = #{username}

    </if>

    <if test="age != null">

      AND age = #{age}

    </if>

    <if test="department != null">

      AND department = #{department}

    </if>

  </where>

</select>

示例:使用 <foreach>

如果你需要根据一个列表(例如用户 ID 列表)来查询多个用户,可以使用 <foreach>。

<select id="selectUsersByIds" resultType="User">

  SELECT * FROM users

  WHERE id IN

  <foreach item="id" collection="list" open="(" separator="," close=")">

    #{id}

  </foreach>

</select>

2. 使用注解方式

虽然 XML 映射文件提供了强大的动态 SQL 支持,但你也可以在 Mapper 接口的方法上使用注解来定义动态 SQL。这通过 OGNL 表达式实现。

示例:使用注解中的 OGNL 表达式

@Select({

  "<script>",

  "SELECT * FROM users",

  "WHERE 1=1",

  "<if test='username != null'>",

  "AND username = #{username}",

  "</if>",

  "<if test='age != null'>",

  "AND age = #{age}",

  "</if>",

  "</script>"

})

List<User> selectUsers(User user);

3. 使用 <bind> 变量绑定

<bind> 元素允许你在动态 SQL 中定义一个变量,这在某些复杂的条件判断中非常有用。

<select id="selectUsersByCriteria" resultType="User">

  <bind name="pattern" value="'%' + username + '%'" />

  SELECT * FROM users WHERE username LIKE #{pattern}

</select>

小结

MyBatis 的动态 SQL 功能通过提供一系列的 XML 元素和注解支持,使得构建灵活且强大的 SQL 语句变得简单。通过合理利用这些功能,你可以根据不同的业务需求生成精确的 SQL,从而提高应用的性能和灵活性。


http://www.kler.cn/a/551609.html

相关文章:

  • Stream流简单使用
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter16-DOM2 和 DOM3
  • 人工智能(AI)在癌症休眠研究及精准肿瘤学中的应用|顶刊速递·25-02-18
  • 本地DeepSeek模型GGUF文件转换为PyTorch格式
  • 动态规划算法篇:枚举的艺术
  • 嵌入式八股文(四)计算机网络篇
  • uniapp编写微信小程序:project.config.json: libVersion 字段需为 string, string
  • java项目打包成docker镜像步骤
  • LeetCode 热题 100_分割回文串(61_131_中等_C++)(递归(回溯))(回溯问题使用类成员变量还是函数传参)
  • 人工智能基础之数学基础:01高等数学基础
  • 小米电视维修记录 2025/2/18
  • Spark ,虚拟机基本命令(1)
  • 【Modelsim】warning:(vsim-WLF-5000) WLF file currently in use:vsim.wlf
  • R语言用逻辑回归贝叶斯层次对本垒打数据与心脏移植数据后验预测检验模拟推断及先验影响分析|附数据代码...
  • Mysql-事务日志undo log
  • React实现自动滚动表格
  • 【Python】实时将数据写入Excel
  • 分布式同步锁:原理、实现与应用
  • 国产编辑器EverEdit - 自动完成功能的用法
  • 蓝桥杯单片机基础部分——单片机介绍部分