陈述与预备陈述的区别

陈述与预备陈述的区别

准备好的语句是语句的一个稍微更强大的版本,并且应该始终与语句一样快速和容易处理。
准备好的报表可能是参数化的。

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

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

对于发送到数据库的每个SQL查询,一条语句将始终执行上述四个步骤。准备好的语句预执行上述执行过程中的步骤(1)-(3)。因此,在创建准备好的语句时,会立即执行一些预优化。其效果是在执行时减少数据库引擎的负载。

现在我的问题是-“使用预先准备的陈述还有其他好处吗?”


当年话下
浏览 419回答 3
3回答

慕尼黑5688855

a的优点PreparedStatement:预编译和sql语句的DB端缓存将导致总体上更快的执行和重用批次.自动预防SQL注入&nbsp;攻击通过内置转义引号和其他特殊字符。请注意,这要求您使用任何PreparedStatement&nbsp;setXxx()方法来设置值。preparedStatement&nbsp;=&nbsp;connection.prepareStatement("INSERT&nbsp;INTO&nbsp;Person&nbsp;(name,&nbsp;email,&nbsp;birthdate,&nbsp;photo)&nbsp;VALUES&nbsp;(?,&nbsp;?,&nbsp;?,&nbsp;?)"); preparedStatement.setString(1,&nbsp;person.getName());preparedStatement.setString(2,&nbsp;person.getEmail()); preparedStatement.setTimestamp(3,&nbsp;new&nbsp;Timestamp(person.getBirthdate().getTime())); preparedStatement.setBinaryStream(4,&nbsp;person.getPhoto());preparedStatement.executeUpdate();因此别通过字符串连接将SQL字符串中的值内联。preparedStatement&nbsp;=&nbsp;connection.prepareStatement("INSERT&nbsp;INTO&nbsp;Person&nbsp;(name,&nbsp;email)&nbsp; VALUES&nbsp;('"&nbsp;+&nbsp;person.getName()&nbsp;+&nbsp;"',&nbsp;'"&nbsp;+&nbsp;person.getEmail()&nbsp;+&nbsp;"'");preparedStatement.executeUpdate();简化了SQL字符串中非标准Java对象的设置。Date,&nbsp;Time,&nbsp;Timestamp,&nbsp;BigDecimal,&nbsp;InputStream&nbsp;(Blob)和Reader&nbsp;(Clob)。在大多数这些类型中,您不能“只做”一个toString()就像你在一个简单的Statement..您甚至可以将其全部重构为PreparedStatement#setObject()在循环内部,如下面的实用程序方法所示:public&nbsp;static&nbsp;void&nbsp;setValues(PreparedStatement&nbsp;preparedStatement,&nbsp;Object...&nbsp;values)&nbsp;throws&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;values.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preparedStatement.setObject(i&nbsp;+&nbsp;1,&nbsp;values[i]); &nbsp;&nbsp;&nbsp;&nbsp;}}如下所示:preparedStatement&nbsp;=&nbsp;connection.prepareStatement("INSERT&nbsp;INTO&nbsp;Person&nbsp;(name,&nbsp;email,&nbsp;birthdate,&nbsp;photo)&nbsp; VALUES&nbsp;(?,&nbsp;?,&nbsp;?,&nbsp;?)");setValues(preparedStatement,&nbsp;person.getName(),&nbsp;person.getEmail(),&nbsp; new&nbsp;Timestamp(person.getBirthdate().getTime()),&nbsp;person.getPhoto());preparedStatement.executeUpdate();

隔江千里

PreparedStatement是一种很好的防御(但不是万无一失)。SQL注入攻击..绑定参数值是防范“小波比桌”进行一次不受欢迎的访问。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java