一、Sql取值的两种形式
1.#{} - sql预编译取值
2.${} 直接字符串替换取值
二、使用方法
#{}使用预编译的方式,我们可以防止sql注入,我们平时使用的时候尽量使用这个,但是${}可以我们可以进行sql语句查询的拼接。
在这里解释一下什么是sql注入,就是黑客在搜索框输入与sql语句有关的字符串,后台接收进行数据查询,出现数据泄露的情况。
使用方法如下图:
Java代码,注意order使用
@Test
public void testFindByTitle(){
SqlSession session = null;
//openSession创建一个新的SqlSession对象,SqlSession提供了增删改查的方法调用
try {
session = sqlSessionFactory.openSession();
Map param = new HashMap();
param.put("title", "'' or 1 =1 or title = '【德国】爱他美婴幼儿配方奶粉1段800g*2罐 铂金版'");
param.put("order", " order by title desc");
List<Goods> list = session.selectList("goods.findByTitle" , param);
for (Goods goods : list) {
System.out.println(goods.getTitle() + "-" + goods.getCurrentPrice());
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (session != null) {
//将Connection归还到连接池供其他Session重用
session.close();
}
}
}
xml文件中sql语句
<!--
SQL注入
select * from t_goods
where title = '' or 1 =1 or title = '【德国】爱他美婴幼儿配方奶粉1段800g*2罐 铂金版'
${}如无必要,不要使用
#{}预编译传值,使用预编译传值可以预防SQL注入
select * from t_goods
where title = "'' or 1 =1 or title = '【德国】爱他美婴幼儿配方奶粉1段800g*2罐 铂金版'"
-->
<select id="findByTitle" parameterType="java.util.Map" resultType="com.itlaoqi.mybatis.entity.Goods">
select * from t_goods
where title = #{title}
${order}
</select>