Mybatis參數傳遞

在實際開發中,大多數狀況下都須要對 SQL 傳入參數以得到想要的結果集,傳入的狀況分爲兩種狀況:java

  1. SQL語句的拼接,好比表名、like 條件等;在 mybatis 中使用 ${} 包裹參數,mybati 直接對其進行字符串替換
  2. SQL 中做爲條件輸入的參數,這種狀況下,SQL 容許使用 ? 做爲佔位符來代替參數,在 mybatis 中使用 #{} 包裹參數,使用佔位符有如下幾點好處:
    • mybatis 會對包裹的變量進行轉義和類型檢查,避免以 SQL 注入的方式攻擊數據庫
    • 默認狀況下,mybatis 採用的是預編譯的方式,對於數據庫而言 SQL 自己沒有變化,變化的是傳入的參數,數據庫只會編譯一次,而不會由於做爲條件的參數變化而從新編譯,節約了 SQL 執行總時間

對於開發人員而言,可以使用 #{} 傳入參數的狀況都應該採用這種形式。spring

傳入參數

接口 Mapper 傳入參數

在 xml 中寫 SQL 的時候注意到 parameterType 參數,剛接觸的時候就有疑惑,若是有多個參數該如何指定。原來這是一個可選參數,Mybatis 自己就能夠經過 TypeHandler 推斷出具體傳入語句的參數。數據庫

總結經過接口方法傳入參數的狀況:bash

  • 參數使用添加@Param註解,或者使用 '-parameters' 編譯選項並啓用 useActualParamName 選項(默認開啓)來編譯項目
  • 特別的,若是參數是Javabean,在SQL中引用參數的時候能夠直接使用屬性訪問符,而無需經過 get 方法。eg: #{Javabean.id}

配置文件傳入參數

有時候爲了將表名或者 schema 可配置化,將變量寫到配置文件中,避免將來表名變化形成大的改動。mybatis

全局變量

首先若是是做爲全局的參數,能夠將配置文件中的參數都寫入到 Javabean 中,使用的時候經過接口 Mapper 傳入便可。在 Spring 中app

  1. 在 Spring 配置文件中,使用 PropertiesFactoryBean 指定配置文件路徑,指定 id
  2. 在 Javabean 文件中使用經過 @Value("#{id['name']}") 設置變量,並使用 @Component 註解該Javabean
  3. 在接口 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 中均可以經過 ${} 的方式引入。ui

  • mybatis-config.xml
<properties resource="<name>.properties">
        <property name="name" value="exampleName"/>
        <property name="id" value="exampleId"/>
        ...
    </properties>
複製代碼

參數加載的順序以下spa

  1. 首先包裹的參數做爲默認值(推薦引入配置文件的同時也設定默認參數)
  2. 加載 resource 中指定的配置文件,若是已指定了該參數則覆蓋
  3. 若是經過接口 Mapper 傳入了同名參數,接口 Mapper 傳入的參數覆蓋原有參數值

另外須要注意的是經過 mybatis-config.xml 設定的參數,在 SQL 中沒法直接使用 #{} 的方式引入,而有時候又想要用佔位符的方式進行預編譯,除了使用接口 Mapper 傳入參數外,還可使用<bind>code

bind 元素能夠從 OGNL 表達式中建立一個變量並將其綁定到上下文xml

  • ExampleSQL.xml
<mapper namespace="**.ExampleMapper">
        <select id="" resultType="string">
            <bind name="id" value="'${id}'"/>
            SELECT * FROM ××.×× 
            WHERE ID = #{id}
            ...
        </select>
    </mapper>
複製代碼
相關文章
相關標籤/搜索