学习MyBatis的第三天

一  MyBatis框架动态SQL处理简单的多参数查询

1.if和where标签

在MyBatis框架中,可以使用if标签来处理简单的多参数查询。if标签可以用于动态生成SQL语句的条件部分。

首先,在Mapper XML文件中,使用<select>元素定义查询语句,并设置parameterType来指定输入参数类型。然后,在<where>标签内部,使用<if>标签来根据参数的值进行条件判断。

例如,假设有一个查询用户信息的方法,需要根据用户名、性别和年龄进行组合查询,可以这样编写Mapper XML文件:

<select id="getUserList" parameterType="map" resultType="User">
  SELECT * FROM user
  <where>
    <if test="username != null and username != ''">
      AND username = #{username}
    </if>
    <if test="gender != null and gender != ''">
      AND gender = #{gender}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
  </where>
</select>

上述示例中,使用了三个<if>标签来判断参数的值是否为空或null。如果参数不为空,则在SQL语句中添加相应的条件。

在Java代码中,可以通过传入一个包含查询条件的Map对象来调用上述查询方法。例如:

Map<String, Object> params = new HashMap<>();
params.put("username", "张三");
params.put("gender", "男");
params.put("age", 30);

List<User> userList = sqlSession.selectList("getUserList", params);

上述代码会根据传入的参数动态生成对应的SQL语句,并执行查询操作。

这样,就可以使用MyBatis框架中的if标签来处理简单的多参数查询了。根据参数的值动态生成条件部分的SQL语句,使查询更加灵活和可扩展。

2.choose(when、otherwise)标签

在MyBatis框架中,choose(when、otherwise)标签用于处理多个条件的判断,类似于Java中的switch语句。它可以根据条件选择其中某一个分支进行处理。

使用choose(when、otherwise)标签的语法如下:

<choose>
  <when test="条件1">
    <!-- 符合条件1时执行的逻辑 -->
  </when>
  <when test="条件2">
    <!-- 符合条件2时执行的逻辑 -->
  </when>
  ...
  <otherwise>
    <!-- 所有条件都不满足时执行的逻辑 -->
  </otherwise>
</choose>

首先,使用choose标签包裹起来,然后使用若干个when标签定义条件分支。每个when标签内部通过test属性指定一个条件表达式,当这个条件满足时,就会执行该分支对应的逻辑。

最后,使用otherwise标签定义默认分支,即所有条件都不满足时执行的逻辑。

以下是一个示例,假设有一个根据用户类型查询用户信息的方法,可以这样编写Mapper XML文件:

<select id="getUserListByType" parameterType="String" resultType="User">
  SELECT * FROM user
  <where>
    <choose>
      <when test="userType == 'admin'">
        userType = '管理员'
      </when>
      <when test="userType == 'normal'">
        userType = '普通用户'
      </when>
      <otherwise>
        userType = '未知用户'
      </otherwise>
    </choose>
  </where>
</select>

上述示例中,根据传入的用户类型(userType)参数判断用户类型,并根据不同的类型生成对应的SQL语句。

在Java代码中,可以通过传入用户类型来调用上述查询方法。例如:

String userType = "admin";

List<User> userList = sqlSession.selectList("getUserListByType", userType);

上述代码会根据传入的用户类型动态生成对应的SQL语句,并执行查询操作。

这样,就可以使用MyBatis框架中的choose(when、otherwise)标签处理多个条件的判断了。根据不同的条件选择相应的分支进行处理,使查询更加灵活和可扩展。

二  MyBatis框架动态SQL处理集合参数

1.foreach标签处理数组类型参数

在MyBatis框架中,可以使用foreach标签来处理数组类型的参数。foreach标签用于遍历集合或数组,并将每个元素作为参数的一部分,动态生成SQL语句。

使用foreach标签的语法如下:

<foreach collection="collection" item="item" index="index" open="(" separator="," close=")">
  #{item}
</foreach>

其中,常用的属性包括:

  • collection:指定要遍历的集合或数组。
  • item:指定每个元素的别名。
  • index(可选):指定索引的别名,只适用于数组。
  • open(可选):指定循环块的开头。
  • separator(可选):指定元素之间的分隔符。
  • close(可选):指定循环块的结尾。

以下是一个示例,假设有一个根据用户ID列表查询用户信息的方法,可以这样编写Mapper XML文件:

<select id="getUserListByIds" parameterType="int[]" resultType="User">
  SELECT * FROM user
  WHERE id IN
  <foreach collection="array" item="id" open="(" separator="," close=")">
    #{id}
  </foreach>
</select>

上述示例中,使用了foreach标签遍历传入的用户ID数组,将每个ID作为参数的一部分,动态生成IN条件的SQL语句。

在Java代码中,可以通过传入一个整型数组来调用上述查询方法。例如:

int[] userIds = {1, 2, 3};

List<User> userList = sqlSession.selectList("getUserListByIds", userIds);

上述代码会根据传入的用户ID数组动态生成对应的SQL语句,并执行查询操作。

这样,就可以使用MyBatis框架中的foreach标签处理数组类型的参数了。通过遍历数组元素,将每个元素作为参数的一部分,实现动态生成SQL语句,使查询更加灵活和可扩展。

2.foreach标签处理List类型参数

在MyBatis框架中,可以使用foreach标签来处理List类型的参数。foreach标签用于遍历集合或数组,并将每个元素作为参数的一部分,动态生成SQL语句。

使用foreach标签的语法如下:

<foreach collection="collection" item="item" index="index" open="(" separator="," close=")">
  #{item}
</foreach>

其中,常用的属性包括:

  • collection:指定要遍历的集合或数组。
  • item:指定每个元素的别名。
  • index(可选):指定索引的别名,只适用于List。
  • open(可选):指定循环块的开头。
  • separator(可选):指定元素之间的分隔符。
  • close(可选):指定循环块的结尾。

以下是一个示例,假设有一个根据用户ID列表查询用户信息的方法,可以这样编写Mapper XML文件:

<select id="getUserListByIds" parameterType="java.util.List" resultType="User">
  SELECT * FROM user
  WHERE id IN
  <foreach collection="list" item="id" open="(" separator="," close=")">
    #{id}
  </foreach>
</select>

上述示例中,使用了foreach标签遍历传入的List类型参数,将每个元素作为参数的一部分,动态生成IN条件的SQL语句。

在Java代码中,可以通过传入一个List对象来调用上述查询方法。例如:

List<Integer> userIds = Arrays.asList(1, 2, 3);

List<User> userList = sqlSession.selectList("getUserListByIds", userIds);

上述代码会根据传入的List对象动态生成对应的SQL语句,并执行查询操作。

这样,就可以使用MyBatis框架中的foreach标签处理List类型的参数了。通过遍历集合元素,将每个元素作为参数的一部分,实现动态生成SQL语句,使查询更加灵活和可扩展。

3.foreach标签处理Map类型参数

在MyBatis框架中,可以使用foreach标签来处理Map类型的参数。foreach标签用于遍历集合或数组,并将每个元素作为参数的一部分,动态生成SQL语句。

对于Map类型的参数,可以通过entrySet()方法获取键值对的集合,然后使用foreach标签进行遍历。

使用foreach标签的语法如下:

<foreach collection="collection" item="item" index="index" open="(" separator="," close=")">
  #{item.key} = #{item.value}
</foreach>

其中,常用的属性包括:

  • collection:指定要遍历的集合。
  • item:指定每个元素的别名,这里是一个键值对。
  • index(可选):指定索引的别名。
  • open(可选):指定循环块的开头。
  • separator(可选):指定元素之间的分隔符。
  • close(可选):指定循环块的结尾。

以下是一个示例,假设有一个根据条件查询用户信息的方法,可以这样编写Mapper XML文件:

<select id="getUserListByCondition" parameterType="java.util.Map" resultType="User">
  SELECT * FROM user
  WHERE
  <foreach collection="condition.entrySet()" item="entry" separator="AND">
    ${entry.key} = #{entry.value}
  </foreach>
</select>

上述示例中,使用了foreach标签遍历传入的Map类型参数的entrySet(),将每个键值对作为参数的一部分,动态生成SQL语句。

在Java代码中,可以通过传入一个Map对象来调用上述查询方法。例如:

Map<String, Object> condition = new HashMap<>();
condition.put("username", "张三");
condition.put("age", 30);

List<User> userList = sqlSession.selectList("getUserListByCondition", condition);

上述代码会根据传入的Map对象动态生成对应的SQL语句,并执行查询操作。

这样,就可以使用MyBatis框架中的foreach标签处理Map类型的参数了。通过遍历键值对,将每个键值对作为参数的一部分,实现动态生成SQL语句,使查询更加灵活和可扩展。

三  MyBatis框架动态SQL处理更新功能

1.set标签

在MyBatis框架中,set标签用于更新操作中设置要更新的字段和值。它可以根据传入的参数动态生成SET语句。

使用set标签的语法如下:

<update id="updateUser" parameterType="User">
  UPDATE user
  <set>
    <if test="username != null">username = #{username},</if>
    <if test="password != null">password = #{password},</if>
    <if test="email != null">email = #{email},</if>
    ...
  </set>
  WHERE id = #{id}
</update>

上述示例中,使用了set标签来动态生成更新操作的SET语句。在set标签内部,使用if标签对每个字段进行判断,如果字段值不为null,则将字段和值添加到SET语句中。

注意,最后一个字段后面没有逗号,这是通过if标签判断是否需要添加逗号的方式。

在Java代码中,可以通过传入一个User对象来调用上述更新方法。例如:

User user = new User();
user.setId(1);
user.setUsername("张三");
user.setPassword("123456");

int rowsAffected = sqlSession.update("updateUser", user);

上述代码会根据传入的User对象动态生成相应的UPDATE语句,并执行更新操作。

通过set标签,可以灵活地根据参数动态生成更新语句中的SET部分,只更新非空字段,避免不必要的更新。这样,可以提高更新操作的效率和减少数据库的负担。

四  MyBatis框架动态SQL知识扩展

1.trim标签

在MyBatis框架中,trim标签用于处理SQL语句中的前缀、后缀和中间部分的空白字符。它可以根据需要进行动态修剪或添加这些空白字符。

使用trim标签的语法如下:

<trim prefix="前缀" prefixOverrides="要删除的前缀" suffix="后缀" suffixOverrides="要删除的后缀">
  要处理的SQL语句片段
</trim>

其中,常用的属性包括:

  • prefix(可选):指定要添加的前缀。
  • prefixOverrides(可选):指定要删除的前缀。
  • suffix(可选):指定要添加的后缀。
  • suffixOverrides(可选):指定要删除的后缀。

以下是一个示例,假设有一个查询用户信息的方法,可以这样编写Mapper XML文件:

<select id="getUserList" resultType="User">
  SELECT *
  FROM user
  <trim prefix="WHERE" prefixOverrides="AND | OR">
    <if test="username != null">AND username = #{username}</if>
    <if test="email != null">AND email = #{email}</if>
  </trim>
</select>

上述示例中,使用了trim标签来处理WHERE关键字和多余的AND或OR条件。在trim标签内部,使用if标签对每个条件进行判断,如果满足条件,则添加到SQL语句中;否则,将删除对应的前缀和连接符。

在Java代码中,可以通过传入一个查询条件的对象来调用上述方法。例如:

UserQuery query = new UserQuery();
query.setUsername("张三");
query.setEmail("example@example.com");

List<User> userList = sqlSession.selectList("getUserList", query);

上述代码会根据传入的查询条件对象动态生成相应的SQL语句,并执行查询操作。

通过trim标签,可以灵活地处理SQL语句中的前缀、后缀和中间部分的空白字符,使得SQL语句更加清晰和易于维护。这样,可以提高SQL编写的灵活性和可读性。

五  MyBatis框架的分页功能

MyBatis框架本身并没有内置分页功能,但可以通过结合数据库的特性和一些基本的SQL语句来实现分页。

以下是实现基础的MyBatis框架分页功能的一般步骤:

  1. 在Mapper接口中定义查询方法,并添加分页参数。
    List<User> getUserList(@Param("start") int start, @Param("pageSize") int pageSize);
    

  2. 在Mapper XML文件中编写SQL语句,并使用数据库特定的分页语法。以MySQL为例,可以使用LIMIT关键字来限制查询结果的行数,并使用OFFSET关键字来指定查询结果的起始位置
    <select id="getUserList" resultType="User">
      SELECT *
      FROM user
      LIMIT #{start}, #{pageSize}
    </select>
    
  3. 在Java代码中调用查询方法,并传入分页参数。
    int pageNum = 1; // 当前页码
    int pageSize = 10; // 每页记录数
    
    int start = (pageNum - 1) * pageSize; // 计算起始位置
    List<User> userList = userMapper.getUserList(start, pageSize);
    

上述代码中,pageNum表示当前页码,pageSize表示每页记录数,通过计算起始位置(pageNum - 1) * pageSize,可以得到当前页的查询起始位置。然后调用Mapper接口中定义的查询方法,并传入分页参数进行查询操作。

这种基本的分页方式适用于大多数常见的数据库,只需要根据具体的数据库语法进行相应的调整。

需要注意的是,分页功能一般会结合排序来使用,以确保查询结果的顺序正确。在编写SQL语句时,可以通过ORDER BY子句指定排序字段和排序方式。

虽然基础的MyBatis框架分页功能相对简单,但足够满足常见的分页需求。如果有更复杂的分页场景,可以考虑使用第三方分页插件或自定义分页逻辑来实现更高级的分页功能。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值