文章目錄
- 前言
- 一、使用 TypeHandler
- 二、使用提示
- 三、Wrappers
- 四、線程安全性
- 五、使用 Wrapper 自定義 SQL
- 1.注意事項
- 2.示例
- 3. 使用方法
- 總結
前言
本章繼續上章條件構造器相關內容。
一、使用 TypeHandler
在 wrapper
中使用 typeHandler
需要特殊處理利用 formatSqlMaybeWithParam
方法
// 查詢
queryWrapper.apply("type={0,typeHandler="+ MyTypeHandler.class.getCanonicalName()+ "}", "待處理字符串");// 更新
updateWrapper.setSql("type={0,javaType=string,jdbcType=VARCHAR,typeHandler=xxx.xxx.MyTypeHandler}", "待處理字符串");
二、使用提示
通過使用 MyBatis-Plus 的 Wrapper 條件構造器,開發者可以更加高效地構建復雜的數據庫查詢條件,同時保持代碼的簡潔性和安全性。以下是一些注意事項與推薦做法:
- 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和可維護性。
- 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和Wrapper 支持鏈式調用,可以組合多個條件,如
and
、or
等邏輯操作符。 - 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和在更新操作中使用 UpdateWrapper 或 LambdaUpdateWrapper 時,可以省略實體對象,直接在 Wrapper 中設置更新字段。
- 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和注意 Wrapper 的線程安全性,通常在每次使用時創建新的 Wrapper 實例。
- 在使用 Wrapper 時,盡量使用 Lambda 表達式來避免硬編碼字段名,這樣可以提高代碼的可讀性和在使用 MyBatis-Plus 的 Wrapper 時,應避免將前端動態參數直接拼接到 SQL 片段中,以防止 SQL 注入攻擊。MyBatis-Plus 提供了安全的參數綁定方式,如使用
eq
、apply
等方法,它們會自動處理參數綁定,避免 SQL 注入風險。
三、Wrappers
MyBatis-Plus 提供了 Wrappers
類,它是一個靜態工廠類,用于快速創建 QueryWrapper
、UpdateWrapper
、LambdaQueryWrapper
和 LambdaUpdateWrapper
的實例。使用 Wrappers 可以減少代碼量,提高開發效率。
示例:
// 創建 QueryWrapper
QueryWrapper<User> queryWrapper = Wrappers.query();
queryWrapper.eq("name", "張三");// 創建 LambdaQueryWrapper
LambdaQueryWrapper<User> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(User::getName, "張三");// 創建 UpdateWrapper
UpdateWrapper<User> updateWrapper = Wrappers.update();
updateWrapper.set("name", "李四");// 創建 LambdaUpdateWrapper
LambdaUpdateWrapper<User> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
lambdaUpdateWrapper.set(User::getName, "李四");
注意事項
- 在使用 QueryWrapper UpdateWrapper 查詢 設置 條件字段部分 一定要保證安全,避免 SQL 注入攻擊。
- 任何 前端 傳入的 SQL片段 都要 嚴格過濾 更多查看 數據安全保護 預防安全漏洞
四、線程安全性
Wrapper 實例不是線程安全的,因此建議在每次使用時創建新的 Wrapper 實例。這樣可以避免多線程環境下的數據競爭和潛在的錯誤。
示例:
// 在每個方法或請求中創建新的 Wrapper 實例
public List<User> getUsersByName(String name) {QueryWrapper<User> queryWrapper = Wrappers.query();queryWrapper.eq("name", name);return userMapper.selectList(queryWrapper);
}
通過遵循這些最佳實踐,開發者可以更加安全、高效地使用 MyBatis-Plus 的 Wrapper 條件構造器,構建出既安全又易于維護的數據庫操作代碼。
五、使用 Wrapper 自定義 SQL
MyBatis-Plus 提供了強大的 Wrapper 條件構造器,允許開發者自定義 SQL 語句,以滿足更復雜的數據庫查詢需求。為了使用這一功能,請確保你的 mybatis-plus
版本不低于 3.0.7
。
1.注意事項
- 版本要求:確保你的項目中使用的
mybatis-plus
版本至少為3.0.7
,以支持自定義 SQL 功能。 - 參數命名:在自定義 SQL 時,傳遞
Wrapper
對象作為參數時,參數名必須為ew
,或者使用注解@Param(Constants.WRAPPER)
明確指定參數為Wrapper
對象。 - 使用
${ew.customSqlSegment}
:在 SQL 語句中,使用${ew.customSqlSegment}
來引用Wrapper
對象生成的 SQL 片段。 - 不支持基于
entity
的where
語句:自定義 SQL 時,Wrapper
對象不會基于實體類自動生成where
子句,你需要手動編寫完整的 SQL 語句。
2.示例
以下是一個使用 Wrapper 自定義 SQL 的示例:
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;public interface UserMapper extends BaseMapper<User> {@Select("SELECT * FROM user ${ew.customSqlSegment}")List<User> selectByCustomSql(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}
在上述示例中,我們定義了一個 selectByCustomSql
方法,它使用了一個自定義的 SQL 語句,并通過 ${ew.customSqlSegment}
引入了 Wrapper
對象生成的 SQL 片段。
3. 使用方法
要使用自定義 SQL,只需調用上述方法并傳入一個 Wrapper 對象:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "張三");List<User> userList = userMapper.selectByCustomSql(queryWrapper);
在這個例子中,selectByCustomSql
方法將執行一個帶有 where
條件的查詢,該條件由傳入的 queryWrapper
對象生成。
通過這種方式,你可以靈活地結合 MyBatis-Plus
的 Wrapper
功能和自定義 SQL,以滿足各種復雜的數據庫操作需求。
總結
回到頂部
使用 TypeHandler大家可以放到后面了解,后面會有專門的一章去講字段類型處理器。