MyBatis總結五:#{}和${}的用法和區別

#{}的用法:

咱們發現,在Mapper.xml映射文件中,常常使用#{屬性名} 來做爲SQL語句的佔位符,來映射Sql須要的實際參數sql

若是隻有一個參數mybatis

    <select id="getUserById" parameterType="int" resultType="User">
        select * from users where id=#{id}
    </select>

也就是說:#{}就是一個預編譯的佔位符做用,運行的時候會編譯成 ? ;但這隻適用於只有一個參數的狀況,並且這種狀況#{id}中的id能夠寫成任何字符串,好比#{abc}app

可是若是咱們有多個參數呢?url

 

若是有多個參數spa

解決方案一:按照順序用 0 1 來標誌code

    <select id="getUserByNameAndAge" resultType="User">
        select * from users where username=#{0} and age=#{1}
    </select>

解決方案二:按照順序用param1 param2 來標誌xml

    <select id="getUserByNameAndAge" resultType="User">
        select * from users where username=#{param1} and age=#{param2}
    </select>

解決方案三:利用參數blog

    <select id="getUserByNameAndAge" resultType="User">
        select * from users where username=#{username123} and age=#{age233}
    </select>
public interface UserMapper {
    public User getUserByNameAndAge(@Param("username123") String username, @Param("age233") int age);
}

這種方式是推薦方式,不過咱們須要注意的是xml和interface中的參數名稱須要對應。字符串

 

${}的用法:

${}的用法和#{}的用法不一樣在於: #{}會被編譯成?,而${}則會被原樣輸出(用在參數上,須要用param註解)get

    <select id="getUserById" parameterType="int" resultType="User">
        select * from users where id=${id}
    </select>
public interface UserMapper {
    public User getUserById(@Param("id") int id);
}

運行的時候 會直接原樣輸出,不能解決sql注入問題,可是這種狀況若是參數是字符串或者日期類型的話 須要手動加單引號 否則會報錯;

因爲是直接輸出的,因此咱們在配置mybatis-config.xml的時候 能夠用${}來能夠配置一些東西,好比:

    <!--加載外部屬性-->
    <properties resource="jdbc.properties"/>
    
    <!--運行環境能夠配置多個, default指定默認使用哪一個-->
    <environments default="development">
        <!--配置環境, id是這個環境的惟一標識-->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

 

總結:

  #是佔位符, 會對SQL進行預編譯,至關於?; $是作sql拼接, 有SQL注入的隱患 2. #不須要關注數據類型, MyBatis自動實現數據類型轉換; ${} 必須本身判斷數據類型

​   二者都支持@param註解, 指定參數名稱, 獲取參數值. 推薦這種方式

 

  通常作參數傳遞,都會使用#{}

  若是不是作預編譯,而是作拼接sql, 會使用${}, 例如表名稱的變化,或者用在其餘配置文件中

相關文章
相關標籤/搜索