PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。
这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。
使用PreparedStatement的时候需要注意哪些参数可以使用setString()赋值
例如:
String sql = "select ? from ?";
conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
ps = conn.prepareStatement(sql);
ps.setString(1, "*");// 这样写会出错,最后查询结果是空的
ps.setInt(2, 5);
rs = ps.executeQuery();
选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出 它预编译的优越性。
补充:
1. 数 据库在执行sql语句的时候如果使用PreparedStatement语句会有一点优势:因为数据库会 PreparedStatement 语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率(但尽量尽量采用使用?号的方式 传递参数),如果sql语句只执行一次,以后不再复用,则建议采用StatemenStatement不会对sql进行预编译。
2. 另外使用PrepareStatement还有一个好处,不用对传入的字符串进行转义。
3.PreparedStatement 能有效防止Sql注入攻击,速度较快,但失于灵活.
这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。
使用PreparedStatement的时候需要注意哪些参数可以使用setString()赋值
例如:
String sql = "select ? from ?";
conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
ps = conn.prepareStatement(sql);
ps.setString(1, "*");// 这样写会出错,最后查询结果是空的
ps.setInt(2, 5);
rs = ps.executeQuery();
setString方法的jdk描述如下:Sets the designated parameter to the given Java String value. The driver converts this to an SQL VARCHAR or LONGVARCHAR value (depending on the argument's size relative to the driver's limits on VARCHAR values) when it sends it to the database.
选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出 它预编译的优越性。
补充:
1. 数 据库在执行sql语句的时候如果使用PreparedStatement语句会有一点优势:因为数据库会 PreparedStatement 语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率(但尽量尽量采用使用?号的方式 传递参数),如果sql语句只执行一次,以后不再复用,则建议采用StatemenStatement不会对sql进行预编译。
2. 另外使用PrepareStatement还有一个好处,不用对传入的字符串进行转义。
3.PreparedStatement 能有效防止Sql注入攻击,速度较快,但失于灵活.