Mybatis使用注解实现复杂动态SQL

系列文章目录

1、mybatis简介及数据库连接池
2、mybatis简单使用
3、mybatis中selectOne的使用
4、mybatis中resultMap结果集的使用
5、mybatis实用教程之XML实现动态sql



前言

当使用 MyBatis 注解方式执行复杂 SQL 时,你可以使用 @Select@Update@Insert@Delete 注解直接在接口方法上编写 SQL。也可以使用动态 SQL 注解 @SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider 等结合 Provider 类来动态生成 SQL 语句。Provider 类需要定义一个方法,方法返回值是一个字符串,该字符串即为动态生成的 SQL 语句。这些注解允许你在方法级别上编写 SQL,使代码更简洁明了。


一、基础注解

这里介绍的注解有@Select@Update@Insert@Delete ,常用的也是这些。

以下是一个示例展示了如何使用注解执行复杂 SQL:

import org.apache.ibatis.annotations.*;

@Mapper
public interface UserMapper {
    
    @Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
    List<User> getUserByNameAndAge(@Param("name") String name, @Param("age") int age);
    
    @Update("UPDATE users SET name = #{name} WHERE id = #{id}")
    void updateUserNameById(@Param("id") int id, @Param("name") String name);
    
    @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
    void insertUser(@Param("name") String name, @Param("age") int age);
    
    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUserById(@Param("id") int id);
    
    // 更复杂的 SQL 可以通过 XML 方式或者动态 SQL 的注解方式实现
    // 也可以使用动态 SQL 注解 @SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider 等
}

当然,也可以再注解中使用if标签和foreach来实现复杂sql,如下示例所示

@Select("SELECT * FROM users WHERE 1=1 " +
        "<if test='ids != null'> " +
        "AND id IN <foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach> " +
        "</if>")
List<User> getUsersByIds(@Param("ids") List<Integer> ids);


  
 @Select({
        "SELECT * FROM users WHERE id IN ",
        "<foreach item='id' collection='userIds' open='(' separator=',' close=')'>",
            "#{id}",
        "</foreach>"
})
List<User> getUsersByIds(@Param("userIds") List<Integer> userIds);

在这个示例中:

  • @Select@Update@Insert@Delete 注解分别用于执行查询、更新、插入和删除操作。
  • 注解中的 SQL 语句使用 #{parameterName} 语法引用方法参数,并且使用 @Param 注解为参数指定名称。

二、使用Provider 类实现复杂注解

对于更复杂的 SQL 语句,你可以使用 @SelectProvider@UpdateProvider@InsertProvider@DeleteProvider 注解结合对应的 Provider 类,以及动态 SQL 注解来实现动态生成 SQL 语句。这样能够更灵活地处理复杂的查询逻辑。

以下是一个示例,展示如何使用注解结合 Provider 实现动态 SQL:

public class UserSqlProvider {
    public String getUserByNameAndAge(Map<String, Object> params) {
        String name = (String) params.get("name");
        Integer age = (Integer) params.get("age");

        StringBuilder sb = new StringBuilder("SELECT * FROM users WHERE 1=1");
        
        if (name != null && !name.isEmpty()) {
            sb.append(" AND name = #{name}");
        }
        
        if (age != null) {
            sb.append(" AND age = #{age}");
        }
        return sb.toString();
    }
}

注解使用:

import org.apache.ibatis.annotations.*;

@Mapper
public interface UserMapper {
    @SelectProvider(type = UserSqlProvider.class, method = "getUserByNameAndAge")
    List<User> getUserByNameAndAge(Map<String, Object> params);
}

在这个示例中:

  • UserSqlProvider 类是一个 Provider 类,其中的 getUserByNameAndAge 方法根据传入的参数动态生成 SQL 语句。
  • UserMapper 接口使用 @SelectProvider 注解来指定 Provider 类和对应的方法,以动态生成 SQL 语句。

在实际应用中,根据需要,Provider 类的方法可以编写更为复杂的逻辑,以生成复杂动态 SQL 语句,使其更加灵活和可控。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值