zoukankan      html  css  js  c++  java
  • Statement和PreparedStatement的异同

    1.首先两个都是java向数据库执行sql语句的对象!

     java代码连接数据库,并且执行sql语句的步骤如下:

      //1.注册数据库的驱动程序
      Class.forName(driverClass);


      /2/获得数据库的连接
      conn=DriverManager.getConnection(url,username,password);


      //3创建sql执行对象
      Statement  stmt=conn.createStatement();


      //执行sql语句返回执行结果集rs
      ResultSet rs=stmt.executeQuery(sql);

    Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句:Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存储过程的调用。

      综上所述,总结如下:Statement每次执行sql语句,数据库都要执行sql语句的编译,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.但存在sql注入风险。PreparedStatement是预编译执行的。在执行可变参数的一条SQL时,PreparedStatement要比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率高。安全性更好,有效防止SQL注入的问题。对于多次重复执行的语句,使用Prepared

    Statement效率会更高一点。执行SQL语句是可以带参数的,并支持批量执行SQL。由于采用了Cache机制,则预编译的语句,就会放在Cache中,下次执行相同的SQL语句时,则可以直接从Cache中取出来。

    示例:PreparedStatement

    public void save(Stu s) {
    //定义要执行的sql
    String sql="insert into person(id,name,age) values(?,?,?)";
    DBUtil util=new DBUtil();
    //得到连接
    Connection conn=util.getConnection();

    try {
    //创建sql执行对象
    PreparedStatement psmt=conn.prepareStatement(sql);
    psmt.setInt(1, s.getId() );
    psmt.setString(2, s.getName() );
    psmt.setInt(3, s.getAge());
    psmt.executeUpdate();

    } catch (SQLException e) {

    e.printStackTrace();
    }finally {
    util.close(conn);
    }
    }

    示例:Statement

    public List list() {
    //定义要执行的sql
    String sql="select id,name,age from person";
    DBUtil util=new DBUtil();
    //得到连接
    Connection conn=util.getConnection();

    try {
    //创建sql执行对象
    java.sql.Statement stmt=conn.createStatement();
    //拿到查询的结果集rs
    ResultSet rs=stmt.executeQuery(sql);
    //定义一个数组,把结果放进去
    List list=new ArrayList();

    while(rs.next()) {
    int id=rs.getInt(1);
    String name=rs.getString(2);
    int age=rs.getInt(3);

    Stu s=new Stu();
    s.setId(id);
    s.setName(name);
    s.setAge(age);
    list.add(s);
    }
    return list;

    } catch (SQLException e) {

    e.printStackTrace();
    }finally {
    util.close(conn);
    }
    return null;
    }

  • 相关阅读:
    命令行查看memcached的运行状态(转载)
    有类与无类路由下的路由匹配原则(转载)
    数据结构实验之求二叉树后序遍历和层次遍历(SDUT 2137)
    还是畅通工程(HDU 1233)
    还是畅通工程(HDU 1233)
    Financial Management(SDUT 1007)
    Financial Management(SDUT 1007)
    二分图的最大匹配、完美匹配和匈牙利算法
    二分图的最大匹配、完美匹配和匈牙利算法
    求二叉树的层次遍历(SDUT 2824)
  • 原文地址:https://www.cnblogs.com/longailong/p/8529471.html
Copyright © 2011-2022 走看看