<select id="queryDataRefId" parameterType="map" resultType="my.entity.News">
select news_id, news_content, news_time from my_news where news_id > ${index} 
order by ${order}
</select><select id="queryDataRefId" parameterType="map" resultType="my.entity.News">
select news_id, news_content, news_time from my_news where news_id > #{index} 
order by #{order}
</select>java如下
Map<String, Object> map = new HashMap<>();
map.put("index", 20);
map.put("order", "news_id");
List<News> list = session.selectList("queryDataRefId", map);
for (News news : list) {
System.out.println(news);
}
我写了一个实体类,再用MyBatis框架, 在写这个sql的时候,发现了问题,这两种方式,为什么第一种就会按照我的要求走,而走后边这种预编译参数的时候,就不按我的where和order by 走呢?

解决方案 »

  1.   

    $相当于直接拼sql,#会做注入校验,并把你的传入值转换为字符串。order by #{order}相当于  order by '一个常量'
      

  2.   

    ${param} 是不加引号的
    #{param} 会在参数两边添加引号
    举个我曾经碰到的栗子:--param = 1,2,3,4,5
    select * 
    from user
    where 1=1
    and user_id in (${param})上面的写法就是正确的,解析成SQL就是 user_id in (1,2,3,4,5)
    下面这个就是错的,会被解析成 user_id in ("1,2,3,4,5"):--param = 1,2,3,4,5
    select * 
    from user
    where 1=1
    and user_id in (#{param})