API查看,它是Java和执行数据库 *** 作的一个重要方法。用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。详情也可以通过访问Java
API查看。
区别:
Statement执行一条sql就得编译一次,PrepareStatement只编译一次;常用后者原因在于参数设置非常方便;执行一条sql就得编译一次,后者只编译一次;还有就是sql放置的位置不同 常用后者原因在于参数设置非常方便;
一般我们使用PreparedStatement代替Statement,因为:
一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')")
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)")
perstmt.setString(1,var1)
perstmt.setString(2,var2)
perstmt.setString(3,var3)
perstmt.setString(4,var4)
perstmt.executeUpdate()
二.PreparedStatement尽最大可能提高性能.
每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么 下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个 Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以 直接执行.而statement的语句中,即使是相同一 *** 作,而由于每次 *** 作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配
三.最重要的一点是极大地提高了安全性.
使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,等做费尽心机的判断和过虑.
至于ResultSet, ResultSet 包含符合 SQL 语句中条件的所有行,并且它通过一套 get 方法(这些 get 方法可以访问当前行中的不同列)提供了对这些行中数据的访问,例如:
java.sql.Statement stmt = conn.createStatement()ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1")
while (r.next())
{
// 打印当前行的值。
int i = r.getInt("a")
String s = r.getString("b")
float f = r.getFloat("c")
System.out.println("ROW = " + i + " " + s + " " + f)
}
java statement在查询的时候 ,就是用连接对象调用方法execute...执行sql语句,而sql语句就是查询数据最核心最关键的一段代码, 建议楼主先看看Statement语句, 然后再去看看PrepareStatement语句,后者相比于前者,有四个优点,分别是:1, 可读性好----写的sql看起来简单明了, 易于读取和维护
2. 维护性好 ---前面这两个点是很只观的一个感受, 比如你自己分别用这两种语句,去写一条更新数据库的sql, 这个时候你一眼就能感受到PrepareStatement的可读性与维护性
3. 性能更好---由于PrepareStatement里面有一个类似缓冲区的设计, 就是会把相同的sql语句存放在里面, 当以后再遇到同样的sql语句,它在内部就省去了很多对sql语句进行语法等判断的过程, 所以性能上优于Statement
4. 安全性好,可以防止一般的sql注入攻击, 有这个有点主要是由于前者的sql语句在拼接的过程中 很可能会出现歧义 具体的楼主可以在网上搜一下sql注入式攻击的情况.
说了这么多 不知道楼主是否能看懂, 如果有问题 随时可以交流
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)