这两者的区别主要在于如何构造执行sql语句的对象,
1,对于prepareStatement来说,其执行返回的是一个prepareStatement对象,而这个方法的描述是这样的,prepareStatement(String sql)创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。它需要一个参数,这个参数就是需要执行的sql语句。而createStatement,它不需要参数,Statement createStatement()创建一个 Statement 对象来将 SQL 语句发送到数据库,但在此处并没有执行sql语句。
2,PreparedStatement执行时用到的方法,setString(int i,value),其中set后面跟的是相应的属性数据类型,所以,要求相应的sql语句的写法与常规的写法不同,意思可以理解为第i个问号的值为value,这样设置之后,就可以对其进行执行了,执行的方法是executeQuery()和executeUpdate(),区别在之前讨论jdbc中有讲过,而PreparedStatement的这两个方法是不需要参数的,这点跟Statement不同,它需要一个sql语句的参数,当然,也是这两种方法! 3,PreparedStatement对象一旦绑定了sql,就不能执行其他sql了,即只能执行一条sql,而Statement对象可以执行多条。
4,对于执行同构的sql(只有值不同,其他结构都相同),PreparedStatement对象的执行效率较Statement的高,对于异构的sql语句,Statement较PreparedStatement执行效率高。PreparedStatement是把sql语句预先“编译”好,每次只替换定义的变量,作用是减少与数据库的通信量,从而加快执行速度,主要是用在循环执行sql语句。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需要更改其中变量的值,便可重新执行SQL语句。选择PreParedStatement对象与否,在于相同的句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量不同,如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出她预编译的优越性。
最后看下,具体的代码实现:
使用Statement的情况:
package com.cbh.ps.cs;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test
{
public static void main(String args[])
{
String url=”jdbc:mysql://localhost:3306/atm”;
String driver=”com.mysql.jdbc.Driver”;
String username=”root”; String pw=”root”;
String sql=”select * from account”;
try
{
Class.forName(driver);
Connection conn=DriverManager.getConnection(url, username, pw);
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery(sql);
System.out.print(rs.next());
}
catch (ClassNotFoundException e)
{ e.printStackTrace(); }
catch (SQLException e)
{ e.printStackTrace(); }
} }
使用PreParedStatement的情况:
package com.cbh.ps.cs;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test2
{
public static void main(String args[])
{ String url=”jdbc:mysql://localhost:3306/atm”;
String driver=”com.mysql.jdbc.Driver”;
String username=”root”; String pw=”root”;
String sql=”select * from account where cardID=?”;
try {
Class.forName(driver);
Connection conn=DriverManager.getConnection(url, username, pw);
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,”123″);
ResultSet rs=ps.executeQuery();
System.out.print(rs.next());
}
catch (ClassNotFoundException e)
{ e.printStackTrace(); }
catch (SQLException e)
{ e.printStackTrace(); } } }