mybatis入參
阿新 • • 發佈:2020-08-27
引數替換
dao層的引數,是如何傳入到xml中的sql語句的呢?
map傳遞
dao層介面引數為map,xml中可以直接通過map中的key,來繫結引數
假設傳入的引數為兩個,uname, password
public User selectUser(Map paramMap);
對應的xml為
<select id=" selectUser" resultMap="BaseResultMap"> select * from users where uname = #{uname,jdbcType=VARCHAR} and password=#{password,jdbcType=VARCHAR} </select>
引數位置替換
這種是直接根據引數的索引位置來繫結, {0} 表示第一個引數, {1} 表示第二個引數
public User selectUser(String uname, String password);
對應的xml
<select id=" selectUser" resultMap="BaseResultMap">
select * from users where uname = #{0} and password=#{1}
</select>
註解指定方式
通過 @Param註解,直接指定name,在sql中即可通過name方式引用
public User selectUser(@Param("uname") String uname, @Param("password") String password);
對應的sql為
<select id=" selectUser" resultMap="BaseResultMap"> select * from users where uname = #{uname,jdbcType=VARCHAR} and password=#{password,jdbcType=VARCHAR} </select>
$、#區別
使用#傳入引數是,sql語句解析是會加上"",
比如 select * from table where name = #{name}
,傳入的name為小李,那麼最後打印出來的就是
select * from table where name = "小李"
,就是會當成字串來解析
因此在動態排序時,比如 order by column
,這個時候務必要用${},因為如果你使用了#{}
區別
#
將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號$
將傳入的資料直接顯示生成在sql中#
方式能夠很大程度防止sql注入$
方式無法防止Sql注入$
方式一般用於傳入資料庫物件,例如傳入表名,列名
簡單來說,兩者區別: $ 是sql替換,直接拼成一條可執行sql; # 是引數替換