PreparedStatement 是什么

【PreparedStatement 是什么】

PreparedStatement 是什么

文章插图
jdbc(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力 。在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳:2002-02-05 20:56 或者 02/05/02 8:56 pm 。通过使用java.sql.preparedstatement,这个问题可以自动解决 。一个preparedstatement是从java.sql.connection对象和所提供的sql字符串得到的,sql字符串中包含问号(?),这些问号标明变量的位置,然后提供变量的值,最后执行语句,例如: stringsql = "select * from people p where p.id = ? and p.name = ?"; preparedstatement ps = connection.preparestatement(sql); ps.setint(1,id); ps.setstring(2,name); resultset rs = ps.executequery(); 使用preparedstatement的另一个优点是字符串不是动态创建的 。下面是一个动态创建字符串的例子: stringsql = "select * from people p where p.i = "+id; 这允许jvm(javavirtual machine,java虚拟机)和驱动/数据库缓存语句和字符串并提高性能 。preparedstatement也提供数据库无关性 。当显示声明的sql越少,那么潜在的sql语句的数据库依赖性就越小 。由于preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement 。一个完整的preparedstatement的例子: package jstarproject; import java.sql.*; public class mypreparedstatement { private final string db_driver="com.microsoft.jdbc.sqlserver.sqlserverdriver"; private final string url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs"; public mypreparedstatement() { } public void query() throws sqlexception{ connection conn = this.getconnection(); string strsql = "select emp_id from employee where emp_id = ?"; preparedstatement pstmt = conn.preparestatement(strsql); pstmt.setstring(1,"pma42628m"); resultset rs = pstmt.executequery(); while(rs.next()){ string fname = rs.getstring("emp_id"); system.out.println("the fname is " + fname); } rs.close(); pstmt.close(); conn.close(); } private connection getconnection() throws sqlexception{ // class. connection conn = null; try { class.forname(db_driver); conn = drivermanager.getconnection(url,"sa","sa"); } catch (classnotfoundexception ex) {} return conn; } //main public static void main(string[] args) throws sqlexception { mypreparedstatement jdbctest1 = new mypreparedstatement(); jdbctest1.query(); } } 为什么要始终使用PreparedStatement代替Statement?为什么要始终使用PreparedStatement代替Statement? 在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement. 基于以下的原因: 一.代码的可读性和可维护性. 虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); perstmt.setString(1,var1); perstmt.setString(2,var2); perstmt.setString(3,var3); perstmt.setString(4,var4); perstmt.executeUpdate(); 不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心. 为什么 PreparedStatement 很重要, 以及怎样"正确"使用他们. 数据库有一个艰苦的工作. 它们不断地从许多客户端读取 SQL 查询, 对数据进行尽可能高效的 查询. 处理语句可能成为一个代价较高的操作, 但是现在数据库都是很好的设计, 这样这个困难 被减到最小. 但是这些优化需要应用程序开发者的协助, 这篇文章给你展示一下怎样正确使用 PreparedStatement 来漂亮地帮助数据库执行这些优化. 一个数据库怎样执行一条语句? 显然, 不要希望这里有许多细节; 我们只看一下对这篇文章比较重要的部分. 当一个 数据库接收 到一条语句的时候, 数据库引擎首先解析这条语句, 查看语法错误. 一 旦语句解析了, 数据库 需要找出最有效的方法来执行这条语句. 这个计算起来代价很大. 数据库检查什么索引(如果有 的话)能有所帮助, 或者它是否能全部读出一张表中所有的记录. 数据库根据这些关于数据库所 存数据的统计数字来找出最好的办法. 一旦制订出查询方案, 就可以由数据库引擎来执行. 需要 CPU 来产生访问方案. 想的情况, 如果我们把相同的语句给数据库发送两次, 我们期望 数据库重用第一条记录的访问方案. 这会比第二次重新产生方案要使用较少的 CPU. 语句缓冲数据库可以进行调节来做语句缓冲. 通常包含一些类型的语句缓冲. 缓冲使用语句本身作为关键 字, 访问方案和相应的语句存储在缓冲区中. 这样就允许数据库引擎 对以前执行过的语句所使用 的访问方案进行重用. 举个例子来说, 如果我们向数据库发送这样一条语句 "select a, b from t where c = 2", 计算好的访问方案就放入缓冲区了. 如果我们以后再使用同样的语 句, 数据库就能重用以前的访问方案, 这样就能节省 CPU. 但是要注意, 整条语句是一个关键字. 例如, 如果我们后来发送的语句是 "select a,b from t where c = 3", 那么就不会找出以前的访问方案. 因为 "c=3" 和 "c=2" 是不一 样的. 所以, 例如: For(int I = 0; I

推荐阅读