• 【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’=‘1and pw =1’ OR ‘1’=‘1’;”
    

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

    preparedStatement和Statement处理的SQL语句区别

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

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

    1. insert into table values(0,‘first’,1);
    2. 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.

    示例:

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

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

            

  • 相关阅读:
    Android EditText 实现强制性弹出只能输入英文的键盘
    CC21 包围区域
    Python实现基于DMN开发的问答系统
    Kettle入门教程
    Node.js躬行记(19)——KOA源码分析(上)
    阿里云云安全中心支持哪些功能?费用价格是否值得买?
    Java常用的设计模式,如单例模式、工厂模式、观察者模式等
    【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署
    一篇文章告诉你,为什么必须要学Excel?
    前端从零到一开发vscode插件并发布到插件市场
  • 原文地址:https://blog.csdn.net/m0_64231944/article/details/127887654