Mybatis參數傳遞示例代碼
前言
在實際開發(fā)中,大多數情況下都需要對 SQL 傳入參數以獲得想要的結果集,傳入的情況分為兩種情況:
1、SQL語句的拼接,比如表名、like 條件等;在 mybatis 中使用 ${} 包裹參數,mybati 直接對其進行字符串替換
2、SQL 中作為條件輸入的參數,這種情況下,SQL 允許使用 ? 作為占位符來代替參數,在 mybatis 中使用 #{} 包裹參數,使用占位符有以下幾點好處:
- mybatis 會對包裹的變量進行轉義和類型檢查,避免以 SQL 注入的方式攻擊數據庫
- 默認情況下,mybatis 采用的是預編譯的方式,對于數據庫而言 SQL 本身沒有變化,變化的是傳入的參數,數據庫只會編譯一次,而不會因為作為條件的參數變化而重新編譯,節(jié)約了 SQL 執(zhí)行總時間
對于開發(fā)人員而言,能夠使用 #{} 傳入參數的情況都應該采用這種形式。
傳入參數
接口 Mapper 傳入參數
在 xml 中寫 SQL 的時候注意到 parameterType 參數,剛接觸的時候就有疑惑,如果有多個參數該如何指定。原來這是一個可選參數,Mybatis 本身就可以通過 TypeHandler 推斷出具體傳入語句的參數。
總結通過接口方法傳入參數的情況:
- 參數使用添加@Param注解,或者使用 '-parameters' 編譯選項并啟用 useActualParamName 選項(默認開啟)來編譯項目
- 特別的,如果參數是Javabean,在SQL中引用參數的時候可以直接使用屬性訪問符,而無需通過 get 方法。eg: #{Javabean.id}
配置文件傳入參數
有時候為了將表名或者 schema 可配置化,將變量寫到配置文件中,避免未來表名變化造成大的改動。
全局變量
首先如果是作為全局的參數,可以將配置文件中的參數都寫入到 Javabean 中,使用的時候通過接口 Mapper 傳入即可。在 Spring 中
- 在 Spring 配置文件中,使用 PropertiesFactoryBean 指定配置文件路徑,指定 id
- 在 Javabean 文件中使用通過 @Value("#{id['name']}") 設置變量,并使用 @Component 注解該Javabean
- 在接口 Mapper 中傳入該 Javabean
applicationContext.xml
<bean id="exampleid" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<array>
<value>classpath:<name>.properties</value>
</array>
</property>
</bean>
ExampleProperty.java
@Component("exampleProperty")
public class ExampleProperty {
@Value("#{exampleid['name']}")
public String name;
...
}
引用
@Resource private ExampleProperty exampleProperty;
只在 mybatis SQL 中引用
如果不是作為全局參數,而只是在 SQL 中使用,則可以通過 mybatis 的配置文件 mybatis-config.xml 引入,這里引入的變量所有 SQL 的 xml 中都可以通過 ${} 的方式引入。
mybatis-config.xml
<properties resource="<name>.properties"> <property name="name" value="exampleName"/> <property name="id" value="exampleId"/> ... </properties>
參數加載的順序如下
- 首先包裹的參數作為默認值(推薦引入配置文件的同時也設定默認參數)
- 加載 resource 中指定的配置文件,如果已指定了該參數則覆蓋
- 如果通過接口 Mapper 傳入了同名參數,接口 Mapper 傳入的參數覆蓋原有參數值
另外需要注意的是通過 mybatis-config.xml 設定的參數,在 SQL 中無法直接使用 #{} 的方式引入,而有時候又想要用占位符的方式進行預編譯,除了使用接口 Mapper 傳入參數外,還可以使用<bind>
bind 元素可以從 OGNL 表達式中創(chuàng)建一個變量并將其綁定到上下文
ExampleSQL.xml
<mapper namespace="**.ExampleMapper">
<select id="" resultType="string">
<bind name="id" value="'${id}'"/>
SELECT * FROM ××.××
WHERE ID = #{id}
...
</select>
</mapper>
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Springboot集成RabbitMQ死信隊列的實現(xiàn)
在大多數的MQ中間件中,都有死信隊列的概念。本文主要介紹了Springboot集成RabbitMQ死信隊列的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Java線程中synchronized和volatile關鍵字的區(qū)別詳解
這篇文章主要介紹了Java線程中synchronized和volatile關鍵字的區(qū)別詳解,synchronzied既能夠保障可見性,又能保證原子性,而volatile只能保證可見性,無法保證原子性,volatile不需要加鎖,比synchronized更輕量級,不會阻塞線程,需要的朋友可以參考下2024-01-01
在SpringBoot環(huán)境中使用Mockito進行單元測試的示例詳解
Mockito特別適用于在Spring Boot環(huán)境中進行單元測試,因為它能夠輕松模擬Spring應用中的服務、存儲庫、客戶端和其他組件,通過使用Mockito,開發(fā)者可以模擬外部依賴,從而使單元測試更加獨立和可靠,本文給大家介紹了在Spring Boot環(huán)境中使用Mockito進行單元測試2024-01-01
SpringBoot優(yōu)雅實現(xiàn)計算方法執(zhí)行時間
這篇文章主要為大家詳細介紹了SpringBoot中優(yōu)雅實現(xiàn)計算方法執(zhí)行時間的相關方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-04-04

