sql注入:的片段。达到篡改程序中sql语句。 在页面中输入sql
正常情况:
select * from user where username='zhangsan' and password = '123456';
当sql被注入之后的语句:
select * from user where username='zhangsan' and password = '' or '1'='1'
造成系统的不安全不保密。
解决方案:
对sql进行预编译处理,sql的格式固定。可以放置预编译。
PrepareStatment 进行了预编译的处理,当下次执行相同格式的sql的时候,sql不会在进行编译。比statement的效率高。
statement每执行一次sql进行一次编译。
注意:sql提前创建好的。sql语句中需要参数。使用?进行站位。
举例:
select *from user where username=zhangsan and password = 123456;
使用?进行站位
select * from user where username=? and password=?
1、conn.prepareStatement(sql); -----需要你事先传递sql。如果sql需要参数,使用?进行占位。
2、设置参数(执行sql之前):prepStmt.setXXX(int index, 要放入的值) -----根据不同类型的数据进行方法的选择。第一个参数表示的是?出现的位置。从1开始计数
有几个问号,就需要传递接个参数。
方法的参数说明:
第一个参数:int index ;表示的是问号出现的位置。 问号是从1开始计数
第二个参数:要问号的位置传入的值。
3、执行,不需要在传递sql了。
prepStmt.executeQuery();---执行select
prepStmt.executeUpdate();---执行insert,delete,update
prepardeStatement的优点:
PreparedStatement是Statement的子接口,它的实例对象可以通过调用Connection.preparedStatement(sql)方法获得,相对于Statement对象而言:
PreperedStatement可以避免SQL注入的问题。
Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。
并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。方便阅读。
使代码的可读性更高。
以后在企业中几乎都是用PreparedStatement