Mybatis 學習---${ }與#{ }獲取輸入參數的區別、Foreach的用法

1、Mybatis中用#{}和${}獲取輸入參數的區別

1.「#{}「和「${}」均可以從接口輸入中的map對象或者pojo對象中獲取輸入的參數值。例如java

 1 <mapper namespace="com.hh.dao.UserDao">
 2     <select id="selectByIdList" resultType="com.hh.domain.SysUser">
 3         select * from user where id=#{id} and username=#{username}  4     </select>
 5 </mapper>
 6 或者  7 
 8 <mapper namespace="com.hh.dao.UserDao">
 9     <select id="selectByIdList" resultType="com.hh.domain.SysUser">
10         select * from user where id=${id} and username=${username} 11     </select>
12 </mapper>

2.用法區別sql

  mybatis在處理${}形式時,會直接把{id}和{username}獲取的值拼接到sql中;如{id}值爲「10」,{username}值爲「張三」,即直接處理數組

select * from user where id="10" and username="張三" 

  mybatis在處理#{}形式時,會經過jdbc中的PreparedStatement先預編譯sql語句爲一個參數佔位符,以下列形式:mybatis

select * from user where id=? and username=? 

而後在用PreparedStatement把對應占位符處的值代替佔位符app

可簡單理解:dom

  ${}傳入值時,sql解析時,參數是不帶引號的。spa

  #{} 傳入值時,sql解析時,參數是帶引號code

如:name-->cy
  eg:  
  select id,name,age from student where name=#{name}   -- name='cy'

   select id,name,age from student where name=${name}   -- name=cy 

 3.#{}的形式,mybatis會先提早預編譯sql語句,而後再將參數設置到sql語句中,防止sql注入。
xml

 4.可是若是使用在order by 中就須要使用 $。對象

 5.在大多數狀況下仍是常常使用#,但在不一樣狀況下必須使用$. 

2、Foreach用法

    SQL語法中有時會使用IN關鍵字,例如id in (1,2,3).可使用${id}方式取值,但這種寫法不能給你防止SQL注入,想避免SQL注入就須要用#{}的方式,這時就要配合使用foreach標籤來知足需求。

    foreach的屬性: 

      collection:必填,值爲要迭代循環的屬性名,這個屬性值的狀況有不少。
   item:變量名,值爲從迭代對象中取出的每個值。
   index:索引的屬性名,在集合數組狀況下值爲當前索引值,當迭代循環的對象是Map類型時,這個值爲Map的key(鍵值)。
   open:整個循環內容開頭的字符串
   close:整個循環內容結尾的字符串
   separator:每次循環的分隔符
  foreach能夠對數組,Map或實現了Iterable接口(如List,Set)的對象進行遍歷。數組在處理時會轉換爲List對象,所以foreach遍歷的對象能夠分爲兩大類:Iterable類型和Map類型。這兩種類型在遍歷時狀況不同。

  1.foreach實現in集合

    foreach實現in集合(或數組)是最簡單和最經常使用的一種狀況,下面介紹如何根據傳入的用戶id集合查詢出全部符合條件的用戶。 

    1).UseMapper接口中增長以下方法:

/** *根據用戶id集合查詢 *@param idList *@return / List<SysUser> selectByIdList(List<Long> idList);

     2).在UserMapper.xml中添加以下SQL:  

<select id="selectByIdList" resultType="com.hh.domain.SysUser">
    select id,username,password from user where id in
    <foreach collection="list" open="(" close=")" separator="," item="id" index="i">
      #{id}
    </foreach>
</select>

  2..foreach實現批量插入

   1).UseMapper接口中增長以下方法:

/** *批量插入用戶信息 *@param userList *@return
*/
int insertList(List<SysUser> userList);

    2).在UserMapper.xml中添加以下SQL:

<insert id="insertList"> insert into user(id,username,password) values <foreach collection="list" item="user" separator=","> ( #{user.id},#{user.username},#{user.password} ) </foreach>
</insert>

注:經過item指定了循環變量名後,在引用值得時候使用的是「屬性.屬性」的方式,如user.id。

  3.foreach實現動態UPDATE

        以參數類型爲Map爲例來說解foreach如何實現動態UPDATE. 當參數是Map類型的時候,foreach標籤的index屬性值對應的不是索引值,而是Map中的key,利用這個key能夠實現動態UPDATE.

    1).UseMapper接口中增長以下方法:

/** *經過Map更新列 *@param map *@return
*/
int updateByMap(Map<String,Object> map);

    2).在UserMapper.xml中添加以下SQL:

<update id="updateByMap"> update user set <foreach collection="_parameter" item="val" index="key" separator=","> ${key} = #{val} </foreach> where id=#{id} </update>
相關文章
相關標籤/搜索