【正确答案】
【答案解析】Statement用于执行不带参数的简单SQL语句,并返回它所生成结果的对象,每次执行SQL语句时,数据库都要编译该SQL语句。以下是一个最简单的SQL语句:
Statement strut=corm.getStatement();
stmt.executeUpdate("insert into client values("aa", "aaaa")");
PreparedStatement表示预编译的SQL语句的对象,用于执行带参数的预编译SQL语句。
CallableStatement则提供了用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数。下面给出一个使用PreparedStatement的例子:
import java.sql.*;
public class Test{
public static void main(String[]args)throws Exception{
String user="user1";
String password="pwd1";
String url="jdbc:mysql://localhost:3306/Test";
String driver="com.mysql.jdbc.Driver";
Connection con=null;
PreparedStatement stmt=null;
ResultSet rs=null;
try{
Class.forName(driver);
con=DriverManager.getConnection(url, user, password);
stmt=con.prepareStatement("select*from Employee where id=?");
stmt.setInt(1, 1);//传递参数(第一个问号,传递的值)
rs=stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)+""+rs.getString(2)+""+rs.getInt(3));
}
}
catch(SQLException e1){
e1.printStackTrace();
}finally{
try{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}
catch(SQLException e){
System.out.println(e.getMessage());
}
}
}
}
程序运行结果为:
1 James1 25
虽然Statemetlt对象与PreparedStatement对象能够完成相同的功能,但相比之下,PreparedStatement具有以下优点:
1)效率更高。在使用PreparedStatement对象执行SQL命令时,命令会被数据库进行编译和解析,并放到命令缓冲区。然后,每当执行同一个PreparedStatement对象时,由于在缓冲区中可以发现预编译的命令,虽然它会被再解析一次,但不会被再次编译,是可以重复使用的,能够有效提高系统性能,因此,如果要执行插入、更新、删除等操作,最好使用PreparedStatement。鉴于此,PreparedStatement适用于存在大量用户的企业级应用软件中。
2)代码可读性和可维护性更好。以下两种方法分别使用Statement与PreparedStatement来执行SQL语句,显然方法2具有更好的可读性。
方法1:
stmt.executeUpdate("insert into t(col1, col2)values(""+var1+"", ""+vat2+"")");
方法2:
perstmt=con.prepareStatement("insert into tb_name(col1, col2)values(?, ?)");
perstmt.setString(1, var1);
perstmt.setString(2, var2);
3)安全性更好。使用PreparedStatement能够预防SQL注入攻击,所谓SQL注入,指的是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器,达到执行恶意SQL命令的目的。注入只对SQL语句的编译过程有破坏作用,而执行阶段只是把输入串作为数据处理,不再需要对SQL语句进行解析,因此也就避免了类似select*from user where name="aa" and password="bb" or 1=1的SQL注入问题的发生。
CallableStatement由prepareCall()方法所创建,它为所有DBMS(Database Management System,数据库管理系统)提供了一种以标准形式调用已储存过程的方法。它从PreparedStatement中继承了用于处理输入参数的方法,而且还增加了调用数据库中的存储过程和函数以及设置输出类型参数的功能。
常见笔试题:
用于调用存储过程的对象是______。
A.ResultSet B.DriverManager C.CallableStatemet D.PreparedStatement
答案:C。JDBC中的CallableStatement对象为所有RDBMS(Relational Database Management System,关系数据库管理系统)提供了一种标准形式调用存储过程的方法。其对存储过程的调用存在两种形式:带结果参数和不带结果参数。结果参数是一种输出参数,是存储过程的返回值。两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入和输出(IN-OUT参数)的参数。