一、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>