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.在大多數狀況下仍是常常使用#,但在不一樣狀況下必須使用$.
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。
以參數類型爲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>