动态SQL

本文详细介绍了MyBatis框架中处理多参数查询、使用动态SQL标签(if、where、choose、foreach)以及如何实现更新功能(SET语句)和分页功能(LIMIT关键字)。通过例子展示了如何在XML映射文件和Java代码中运用这些特性。
摘要由CSDN通过智能技术生成

目录

处理简单的多参数查询

处理集合参数

处理更新功能

Mybatis框架的分页功能


处理简单的多参数查询

MyBatis 框架动态SQL的常用标签
标签说明
if条件判断,类似于Java语言中的if
where给SQL语句动态添加where关键字
choose条件判断,这是一个组合标签,需要与 when,otherwise标签搭配使用。可实现与Java中的switch语句类似的功能
forcach以遍历方式处理集合类型参数
set为SQL语句动态添加set关键字
trim对SQL语句进行格式化处理,添加或移除前后缀

1.if标签

使用if元素:通过if元素可以在SQL中根据条件动态添加或排除语句块。

<select id="getUserList" parameterType="Map" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="userName != null">
  AND user_name = #{userName}
</if>
<if test="userAge != null">
  AND user_age = #{userAge}
</if>
</select>

如果传入的Map中包含userName参数,则会动态地添加AND user_name = #{userName},如果传入的Map中包含userAge参数,则会动态地添加AND user_age = #{userAge}。

这就是if的使用方式

2.where标签

<where> 标签可以用于在 SQL 语句中动态生成 WHERE 子句,使得生成的 SQL 更加简洁和可读。<where> 标签会根据条件自动添加 WHERE 关键字,并去除多余的 AND 或 OR 操作符。

<select id="getUserList" parameterType="Map" resultType="User">
  SELECT * FROM user
  <where>
  <if test="userName != null">
    AND user_name = #{userName}
  </if>
  <if test="userAge != null">
    AND user_age = #{userAge}
  </if>
  </where>
</select>

<where> 标签包含了两个 <if> 标签,每个 <if> 标签都可以根据条件动态生成相应的 SQL 语句片段。

如果传入的 Map 中包含 userName 参数,会生成 AND user_name = #{userName}  SQL 语句。

如果传入的 Map 中包含 userAge 参数,会生成 AND user_age = #{userAge}  SQL 语句。

如果两个参数都存在,会生成 AND user_name = #{userName} AND user_age = #{userAge} SQL 语句。

如果这两个参数都不存在,则 <where> 标签不会生成任何 SQL 语句。

3.choose标签

在 MyBatis 中,<choose> 标签(也称为 <select> 标签)可实现类似于 switch-case 的逻辑判断。它允许根据条件选择一个分支进行处理,类似 Java 中的 if-else-if-else 结构。<choose> 标签可以包含多个 <when> 和一个可选的 <otherwise> 分支。

<select id="getUserList" parameterType="Map" resultType="User">
  SELECT * FROM user
  WHERE 1=1
  <choose>
  <when test="userName != null">
    AND user_name = #{userName}
  </when>
  <when test="userAge != null">
    AND user_age = #{userAge}
  </when>
  <otherwise>
    AND user_status = 1
  </otherwise>
  </choose>
</select>

<choose> 标签包含了两个 <when> 标签和一个 <otherwise> 标签。

如果传入的 Map 中包含 userName 参数,则会执行 <when> 标签中的逻辑,生成 AND user_name = #{userName} 这部分 SQL 语句。

如果传入的 Map 中包含 userAge 参数,则会执行 <when> 标签中的逻辑,生成 AND user_age = #{userAge} 这部分 SQL 语句。

如果两个参数都不存在,则会执行 <otherwise> 标签中的逻辑,生成 AND user_status = 1 这部分 SQL 语句。

处理集合参数

MyBatis框架通过foreach标签对这类参数进行循环处理最终拼接出一个符合MySOL语法的in语句来处理这类参数。foreach标签处理数组List集合、Map 对象类型参数的语法如图:

 语法中的属性介绍如下
                item:遍历数组时,为这个数组或这个List 集合中的元素起的别名

                open 属性指定在生成的 SQL 语句中该集合参数的开始符号(例如:左括号)。

                separator 属性指定在生成的 SQL 语句中每个元素之间的分隔符。

                close 属性指定在生成的 SQL 语句中该集合参数的结束符号(例如:右括号)。

list

<select id="getUserList" parameterType="List" resultType="User">
  SELECT * FROM user
  WHERE user_id IN
  <foreach collection="userIds" item="userId" open="(" separator="," close=")">
  #{userId}
  </foreach>
</select>

map 

<select id="getUserList" parameterType="Map" resultType="User">
  SELECT * FROM user
  WHERE 1=1
  <foreach collection="userMap" item="entry" separator="AND">
  AND ${entry.key} = #{entry.value}
  </foreach>
</select>

处理更新功能

SET 语句用于指定要更新的字段及其对应的值。它可以在 <update> 标签中使用,用于更新数据库中的记录。

<update id="updateUser" parameterType="User">
  UPDATE user
  SET user_name = #{userName}, user_age = #{userAge}
  WHERE user_id = #{userId}
</update>

在上面的例子中,SET 语句用于指定要更新的字段及其对应的值。

  • user_name = #{userName}:表示要更新 user_name 字段的值为传入的 userName 参数值。

  • user_age = #{userAge}:表示要更新 user_age 字段的值为传入的 userAge 参数值。

使用 MyBatis 提供的 SqlSession 对象的 update() 方法可以执行该更新语句。

User user = new User();
user.setUserId(1);
user.setUserName("John");
user.setUserAge(30);

sqlSession.update("updateUser", user);

通过使用 SET 语句,可以指定要更新的字段及其对应的值,实现灵活的更新操作。

Mybatis框架的分页功能

先上代码:
Java 代码:

public interface UserMapper {
  List<User> getUserListByPage(@Param("offset") int offset, @Param("limit") int limit);
}

Mapper XML 文件: 

<select id="getUserListByPage" resultType="User">
  SELECT * FROM user
  LIMIT #{offset}, #{limit}
</select>

测试:

int pageNum = 1; // 页码
int pageSize = 10; // 每页显示数量
int offset = (pageNum - 1) * pageSize; // 计算起始位置

List<User> userList = userMapper.getUserListByPage(offset, pageSize);

实现思路:

  1. 在 SQL 语句中使用 LIMIT 关键字来指定分页的起始位置和数量。可以使用 LIMIT #{offset}, #{limit} 来指定从偏移量 offset 开始查询 limit 条记录。

  2. 在 XML 文件中定义一个方法来执行分页查询。方法的参数中包含分页相关的信息,如页码、每页显示数量等。

  3. 在 XML 文件中编写对应的 SQL 查询语句,使用 LIMIT 关键字来实现分页功能。

  4. 在 Java 代码中调用执行分页查询的方法,并传入分页相关的参数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值