在mybatis中#{}和${}的区别

1、第一个#{}

解释:

  • 使用#{}格式的语法在mybatis中使用preparement语句来安全的设置值
 PreparedStatement ps = conn.prepareStatement(sql);
 ps.setInt(1,id);

举列子:

  • 执行sql语句:select * from user where name = #{username}
  • 参数:username :xiaowang
  • 解析后执行的sql语句:select * from user where name = ?

#方式能够很大程度上防止sql注入

2、第二个${}

解释

  • 有时你只想直接在SQL中插入一个不改变的字符串,$将传入的数据直接显示生成在sql中
       Statament st =conn.createStatement();
       ResultSet rs = st.executeSuery(sql);

举列子:
执行sql语句:select * from user where name = ${username}
参数:username= xiaoming
解析后执行的SQL语句:select * from user where name = xiaoming

sql注入的实际例子

select id from users where username = '"+username +"' and password = '"这里的username和password从前台获取,假如未对传入的数据进行验证,用户输入的是or 1= 1,执行的sql变成select id from users where username = '' or 1=1-- and password = '随便输入',由于1=1 是正确的,则直接不执行后边的验证。就离谱

3、区别

#方式能够很大程度防止sql注入,$无法防止sql注入

  • $方式一般用于传入数据库对象
  • 使用$要么不允许用户输入这些字段,要么进行转义并检验
  • 能用#就不用$
posted on 2022-08-28 22:18  热爱技术的小郑  阅读(26)  评论(0编辑  收藏  举报