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;
    }

  • 相关阅读:
    open_basedir restriction in effect,解决php引入文件权限问题 解决方法
    Linux增加虚拟内存方法
    centos下kill、killall、pkill命令区别
    正则表达式全集
    Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL
    配置frp实现内网穿透
    解决微信授权回调页面域名只能设置一个的问题 [php]
    高性能Mysql主从架构的复制原理及配置详解
    【Git】工作中99%能用到的git命令
    SVN服务器搭建和使用
  • 原文地址:https://www.cnblogs.com/longailong/p/8529471.html
Copyright © 2011-2022 走看看