1. PreparedStatement 与 Statement 是用来干什么的?
PreparedStatement 和Statement 都可以对sql语句进行编译并返回编译后的标识。
2. PreparedStatement 的优点?
1. 有效防止sql注入。
2. 预编译,比statement执行效率高(一次编译多次执行)
3. 使用参数设置可读性好。
3. 什么是sql注入?
用户在前端页面用输入恶意的sql语句,欺骗服务器执行恶意的sql代码,导致数据库泄漏,这就是sql注入。例如:
select * from user where name = ‘${name}’
如果传入参数张三’ or 1=’1,用户就可以在不知道名字的情况下获取到所有数据。
4. PrepareStatement是如何防止sql注入的?
PrepareStatement 会对参数的每一位字符进行遍历,发现出现换行符、引号、斜杠等特殊字符,就会进行转义。转义后上述的sql注入将会失效。
转义前:select * from user where name = ‘张三’ or 1=’1’;
转义后: select * from user where name = ‘张三\’ or 1 = \’1’;
显然,转义后的sql语句查询结果为空。除非有奇葩名字叫“张三’ or 1 = ’1”。
参考文献:防sql注入原理