jdbc操作数据库Statement和prepareStatement的区别

Statement和prepareStatement的区别

[size=x-large]两个接口都是用来实现,然后将sql语句传入实现后的对象,并通过对象发送给数据库,但是两种方式又有很大的区别。接下来就说一下它们两个的区别。

首先从它们的实例化方式来说:

Statement的实例化方式是通过Conection的实例调用createStatement方法来完成的;
而prepareStatement是Conection的实例调用prepareStatement方法来返回一个prepareStatement的对象。

再来说他们发送sql语句的方法:
Statement会调用它的executeQuery方法,将sql语句以字符串的形式传入这个方法中,这个方法会返回数据库的结果集。这种方式调用一次方法只能传入一段确定的sql语句,因为这段sql语句是确定的,所以它只是满足了该次调用的需求,无法进行复用,如果需要写入其他的sql语句就要重新键入新的sql语句。如以下代码:


Statement statement=Conection.creatStatement ();
ResultSet resultset=Statement .executeQuery(“select name from table;”);//name为列名,table代表表名



而PrepareStament的方式呢,它在创建对象时就要将所用到的sql语句作为参数传入其中,被传入的sql语句并不是准确的sql语句,它所传入的sql语句可以说是个sql填空题,这里会用到“?”这个占位符。

代码如下:
PreareStatement prearestatement =Connection.preareStatement(“select ? from table;”);


可以看到在向PrepareStament的实例传入的sql语句并不是一个完整的sql语句。所以我们可以再调用PreareStatement 的setInt和setString还有setDate等方法来向“?”所在的位置传入值,这样就可以组成一个完整的sql语句。代码如下:

prearestatement.setString(1,“sex”);//这里的1为占位符的角标,从一开始,sex是向占位符处所传入的数据。这里的String代表的是传入的数据的类型。

之后再调用PrepareStament的executeUpdate方法来获取一个ResultSet对象,
ResultSet resultset=prearestatement.executeUpdate();


当然了上面示例代码里只用了一个占位符来举例,其实占位符可以有多个,只要你能够灵活的运用PrepareStament的各种set方法来组成一个合适的sql语句,就能完成一次sql操作并返回一个结果集ResultSet 的对象。

可以看出PrepareStatement的方式更为灵活,达到了一次编译多次复用,PrepareStatement会把先传入的sql语句传到数据库中进行预编译,这种方式对于批量处理sql语句可以提高很多的效率。

还有最后一方面就是安全性的问题,
PrepareStatement的方式可以隔绝一些数据本身的漏洞攻击。具体是怎样的攻击,我暂时没细研究,所以就到这里了!
[/size]

猜你喜欢

转载自201610222643.iteye.com/blog/2341251