PreparedStatement接口继承自Statement接口,用于执行含有或不含有参数的预编译的SQL语句。相对于Statement接口用于执行静态SQL语句,PreparedStatement接口中的SQL语句是预编译的,重复执行的效率会比较高。
PreparedStatement对象用Connection接口中的prepareStatement方法所创建。如:
为SQL语句insert创建一个PreparedStatement对象。5个问号用作参数的占位符分别代表Contacts中一条记录的Name,PhoneNumber,Email,QQ,Note的值。
PreparedStatement preparestatement = connection.prepareStatement("insert into Contacts(Name,PhoneNumber,Email,QQ,Note) values(?,?,?,?,?)");
为SQL语句select语句创建一个PreparedStatemen对象。这条语句中的问号则代表Contacts中的Name的值。
PreparedStatement preparestatement = connection.prepareStatement("select * from Contacts where Name=?");
作为Statement接口的子接口,PreparedStatement接口继承了Statement接口中定义的所有方法,同时还提供在PreparedStatement对象中设置参数的方法。这些方法用来在执行语句或过程之前设置参数的值。一般的设置方法为:
setX(int parameterIndex,X value);
X是参数类型,parameterIndex为语句中的下标(下标从1开始)。比如将参数"Jack"传递给PreparedStatement对象中Name的占位符:
preparedstatement.setString(1, "Jack");
在设置完参数后就可以调用方法executeQuery()或者executeUpdate()执行预备好的语句,使用哪个方法取决于PreparedStatemen对象的功能,查询还是更新。只是这两个方法不需要参数,这与Statement接口中的同名方法不同。因为在创建的时候就已经指定了SQL语句。
以下是参考代码:
public void DriverJdbc() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动程序
System.out.println("Ok");
//建立连接
connection = DriverManager.getConnection("jdbc:mysql://localhost/Contacts?serverTimezone=UTC", "root", "Cc229654512");
} catch (Exception ex) {
ex.printStackTrace();
}
}
//插入数据
public void UsePreparedStatement() {
DriverJdbc();
try {
PreparedStatement preparedstatement = connection.prepareStatement("insert into Contacts(Name,PhoneNumber,Email,QQ,Note) values(?,?,?,?,?)");
//设置参数
preparedstatement.setString(1, "Jack");
preparedstatement.setString(2, "12345678912");
preparedstatement.setString(3, "2233@126.com");
preparedstatement.setString(4, "1234");
preparedstatement.setString(5, "蒙面超人");
//调用executeUpdate()方法
preparedstatement.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
//查询数据
public void UsePreparedStatementOut(){
DriverJdbc();
try {
PreparedStatement preparedstatement = connection.prepareStatement("select * from Contacts where Name=?");
//设置参数
preparedstatement.setString(1, "Jack");
//调用executeQuery()方法
ResultSet resultset=preparedstatement.executeQuery();
if(resultset.next()){
resultset.previous();
while(resultset.next()){
System.out.println(resultset.getString(1) + "\t" + resultset.getString(2) + "\t" + resultset.getString(3) + "\t" + resultset.getString(4) + "\t"
+ resultset.getString(5));
}
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
参考资料:Java语言程序设计(进阶篇)