当前位置: 首页 > 面试题库 >

Java声明和PreparedStatement之间的区别

慕容高卓
2023-03-14
问题内容

“ Prepared Statement”是Statement的稍强版本,并且应始终至少与Statement一样快捷且易于处理。
准备好的语句可能已参数化

大多数关系数据库通过四个步骤来处理JDBC / SQL查询:

  1. 解析传入的SQL查询
  2. 编译SQL查询
  3. 规划/优化数据采集路径
  4. 执行优化的查询/获取并返回数据

对于发送到数据库的每个SQL查询,一个Statement将始终执行上述四个步骤。一条Prepared Statement预执行上述执行过程中的步骤(1)-(3)。因此,在创建Prepared Statement时,会立即执行一些预优化。这样做的目的是减轻执行时数据库引擎的负担。

现在我的问题是-“使用预处理语句还有其他好处吗?”


问题答案:

优点PreparedStatement:

  • SQL语句的预编译和DB端缓存可提高整体执行速度,并具有批量重用同一SQL语句的能力。

  • 通过内置对引号和其他特殊字符的转义,自动防止SQL注入 攻击。请注意,这要求你使用任何PreparedStatement setXxx()方法来设置值

preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)");
preparedStatement.setString(1, person.getName());
preparedStatement.setString(2, person.getEmail());
preparedStatement.setTimestamp(3, new Timestamp(person.getBirthdate().getTime()));
preparedStatement.setBinaryStream(4, person.getPhoto());
preparedStatement.executeUpdate();

因此不要通过字符串连接来内联SQL字符串中的值。

preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email) VALUES ('" + person.getName() + "', '" + person.getEmail() + "'");
preparedStatement.executeUpdate();
  • 简化的SQL字符串非标准的Java对象的设置,例如Date,Time,Timestamp,BigDecimal,InputStream(Blob)和Reader(Clob)。在大多数类型中,你不能toString()像在简单类型中那样“仅仅”执行a Statement。你甚至可以将其全部重构为PreparedStatement#setObject()在循环内部使用,如下面的实用程序方法所示:
public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
}

可以如下使用:

preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)");
setValues(preparedStatement, person.getName(), person.getEmail(), new Timestamp(person.getBirthdate().getTime()), person.getPhoto());
preparedStatement.executeUpdate();


 类似资料:
  • 本文向大家介绍Java中定义和声明之间的区别。,包括了Java中定义和声明之间的区别。的使用技巧和注意事项,需要的朋友参考一下 对于定义和声明之间的区别,应该首先考虑其字面含义,其中包括声明或声明的“声明”方法,而描述某些实体的“定义”方法。 以下是定义和声明之间的重要区别。 序号 键 声明 定义 1 概念 声明的概念包括通知编译器有关变量的属性,例如变量的名称,其持有的值的类型以及初始值(如果有

  • 问题内容: 两者的含义使我难以理解。 问题答案: 甲声明引入的标识符和描述了它的类型,无论是类型,对象,或功能。声明是编译器需要接受对该标识符的引用的内容。这些是声明: 甲定义实际实例化/器具该标识符。这是什么样的连接器需要以链接引用这些实体。这些是与上述声明相对应的定义: 可以使用定义代替声明。 可以根据需要多次声明标识符。因此,以下内容在C和C ++中是合法的: 但是,必须定义一次。如果忘记定

  • 问题内容: JUnit框架包含2个类(显然是在不同的包中),每个类的方法似乎非常相似。有人可以解释为什么吗? 我要参考的类是:和。 问题答案: (JUnit 3的)旧方法是通过扩展标记测试类。那继承了它自己,并且您的测试类获得了以这种方式调用assert方法的能力。 从JUnit版本4开始,该框架用于标记测试。因此,您不再需要扩展。但这意味着,断言方法不可用。但是您可以静态导入新类。这就是为什么新

  • 问题内容: 最近,我一直在研究有关Facebook JavaScript库React.js的功能和使用方法。当其差异说话的JavaScript的世界往往是两种编程风格的休息和被mentionned。 两者有什么区别? 问题答案: 声明式的样式(如react所具有的样式)允许您通过说“它看起来像这样”来控制应用程序中的流程和状态。命令式风格可以解决这个问题,并允许您通过说“这是您应该做的”来控制应用

  • 问题内容: public class SomeClass { private HashSet contents = new HashSet (); private Set contents2 = new HashSet (); } 有什么不同?最终它们都是不是吗?第二个对我来说似乎是错误的,但是我看到它经常被使用,接受和工作。 问题答案: 是一个接口,并且是实现该接口的类。 将变量声明为类型意味着

  • 问题内容: 声明这样的数组之间的真正区别是什么: 和 问题答案: 有所不同,但在该示例中没有区别。 使用更冗长的方法:在参数中确实有一个额外的选择:如果将数字传递给构造函数,则将获得该长度的数组: 为了说明创建数组的不同方法: 另一个区别是,使用时,您可以设置数组的大小,这会影响堆栈的大小。如果您遇到堆栈溢出(Array.push与Array.unshift的性能)(当数组的大小超过堆栈的大小并必