網站首頁 編程語言 正文
系列文章目錄
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
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-09-10 python實現整數序列求和_python
- 2022-06-13 詳解Python如何利用Pandas與NumPy進行數據清洗_python
- 2022-06-08 Api接口Sign簽名和驗簽
- 2022-04-20 Flutter如何輕松實現動態更新ListView淺析_Android
- 2022-07-02 less,sass,scss的關系與區別
- 2022-04-09 Tomcat 部署多個SpringBoot 項目:ERROR org.springframework
- 2022-08-22 探究C#訪問null字段會拋異常原因_C#教程
- 2022-05-28 python中數組和列表的簡單實例_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支