在学习数据库编程时,我们都知道在执行SQL命令时,有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。而熟悉JDBC编程的大侠们都会选择使用PreparedStatement对象,主要因为使用预编译对象PreparedStatement时,有以下几个优点:
首先是效率性
PreparedStatement可以尽可能的提高访问数据库的性能,我们都知道数据库在处理SQL语句时都有一个预编译的过程,而预编译对象就是把一些格式固定的SQL编译后,存放在内存池中即数据库缓冲池,当我们再次执行相同的SQL语句时就不需要预编译的过程了,只需DBMS运行SQL语句。所以当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,特别是的大型的数据库中,它可以有效的也加快了访问数据库的速度。
其次,使用PreparedStatement对象可以大大提高代码的可读性和可维护性
例如我们在向数据库插入数据:
一种是使用Statement对象
java.sql.Statement stmt=conn.createStatement();
stmt.executeUpdate("insert into student (name,id,number,count) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
另一种是使用PreparedStatement对象
String sql ="insert into student values(null,?,?,?)";
java.sql.PreparedStatement pstmt=conn.preparedStatement(sql);
pstmt.setString(1,var1);
pstmt.setString(2,var2);
pstmt.setString(3,var3);
pstmt.setString(4,var4);
pstmt.executeUpdate();
使用占位符?代替
将参数与SQL语句分离出来,这样就可以方便对程序的更改和延续,同样,也可以减少不必要的错误。
最后就是安全性了。
以下转自百度文库:传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。
当处理公共Web站点上的用户传来的数据的时候,安全性的问题就变得极为重要。传递给PreparedStatement的字符串参数会自动被驱动器忽略。最简单的情况下,这就意味着当你的程序试着将字符串“D'Angelo”插入到VARCHAR2中时,该语句将不会识别第一个“,”,从而导致悲惨的失败。几乎很少有必要创建你自己的字符串忽略代码。
在Web环境中,有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序。特别是在公共Web站点上,在没有首先通过PreparedStatement对象处理的情况下,所有的用户输入都不应该传递给SQL语句。此外,在用户有机会修改SQL语句的地方,如HTML的隐藏区域或一个查询字符串上,SQL语句都不应该被显示出来。
在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。
分享到:
相关推荐
注意: 如果应用程序必须在 JRE 6.0 上运行,即使该应用程序不使用 JDBC 4.0 功能,也应使用 sqljdbc4.jar。 请注意,尽管驱动程序旨在与所有主要的 Sun 等效 Java 虚拟机一起工作并由这些虚拟机支持,但却是在 Sun...
sqljdbc.jar 类库要求使用 5.0 版的 Java 运行时环境 (JRE)。连接到数据库时,在 JRE 6.0 上使用 sqljdbc.jar 会引发异常。 注意: JDBC Driver 2.0 不支持 JRE 1.4。使用 JDBC Driver 2.0 时必须将 JRE 1.4 升级至...
sqlserver各版本驱动 DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回...PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)
本文为大家分享了MySQL预编译功能,供大家参考,具体内容如下 1、预编译的好处 大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它有什么好处呢?...如果使用预编译功能
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句
PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程,下面这篇文章主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
但是jdbc对应操作date类型的数据和hibernate是不同的,hibernate不需要考虑date是util .date还是sql.date也不需要考虑存入的date是否存有时分秒了。
JDBC规范 ... PrepareStatement:预编译语句,性能更好 CallableStatement:调用存储过程 ResultSet:结果集,封装了多条记录 JDBC数据库连接池/Connection Pool DBCP:apache tomcat内置
java.sql.PreparedStatement 继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。 java.sql.CallableStatement 用来...
在csdn上找了几个支持clickhouse的jar包都不能用,有的甚至jar包里都没有添加clickhouse,一气之下自己编译了一个,亲测可用,记得也要导入 clickhouse jdbc依赖
在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。 9、使用Object...
4.1 预编译语句 4.1.1 PreparedStatement对象的创建 4.1.2 传递IN参数 4.1.3 传递对象参数 4.1.4 传递大型数据参数 4.2 调用存储过程对象 4.2.1 CallableStatement对象的创建 4.2.2 IN、OUT及INOUT参数的使用...
开发一个注重性能的JDBC应用程序不是一件...的原则已经被许多现有的 JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库 MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连接和更新
在上一篇文章我们讲了一些基本使用JDBC-DBCP-MYBATIS。 1.防止SQL注入 我们在写sql语句时,为了方便可能会进行拼接字符串,这样做的...//使用预编译对象进行预编译,就不使用原始的Statement对象 PreparedStatement pr
jdk1.8可使用的jdbc驱动... DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。Driver:驱动程序,会将自身加载到DriverManager中去,并处理...
根据cassandra 的一个client jdbc源码编译的官方jar包,没有任何修改,官方源码导出,可以使用sql形式进行操作cassandra,使用时请结合Cassandra其他必须jar包测试使用
1、支持JDK6,支持JDBC 4.0,新的java.sql.SQLXML类型没有被支持,是使用ojdbc6.jar来支持。J2SE 5.0 和 JDBC 3.0 全面支持使用ojdbc5.jar。 2.不再支持oracle.jdbc.driver。从9.0.1开始的每个release都推荐...
sql2008需要的包,有sqljdbc4.jar、msbase.jar、mssqlserver.jar 、msutil.jar、sqljdbc.jar
我正在使用Hibernate的org.hibernate.engine.jdbc.internal.BasicFormatterImpl。 参考网址 二进制的 如果编译很麻烦,请下载二进制目录下的jar。 与Emacs合作 Emacs允许您将区域的内容传递给外部命令,并使用结果...
flink sql 连接clickhouse,需要修改flink -jdbc-connector 包,我已经编译完成,需要的自行下载