Statement和PreparedStatement的异同

时间:2021-10-04 15:11:01

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