在實際開發中,大多數狀況下都須要對 SQL 傳入參數以得到想要的結果集,傳入的狀況分爲兩種狀況:java
${}
包裹參數,mybati 直接對其進行字符串替換?
做爲佔位符來代替參數,在 mybatis 中使用 #{}
包裹參數,使用佔位符有如下幾點好處:
對於開發人員而言,可以使用 #{} 傳入參數的狀況都應該採用這種形式。spring
在 xml 中寫 SQL 的時候注意到 parameterType
參數,剛接觸的時候就有疑惑,若是有多個參數該如何指定。原來這是一個可選參數,Mybatis 自己就能夠經過 TypeHandler 推斷出具體傳入語句的參數。數據庫
總結經過接口方法傳入參數的狀況:bash
@Param
註解,或者使用 '-parameters' 編譯選項並啓用 useActualParamName 選項(默認開啓)來編譯項目Javabean
,在SQL中引用參數的時候能夠直接使用屬性訪問符,而無需經過 get 方法。eg: #{Javabean.id}
有時候爲了將表名或者 schema 可配置化,將變量寫到配置文件中,避免將來表名變化形成大的改動。mybatis
首先若是是做爲全局的參數,能夠將配置文件中的參數都寫入到 Javabean 中,使用的時候經過接口 Mapper 傳入便可。在 Spring 中app
PropertiesFactoryBean
指定配置文件路徑,指定 id<bean id="exampleid" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<array>
<value>classpath:<name>.properties</value>
</array>
</property>
</bean>
複製代碼
@Component("exampleProperty")
public class ExampleProperty {
@Value("#{exampleid['name']}")
public String name;
...
}
複製代碼
@Resource
private ExampleProperty exampleProperty;
複製代碼
若是不是做爲全局參數,而只是在 SQL 中使用,則能夠經過 mybatis 的配置文件 mybatis-config.xml 引入,這裏引入的變量全部 SQL 的 xml 中均可以經過 ${} 的方式引入。ui
<properties resource="<name>.properties">
<property name="name" value="exampleName"/>
<property name="id" value="exampleId"/>
...
</properties>
複製代碼
參數加載的順序以下spa
另外須要注意的是經過 mybatis-config.xml 設定的參數,在 SQL 中沒法直接使用 #{} 的方式引入,而有時候又想要用佔位符的方式進行預編譯,除了使用接口 Mapper 傳入參數外,還可使用<bind>
code
bind 元素能夠從 OGNL 表達式中建立一個變量並將其綁定到上下文xml
<mapper namespace="**.ExampleMapper">
<select id="" resultType="string">
<bind name="id" value="'${id}'"/>
SELECT * FROM ××.××
WHERE ID = #{id}
...
</select>
</mapper>
複製代碼