Mybatis參數(shù)傳遞示例代碼
前言
在實(shí)際開(kāi)發(fā)中,大多數(shù)情況下都需要對(duì) SQL 傳入?yún)?shù)以獲得想要的結(jié)果集,傳入的情況分為兩種情況:
1、SQL語(yǔ)句的拼接,比如表名、like 條件等;在 mybatis 中使用 ${} 包裹參數(shù),mybati 直接對(duì)其進(jìn)行字符串替換
2、SQL 中作為條件輸入的參數(shù),這種情況下,SQL 允許使用 ? 作為占位符來(lái)代替參數(shù),在 mybatis 中使用 #{} 包裹參數(shù),使用占位符有以下幾點(diǎn)好處:
- mybatis 會(huì)對(duì)包裹的變量進(jìn)行轉(zhuǎn)義和類(lèi)型檢查,避免以 SQL 注入的方式攻擊數(shù)據(jù)庫(kù)
- 默認(rèn)情況下,mybatis 采用的是預(yù)編譯的方式,對(duì)于數(shù)據(jù)庫(kù)而言 SQL 本身沒(méi)有變化,變化的是傳入的參數(shù),數(shù)據(jù)庫(kù)只會(huì)編譯一次,而不會(huì)因?yàn)樽鳛闂l件的參數(shù)變化而重新編譯,節(jié)約了 SQL 執(zhí)行總時(shí)間
對(duì)于開(kāi)發(fā)人員而言,能夠使用 #{} 傳入?yún)?shù)的情況都應(yīng)該采用這種形式。
傳入?yún)?shù)
接口 Mapper 傳入?yún)?shù)
在 xml 中寫(xiě) SQL 的時(shí)候注意到 parameterType 參數(shù),剛接觸的時(shí)候就有疑惑,如果有多個(gè)參數(shù)該如何指定。原來(lái)這是一個(gè)可選參數(shù),Mybatis 本身就可以通過(guò) TypeHandler 推斷出具體傳入語(yǔ)句的參數(shù)。
總結(jié)通過(guò)接口方法傳入?yún)?shù)的情況:
- 參數(shù)使用添加@Param注解,或者使用 '-parameters' 編譯選項(xiàng)并啟用 useActualParamName 選項(xiàng)(默認(rèn)開(kāi)啟)來(lái)編譯項(xiàng)目
- 特別的,如果參數(shù)是Javabean,在SQL中引用參數(shù)的時(shí)候可以直接使用屬性訪(fǎng)問(wèn)符,而無(wú)需通過(guò) get 方法。eg: #{Javabean.id}
配置文件傳入?yún)?shù)
有時(shí)候?yàn)榱藢⒈砻蛘?schema 可配置化,將變量寫(xiě)到配置文件中,避免未來(lái)表名變化造成大的改動(dòng)。
全局變量
首先如果是作為全局的參數(shù),可以將配置文件中的參數(shù)都寫(xiě)入到 Javabean 中,使用的時(shí)候通過(guò)接口 Mapper 傳入即可。在 Spring 中
- 在 Spring 配置文件中,使用 PropertiesFactoryBean 指定配置文件路徑,指定 id
- 在 Javabean 文件中使用通過(guò) @Value("#{id['name']}") 設(shè)置變量,并使用 @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 中引用
如果不是作為全局參數(shù),而只是在 SQL 中使用,則可以通過(guò) mybatis 的配置文件 mybatis-config.xml 引入,這里引入的變量所有 SQL 的 xml 中都可以通過(guò) ${} 的方式引入。
mybatis-config.xml
<properties resource="<name>.properties"> <property name="name" value="exampleName"/> <property name="id" value="exampleId"/> ... </properties>
參數(shù)加載的順序如下
- 首先包裹的參數(shù)作為默認(rèn)值(推薦引入配置文件的同時(shí)也設(shè)定默認(rèn)參數(shù))
- 加載 resource 中指定的配置文件,如果已指定了該參數(shù)則覆蓋
- 如果通過(guò)接口 Mapper 傳入了同名參數(shù),接口 Mapper 傳入的參數(shù)覆蓋原有參數(shù)值
另外需要注意的是通過(guò) mybatis-config.xml 設(shè)定的參數(shù),在 SQL 中無(wú)法直接使用 #{} 的方式引入,而有時(shí)候又想要用占位符的方式進(jìn)行預(yù)編譯,除了使用接口 Mapper 傳入?yún)?shù)外,還可以使用<bind>
bind 元素可以從 OGNL 表達(dá)式中創(chuàng)建一個(gè)變量并將其綁定到上下文
ExampleSQL.xml
<mapper namespace="**.ExampleMapper">
<select id="" resultType="string">
<bind name="id" value="'${id}'"/>
SELECT * FROM ××.××
WHERE ID = #{id}
...
</select>
</mapper>
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Mybatis Select Count(*)的返回值類(lèi)型介紹
- MyBatis查詢(xún)結(jié)果resultType返回值類(lèi)型的說(shuō)明
- mybatisplus中的xml對(duì)象參數(shù)傳遞問(wèn)題
- 詳解Mybatis多參數(shù)傳遞入?yún)⑺姆N處理方式
- Mybatis 動(dòng)態(tài)表名+Map參數(shù)傳遞+批量操作詳解
- Spring Boot整合mybatis使用注解實(shí)現(xiàn)動(dòng)態(tài)Sql、參數(shù)傳遞等常用操作(實(shí)現(xiàn)方法)
- Mybatis 返回值類(lèi)型和參數(shù)傳遞的配置方法
相關(guān)文章
Mybatis動(dòng)態(tài)sql中@Param使用詳解
這篇文章主要介紹了Mybatis動(dòng)態(tài)sql中@Param使用詳解,當(dāng)方法的參數(shù)為非自定義pojo類(lèi)型,且使用了動(dòng)態(tài)sql,那么就需要在參數(shù)前加上@Param注解,需要的朋友可以參考下2023-10-10
Springboot集成RabbitMQ死信隊(duì)列的實(shí)現(xiàn)
在大多數(shù)的MQ中間件中,都有死信隊(duì)列的概念。本文主要介紹了Springboot集成RabbitMQ死信隊(duì)列的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Java線(xiàn)程中synchronized和volatile關(guān)鍵字的區(qū)別詳解
這篇文章主要介紹了Java線(xiàn)程中synchronized和volatile關(guān)鍵字的區(qū)別詳解,synchronzied既能夠保障可見(jiàn)性,又能保證原子性,而volatile只能保證可見(jiàn)性,無(wú)法保證原子性,volatile不需要加鎖,比synchronized更輕量級(jí),不會(huì)阻塞線(xiàn)程,需要的朋友可以參考下2024-01-01
在SpringBoot環(huán)境中使用Mockito進(jìn)行單元測(cè)試的示例詳解
Mockito特別適用于在Spring Boot環(huán)境中進(jìn)行單元測(cè)試,因?yàn)樗軌蜉p松模擬Spring應(yīng)用中的服務(wù)、存儲(chǔ)庫(kù)、客戶(hù)端和其他組件,通過(guò)使用Mockito,開(kāi)發(fā)者可以模擬外部依賴(lài),從而使單元測(cè)試更加獨(dú)立和可靠,本文給大家介紹了在Spring Boot環(huán)境中使用Mockito進(jìn)行單元測(cè)試2024-01-01
SpringBoot優(yōu)雅實(shí)現(xiàn)計(jì)算方法執(zhí)行時(shí)間
這篇文章主要為大家詳細(xì)介紹了SpringBoot中優(yōu)雅實(shí)現(xiàn)計(jì)算方法執(zhí)行時(shí)間的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
聊聊Spring Boot 如何集成多個(gè) Kafka
這篇文章主要介紹了Spring Boot 集成多個(gè) Kafka的相關(guān)資料,包括配置文件,生成者和消費(fèi)者配置過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-10-10

