Mybaits中#{}与${}的区别

  在mybaits中#{}和${}都可以用来传递参数,那么他们有何不同呢,下面来看看他们的是如何执行的,相信你看了之后就会明白他们的区别了。
  #{}的方式:
  XML文件配置的sql如下:

<select id="findCommodityByKeyword" resultMap="BaseResultMap">
	SELECT * FROM d_commodity 
	<if test="keyword != null">
		WHERE commodity_name LIKE CONCAT('%',#{keyword,jdbcType=VARCHAR},'%') 
     	OR commodity_type_id IN 
     		(SELECT d_commodity_type.commodity_type_id 
     		FROM d_commodity_type 
     		WHERE commodity_type_name = #{keyword,jdbcType=VARCHAR}) 
	if> 
	LIMIT #{startIndex,jdbcType=INTEGER},#{pageSize,jdbcType=INTEGER} 
select>

  执行后控制台输出的sql如下:

SELECT * FROM d_commodity 
WHERE commodity_name LIKE CONCAT('%',?,'%') 
OR commodity_type_id IN 
     (SELECT d_commodity_type.commodity_type_id 
     FROM d_commodity_type 
     WHERE commodity_type_name = ?) 
LIMIT ?,? 

  可以看出使用#{}的方式是通过设置占位符的形式在后面把参数设置上去的。类似下面中设置方式:

PreparedStatement ps = con.prepareStatement(sql);
ps.setString(0, keyword);
ps.setString(1, keyword);
ResultSet rs = ps.executeQuery();

  ${}的方式:
  XML文件配置的sql如下:

<select id="findCommodityByKeyword" resultMap="BaseResultMap">
	SELECT * FROM d_commodity 
	<if test="keyword != null">
		WHERE commodity_name LIKE CONCAT('%',#{keyword,jdbcType=VARCHAR},'%') 
     	OR commodity_type_id IN 
     		(SELECT d_commodity_type.commodity_type_id 
     		FROM d_commodity_type 
     		WHERE commodity_type_name = #{keyword,jdbcType=VARCHAR}) 
	if>
     ORDER BY ${sortField} ${sortType}  
	LIMIT #{startIndex,jdbcType=INTEGER},#{pageSize,jdbcType=INTEGER} 
select>

  执行后控制台输出的sql如下:

SELECT * FROM d_commodity 
WHERE commodity_name LIKE CONCAT('%',?,'%') 
OR commodity_type_id IN 
     SELECT d_commodity_type.commodity_type_id 
     FROM d_commodity_type 
     WHERE commodity_type_name = ?) 
ORDER BY sale DESC
LIMIT ?,? 

  咦,怎么就变成了sale DESC 呢,那是因为我传入的参数sortField= sale,sortType= DESC,可以看出使用$ {}在执行的时候并没有给我设置占位符,而是直接将两个参数的值直接代入到了sql语句中,所以如果使用${}的话并不会进过像使用#{}那样的设置占位符并且在设置参数的过程。使用#{}会把参数的值直接代入到sql语句中,然后就通过ResultSet rs = ps.executeQuery();执行sql语句得到结果。

   通过了解两种方式的执行过程,可以知道使用#{}设置参数要更为安全一些,他会通过设置占位符,在根据所给的参数类型给占位符设置参数。而${}则是直接将参数代入,这样会有sql注入的安全问题。建议在项目中能不用 $ {}就不用,如果非要用的话建议代入的参数值要在后台给几个固定值供它选择使用而不是前台能够控制参数值。${}常用在ORDER BY语句中。

你可能感兴趣的:(基础知识小结)