Jdbc中的Statement 和PreparedStatement

1.Statement

Statement对象用于将SQL语句发送到数据库中,执行对数据库的检索或更新,它有两个子接口:CallableStatement和PreparedStatement。

2.PreparedStatement

Statement主要用于执行静态的SQL语句,如果有写操作只有SQL语句中的某些参数有所不同,其余的SQL子句皆相同,则可以使用PreparedStatement来提高执行的效率,可以使用Connection和PreparedStatement()方法建立好一个预先编译的SQL语句:其中的参数会变动的部分先用“?”作为占位符。

PreparedStatement是在执行前先输入sql语句,Statement正好相反,是在执行的时候传入sql语句的。
这样的区别在于,PreparedStatement可以在传入sql后,执行语句前,给参数赋值,避免了因普通的拼接sql字符串语句所带来的安全问题,Statement存在sql注入问题。而且准备sql和执行sql是在两个语句里面完成的,也提高了语句执行的效率。

3.sql语句注入问题


SQL注入是利用某些系统没有对用户输入数据进行充分的验证的情况下,用户输入了恶意的SQL命令,导致数据库完成了错误的命令,或者导致数据库崩溃的方法。

下面是一个实例:

Java代码:

如果这里传进来的是  String name = "'1' or '1'='1'";
拼接出来的SQL语句中where语句后面的条件是(select * from ATable where name='1' or '1'='1')永远都是成立。这会使Statement出现不可预料的结果。

为了解决这个问题。我们可以使用PrepareStatement。对上面没有验证的语句进行验证。

 

PreparedStatement继承了Statement,没有了SQL注入的问题。(preparedStatement进行了预编译。)

如果使用预编译语句.传入的任何内容就不会和原来的语句发生任何匹配的关系.

只要全使用预编译语句,你就用不着对传入的数据做任何过虑.

而如果使用普通的statement,就要对drop等做费尽心机的判断和过虑.

如上面的程序:state = conn.prepareStatement(sql);

state 对象包含语句"select * from ATable where name=?",它已发送给DBMS,并为执行作好了准备。

设定参数:state.setString(1, name);
一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters 方法清除它为止。

在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值