最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis使用注解實(shí)現(xiàn)復(fù)雜動(dòng)態(tài)SQL的方法詳解

 更新時(shí)間:2023年12月03日 09:55:53   作者:魚跡  
當(dāng)使用 MyBatis 注解方式執(zhí)行復(fù)雜 SQL 時(shí),你可以使用 @Select、@Update、@Insert、@Delete 注解直接在接口方法上編寫 SQL,本文給大家介紹了Mybatis如何使用注解實(shí)現(xiàn)復(fù)雜動(dòng)態(tài)SQL,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下

前言

當(dāng)使用 MyBatis 注解方式執(zhí)行復(fù)雜 SQL 時(shí),你可以使用 @Select、@Update、@Insert、@Delete 注解直接在接口方法上編寫 SQL。也可以使用動(dòng)態(tài) SQL 注解 @SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider 等結(jié)合 Provider 類來動(dòng)態(tài)生成 SQL 語句。Provider 類需要定義一個(gè)方法,方法返回值是一個(gè)字符串,該字符串即為動(dòng)態(tài)生成的 SQL 語句。這些注解允許你在方法級(jí)別上編寫 SQL,使代碼更簡潔明了。

一、基礎(chǔ)注解

這里介紹的注解有@Select@Update、@Insert@Delete ,常用的也是這些。

以下是一個(gè)示例展示了如何使用注解執(zhí)行復(fù)雜 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);
    
    // 更復(fù)雜的 SQL 可以通過 XML 方式或者動(dòng)態(tài) SQL 的注解方式實(shí)現(xiàn)
    // 也可以使用動(dòng)態(tài) SQL 注解 @SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider 等
}

當(dāng)然,也可以再注解中使用if標(biāo)簽和foreach來實(shí)現(xiàn)復(fù)雜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);

在這個(gè)示例中:

  • @Select、@Update@Insert、@Delete 注解分別用于執(zhí)行查詢、更新、插入和刪除操作。
  • 注解中的 SQL 語句使用 #{parameterName} 語法引用方法參數(shù),并且使用 @Param 注解為參數(shù)指定名稱。

二、使用Provider 類實(shí)現(xiàn)復(fù)雜注解

對于更復(fù)雜的 SQL 語句,你可以使用 @SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider 注解結(jié)合對應(yīng)的 Provider 類,以及動(dòng)態(tài) SQL 注解來實(shí)現(xiàn)動(dòng)態(tài)生成 SQL 語句。這樣能夠更靈活地處理復(fù)雜的查詢邏輯。

以下是一個(gè)示例,展示如何使用注解結(jié)合 Provider 實(shí)現(xiàn)動(dòng)態(tài) 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);
}

在這個(gè)示例中:

  • UserSqlProvider 類是一個(gè) Provider 類,其中的 getUserByNameAndAge 方法根據(jù)傳入的參數(shù)動(dòng)態(tài)生成 SQL 語句。
  • UserMapper 接口使用 @SelectProvider 注解來指定 Provider 類和對應(yīng)的方法,以動(dòng)態(tài)生成 SQL 語句。

在實(shí)際應(yīng)用中,根據(jù)需要,Provider 類的方法可以編寫更為復(fù)雜的邏輯,以生成復(fù)雜動(dòng)態(tài) SQL 語句,使其更加靈活和可控。

到此這篇關(guān)于Mybatis使用注解實(shí)現(xiàn)復(fù)雜動(dòng)態(tài)SQL的方法詳解的文章就介紹到這了,更多相關(guān)Mybatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java內(nèi)部類之間的閉包和回調(diào)詳解

    Java內(nèi)部類之間的閉包和回調(diào)詳解

    相信閉包和回調(diào)對每位學(xué)習(xí)Java的人來說都不陌生,那么今天小編和大家分享一篇關(guān)于Java內(nèi)部類之間的閉包和回調(diào),有需要的可以參考借鑒。
    2016-09-09
  • java jdk動(dòng)態(tài)代理詳解

    java jdk動(dòng)態(tài)代理詳解

    動(dòng)態(tài)代理類的Class實(shí)例是怎么生成的呢,是通過ProxyGenerator類來生成動(dòng)態(tài)代理類的class字節(jié)流,把它載入方法區(qū)
    2013-09-09
  • GateWay中StripPrefix的作用及說明

    GateWay中StripPrefix的作用及說明

    StripPrefix過濾器剝離路徑前綴,PrefixPath則添加前綴,例如,訪問http://host:port/lbs/hello時(shí),StripPrefix=1會(huì)將請求轉(zhuǎn)至http://bds-lbs-service/hello,PrefixPath會(huì)添加/lbs前綴,兩者作用相反,用于路由路徑調(diào)整
    2025-07-07
  • sonar-scanner連接sonarquebe7的sonar.java.binaries問題的解決方案

    sonar-scanner連接sonarquebe7的sonar.java.binaries問題的解決方案

    今天小編就為大家分享一篇關(guān)于sonar-scanner連接sonarquebe7的sonar.java.binaries問題的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • JAVA API 實(shí)用類 String詳解

    JAVA API 實(shí)用類 String詳解

    這篇文章主要介紹了java String的深入理解的相關(guān)資料,希望通過本文大家能理解String的用法,需要的朋友可以參考下
    2021-10-10
  • 詳解Java 線程中斷

    詳解Java 線程中斷

    這篇文章主要介紹了Java 線程中斷的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • JAVA比較兩張圖片相似度的方法

    JAVA比較兩張圖片相似度的方法

    這篇文章主要介紹了JAVA比較兩張圖片相似度的方法,涉及java針對圖片像素操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Mybatis-Plus?CRUD操作方法

    Mybatis-Plus?CRUD操作方法

    通用?Service?CRUD?封裝?IService?接口,進(jìn)一步封裝?CRUD?采用?get?查詢、remove?刪除?、list?查詢集合、page?分頁的前綴命名方式區(qū)分?Mapper?層避免混淆,這篇文章主要介紹了Mybatis-Plus?CRUD的相關(guān)知識(shí),需要的朋友可以參考下
    2023-10-10
  • SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    最為常用定時(shí)任務(wù)框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不僅支持單實(shí)例方式還支持分布式方式。本文主要介紹Quartz,基礎(chǔ)的Quartz的集成案例本,以及實(shí)現(xiàn)基于數(shù)據(jù)庫的分布式任務(wù)管理和控制job生命周期
    2022-08-08
  • SpringBoot整合Druid、Redis的示例詳解

    SpringBoot整合Druid、Redis的示例詳解

    Druid 是阿里巴巴開源平臺(tái)上一個(gè)數(shù)據(jù)庫連接池實(shí)現(xiàn),結(jié)合了 C3P0、DBCP 等 DB 池的優(yōu)點(diǎn),同時(shí)加入了日志監(jiān)控。這篇文章主要介紹了SpringBoot整合Druid、Redis的實(shí)例詳解,感興趣的朋友跟隨小編一起看看吧
    2022-02-02

最新評論

玉山县| 安陆市| 石棉县| 屯留县| 四川省| 元氏县| 兴安盟| 南宁市| 桐梓县| 建水县| 通城县| 宁河县| 堆龙德庆县| 尉犁县| 海伦市| 夏津县| 株洲县| 岱山县| 普洱| 洞头县| 门源| 嘉祥县| 手机| 临泉县| 亚东县| 新邵县| 嘉义县| 射阳县| 沁源县| 墨江| 龙州县| 安泽县| 黔西县| 浙江省| 灯塔市| 水富县| 福清市| 德安县| 鄂托克旗| 汉中市| 卢湾区|