都是用于执行SQL语句的对象,创建stmt对象后,通过调用stmt.executeQuery()、stmt.executeUpdate()来执行sql语句。
三种Statement接口:
● Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
● PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
● CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。
CallableStatement 继承于 PreparedStatement 继承于 Statement
常用Statement方法:
(1)execute(String sql):运行语句,返回是否有结果集
(2)executeQuery(String sql):运行select语句,返回ResultSet结果集。
(3)executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
(4)addBatch(String sql) :把多条sql语句放到一个批处理中。
(5)executeBatch():向数据库发送一批sql语句执行。
区别:
1、执行sql语句格式不同。
①. Statement:
String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice)
values ('"+var1+"','"+var2+"',"+var3+",'"+var4+","+var5+"')";
stmt = conn.createStatement();
rs = stmt.executeUpdate(sql);
②. PreparedStatement:
String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice) values (?,?,?,?,?)";
pstmt = conn.preparedStatement(sql);
pstmt.setString(1,var1);
pstmt.setString(2,var2);
pstmt.setString(3,var3);
pstmt.setString(4,var4);
pstmt.setString(5,var5);
pstmt.executeUpdate();
Pstmt把SQL语句中的变量剥离出来,提高了代码的可读性和灵活性;
并且读取SQL语句是在创建语句对象的时候,而stmt是在执行execute方法时读取SQL语句。
2、PreparedStatement提高了代码的执行效率,而且更安全!
PreparedStatement接口是Statement接口的子接口,因此继承了Statement接口的所有功能。
PreparedStatement接口的机制是在数据库支持预编译的情况下,预先把SQL语句进行编译,当我们需要多次执行这条SQL语句时,可以直接执行已编译好的SQL语句,这样就大大提高了执行效率。
而说到安全性,PreparedStatement的预编译机制可以避免sql注入。
类似于'or'1' = '1'; 甚至是再加上 Drop table user;这样的sql语句,将不会出现这样的问题。