• 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 等
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

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

    @Select("SELECT * FROM users WHERE 1=1 " +
            " " +
            "AND id IN #{id} " +
            "")
    List<User> getUsersByIds(@Param("ids") List<Integer> ids);
    
    
      
     @Select({
            "SELECT * FROM users WHERE id IN ",
            "",
                "#{id}",
            ""
    })
    List<User> getUsersByIds(@Param("userIds") List<Integer> userIds);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这个示例中:

    • @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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    注解使用:

    import org.apache.ibatis.annotations.*;
    
    @Mapper
    public interface UserMapper {
        @SelectProvider(type = UserSqlProvider.class, method = "getUserByNameAndAge")
        List<User> getUserByNameAndAge(Map<String, Object> params);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这个示例中:

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

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

  • 相关阅读:
    Spring系列19:SpEL详解
    Java + Selenium + Appium自动化测试
    人生的镜像-菌群人生,从出生到死亡的菌群演替
    vue3——element-plus 实现页面刷新之后,保持菜单的激活状态
    安防监控系统EasyCVR平台设备通道绑定AI算法的功能设计与开发实现
    Zero-Shot Learning by Harnessing Adversarial Samples 理论 & 代码解读
    JVM虚拟机:CMS垃圾回收器的日志分析
    【TES720D】基于复旦微的FMQL20S400全国产化ARM核心模块
    【操作系统】第五章 IO
    Postman小白安装和注册入门教程
  • 原文地址:https://blog.csdn.net/weixin_45915647/article/details/134753372