1. 程式人生 > 實用技巧 >mybatis入參

mybatis入參

引數替換

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; # 是引數替換