Statement 和 PreparedStatement之间的关系和区别

本文详细对比了Statement与PreparedStatement两种执行SQL语句的方式。重点讲解了PreparedStatement如何通过预编译提高执行效率,并展示了具体的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Statement 和 PreparedStatement之间的关系和区别.
    关系:PreparedStatement继承自Statement,都是接口
    区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高    
详解:
1、PreparedStatement:表示预编译的 SQL 语句的对象。
   接口:public interface PreparedStatement extends Statement之间的继承关系
   SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
   注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法,问号的位置也是应该注意的,因为第一个问好的位置为1,第二个问号的位置为2.以此类推。
   如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。
   在以下设置参数的示例中,con 表示一个活动连接:
              PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SALARY = ? WHERE ID = ?");
              pstmt.setBigDecimal(1, 1533.00)
              pstmt.setInt(2, 1102)
              pstmt.execute()//注意提交时这里不能再有sql语句,不同于Statment

演示代码:

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.PreparedStatement;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. public class PreparedStatementTest {
  7. public static void main(String[] args) {
  8. test_autoCommit();
  9. }
  10. public static void test_autoCommit()
  11. {
  12. String driver= "oracle.jdbc.driver.OracleDriver";
  13. String url= "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
  14. String user= "briup";
  15. String password= "briup";
  16. Connection conn= null;
  17. PreparedStatement ps= null;
  18. try {
  19. //1、注册驱动
  20. Class.forName(driver);
  21. //2、获取连接
  22. conn= DriverManager.getConnection(url, user, password);
  23. //System.out.println(conn);
  24. //3、创建prepareStatement对象
  25. String sql= "insert into lover values(?,?,?)";
  26. ps=conn.prepareStatement(sql);
  27. //4、执行sql语句
  28. ps.setInt( 1, 21); //代表设置给第一个?号位置的值为Int类型的21
  29. ps.setString( 2, "suwu150"); //代表设置给第二个?号位置的值为String类型的suwu150
  30. java.util.Date utilDate= new java.util.Date(); //进行类型转换,由util类型的date转化为sql类型的
  31. ps.setDate( 3, new java.sql.Date(utilDate.getTime()));
  32. //ps.execute();//执行
  33. System.out.println(ps.execute()); //执行表输出返回的结果,结果为false,因为没有返回的结果集
  34. //5、处理结果集
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. finally{
  39. //6、关闭资源
  40. try {
  41. if(ps!= null)ps.close();
  42. } catch (SQLException e) {
  43. e.printStackTrace();
  44. }
  45. try {
  46. if(conn!= null)conn.close();
  47. } catch (SQLException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. }

插入之后的结果



2、Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。
   接口:public interface Statement extends Wrapper
在默认情况下,同一时间每个 Statement 对象只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。  
   如以下操作:创建statement对象
          Statement stat=conn.createStatement();
          String sql="insert into lover values(6,'suxingxing',to_date('21-9-2016','dd-mm-yyyy'))";
          stat.execute(sql);//这里提交时应该有sql语句,不同于PreparedStatment
来看一下实际使用吧: 

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.SQLException;
  4. import java.sql.Statement;
  5. public class StatementTest {
  6. public static void main(String[] args) {
  7. test_autoCommit();
  8. }
  9. public static void test_autoCommit()
  10. {
  11. String driver= "oracle.jdbc.driver.OracleDriver";
  12. String url= "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
  13. String user= "briup";
  14. String password= "briup";
  15. Connection conn= null;
  16. Statement stat= null;
  17. try {
  18. //1、注册驱动
  19. Class.forName(driver);
  20. //2、获取连接
  21. conn= DriverManager.getConnection(url, user, password);
  22. conn.setAutoCommit( false);
  23. //System.out.println(conn);
  24. //3、创建statement对象
  25. stat=conn.createStatement();
  26. //4、执行sql语句
  27. String sql= "insert into lover values(22,'suxingxing',to_date('21-9-2016','dd-mm-yyyy'))"; //注意格式
  28. // stat.execute(sql);
  29. System.out.println(stat.execute(sql)); //返回值为false,因为同样没有ResultSet返回集
  30. conn.commit();
  31. //5、处理结果集
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. try {
  35. conn.rollback();
  36. } catch (SQLException e1) {
  37. e1.printStackTrace();
  38. }
  39. }
  40. finally{
  41. //6、关闭资源
  42. try {
  43. if(stat!= null)stat.close();
  44. } catch (SQLException e) {
  45. e.printStackTrace();
  46. }
  47. try {
  48. if(conn!= null)conn.close();
  49. } catch (SQLException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. }
  54. }
插入之后的结果:

原文连接,感谢博主!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值