🚀 作者主頁: 有來技術
🔥 開源項目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot
🌺 倉庫主頁: Gitee 💫 Github 💫 GitCode
💖 歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請糾正!
目錄
- 前言
- ParameterHandler 接口
- DefaultParameterHandler 類
- setParameters 方法
- getParameterValue 方法
- 結語
- 開源項目
前言
在 MyBatis 中,ParameterHandler
是四大核心組件之一,負責將 Java 方法的參數解析成 SQL 語句中的參數。在本文中,我們將詳細介紹 ParameterHandler
的源碼,并解釋復雜對象作為參數時一個和多個的區別和原因。
ParameterHandler 接口
ParameterHandler
接口定義了參數解析器的基本方法,包括:
setParameters(PreparedStatement ps)
:將 Java 方法的參數設置到PreparedStatement
中。getParameterObject()
:獲取 Java 方法的參數對象。getParameterType()
:獲取 Java 方法的參數類型。
DefaultParameterHandler 類
DefaultParameterHandler
類是 ParameterHandler
接口的默認實現,它提供了參數解析的默認實現。DefaultParameterHandler
類中包含了兩個重要的成員變量:
parameterObject
:Java 方法的參數對象。mappedStatement
:當前正在執行的 SQL 語句的映射語句。
setParameters 方法
setParameters
方法是 ParameterHandler
接口的核心方法,它負責將 Java 方法的參數設置到 PreparedStatement
中。setParameters
方法的實現如下:
@Override
public void setParameters(PreparedStatement ps) throws SQLException {// 獲取 Java 方法的參數對象Object parameterObject = getParameterObject();// 獲取當前正在執行的 SQL 語句的映射語句MappedStatement mappedStatement = getMappedStatement();// 獲取 SQL 語句中的參數映射List<ParameterMapping> parameterMappings = mappedStatement.getParameterMappings();// 遍歷參數映射for (int i = 0; i < parameterMappings.size(); i++) {// 獲取參數映射ParameterMapping parameterMapping = parameterMappings.get(i);// 獲取參數值Object value = getParameterValue(parameterMapping, parameterObject);// 設置參數值ps.setObject(i + 1, value);}
}
getParameterValue 方法
getParameterValue
方法負責獲取參數值。getParameterValue
方法的實現如下:
private Object getParameterValue(ParameterMapping parameterMapping, Object parameterObject) {// 獲取參數類型Class<?> parameterType = parameterMapping.getJavaType();// 獲取參數名稱String parameterName = parameterMapping.getProperty();// 獲取參數值Object value = null;if (parameterType == String.class) {value = (String) parameterObject;} else if (parameterType == Integer.class) {value = (Integer) parameterObject;} else if (parameterType == Long.class) {value = (Long) parameterObject;} else if (parameterType == Float.class) {value = (Float) parameterObject;} else if (parameterType == Double.class) {value = (Double) parameterObject;} else if (parameterType == Date.class) {value = (Date) parameterObject;} else if (parameterType == byte[].class) {value = (byte[]) parameterObject;} else {// 如果參數類型是復雜類型,則需要使用反射獲取參數值try {Field field = parameterObject.getClass().getDeclaredField(parameterName);field.setAccessible(true);value = field.get(parameterObject);} catch (NoSuchFieldException e) {throw new RuntimeException("Error getting parameter value: " + e.getMessage());} catch (IllegalAccessException e) {throw new RuntimeException("Error getting parameter value: " + e.getMessage());}}// 返回參數值return value;
}
這兩個方法結合起來完成了將 Java 方法的參數解析并設置到 PreparedStatement
的過程。
結語
通過深入理解 MyBatis 中 ParameterHandler 的源碼,我們能夠更好地把握參數解析的機制,提高 SQL 語句的執行效率。同時,了解復雜對象作為參數時的處理方式,能夠更靈活地應對各種場景。在實際應用中,合理地使用參數映射規范,能夠使 SQL 語句更加清晰易讀,提高開發效率。
開源項目
- SpringCloud + Vue3 微服務商城
Github | Gitee | |
---|---|---|
后端 | youlai-mall 🍃 | youlai-mall 🍃 |
前端 | mall-admin🌺 | mall-admin 🌺 |
移動端 | mall-app 🍌 | mall-app 🍌 |
- SpringBoot 3+ Vue3 單體權限管理系統
Github | Gitee | |
---|---|---|
后端 | youlai-boot 🍃 | youlai-boot 🍃 |
前端 | vue3-element-admin 🌺 | vue3-element-admin 🌺 |