【JDBC篇】 preparedStatement和Statement区别

   

目录

preparedStatement和Statement的作用

PreparedStatement vs Statement

preparedStatement和Statement处理的SQL语句区别


        我们想要区别preparedStatement和Statement,就必须知道他们两个是干嘛的?我自己就是一味地区别两者,却不清楚他们两个的作用;

preparedStatement和Statement的作用

        Statement是 Java 执行数据库操作的一个重要接口,preparedStatement则是statement的一个子接口,二者都用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。

PreparedStatement vs Statement

1,使用preparedStatement可以提高代码的可读性和可维护性。

2,PreparedStatement 能最大可能提高性能:

        DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。

        在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意.事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译一次。 (语法检查,语义检查,翻译成二进制命令,缓存)

3,PreparedStatement 可以防止 SQL 注入,下面语句就会造成SQL注入问题

SQL = “SELECT * FROM users WHERE name = ‘1’ OR ‘1’=‘1’ and pw = ‘1’ OR ‘1’=‘1’;”

        因为语句中的WHERE条件恒为真,这就相当于执行,也就是说你尽管没有账号和密码课可以进入数据库并操作数据; 

preparedStatement和Statement处理的SQL语句区别

        Statement对象,用于执行不带参数的简单SQL语句(或者可以理解为用于执行静态 SQL 语句并返回它所生成结果的对象),而preparedStatement则处理的是带参数的,或者说动态的SQL语句;

        如何理解这个动态和静态SQL语句呢?我们看以下需求:我们在向表中插入数据时经常需要反复执行一条结构相似的sql语句,比如:

insert into table values(0,‘first’,1);
insert into table values(0,‘second’,2);

        当我们需要通过JDBC 向数据库中插入上万条数据时,如果我们使用上面的方法我们就需要编写结构相似的代码近上万遍,这样显得非常笨,如何解决呢?我们可以看出这些代码中仅仅只是参数不同,代码的整体结构却是相同的,我们就想到用参数化的思想去替换他们,——使用带占位符的sql来代替它:

insert into table values(0,?,?);

        然后每次传入参数即可替换占位符“?”即可,但是Statement中是不允许使用占位符“?”的,更没有带参数。而且更重要的是PreparedStatement会预编译sql语句,把预编译后的sql语句存到对象中,那么这样每次传入参数执行查询等操作会变得非常高效,也就是说PreparedStatement比Statement高效。

        PreparedStatement中提供了一系列的setXxx(int index, Xxx value)方法来传入参数。

        后面的SQL语句中,多了一个"?"号,“?”又叫占位符,我们可以动态的去设置任一值替换它(就好比给别人占了座位一样),“?”就是好比参数;

注意:

        占位符的索引位置从1开始而不是0,如果填入0会导致java.sql.SQLException invalid column index异常。假如PreparedStatement中的SQL语句有两个占位符,那么第一个参数的索引时1,第二个参数的索引是2.

示例:

String sql="insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)";
ps = con.prepareStatement(sql);
ps.setString(1,var1);
ps.setString(2,var2);
ps.setString(3,var3);
ps.setString(4,var4);
ps.executeUpdate();

这样也就提高代码的利用率和内存效率,防止代码的冗余,也提代码了高安全性;

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值