目录
处理简单的多参数查询
标签 | 说明 |
---|---|
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);
实现思路:
-
在 SQL 语句中使用 LIMIT 关键字来指定分页的起始位置和数量。可以使用
LIMIT #{offset}, #{limit}
来指定从偏移量 offset 开始查询 limit 条记录。 -
在 XML 文件中定义一个方法来执行分页查询。方法的参数中包含分页相关的信息,如页码、每页显示数量等。
-
在 XML 文件中编写对应的 SQL 查询语句,使用 LIMIT 关键字来实现分页功能。
-
在 Java 代码中调用执行分页查询的方法,并传入分页相关的参数