日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Mybatis使用注解實現復雜動態SQL

作者:魚跡 更新時間: 2023-12-19 編程語言

系列文章目錄

1、mybatis簡介及數據庫連接池
2、mybatis簡單使用
3、mybatis中selectOne的使用
4、mybatis中resultMap結果集的使用
5、mybatis實用教程之XML實現動態sql


Mybatis使用注解實現復雜動態SQL

  • 系列文章目錄
  • 前言
  • 一、基礎注解
  • 二、使用Provider 類實現復雜注解


前言

當使用 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 語句,使其更加靈活和可控。

原文鏈接:https://blog.csdn.net/weixin_45915647/article/details/134753372

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新