使用PreparedStatement
Technorati 标签: MySQL,JDBC

“整理自网络”

用PreparedStatement替换Statement的作用主要是为了防止数据库注入式攻击(直接使用String作为sql的参数导致的潜在危险)。原理是用占位符作为实参定义sql语句,如:

String sql="select * from tuser where usernmae=? and password=?";
PreparedStatement pstm=conn.preparedStatement(sql);
pstm.setString(1,name);
pstm.setString(2,pwd);
Result rs=psm.executeQuery();

Statement和PreparedStatement之间的区别》:

1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程。

2.使用 Statement 对象在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理。

4.普通的Statement对象代码段:

String updateString = "UPDATE COFFEES SET SALES = 75 " 
             + "WHERE COF_NAME LIKE ′Colombian′";
stmt.executeUpdate(updateString);

使用PreparedStatement代码段:

PreparedStatement updateSales = 
    con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();

PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。
这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。

最后贴一个PreparedStatement的完整的例子:

package jstarproject;
import java.sql.*;
public class mypreparedstatement {
private final string db_driver="com.microsoft.jdbc.sqlserver.sqlserverdriver";
private final string url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs";
  public mypreparedstatement() 
  {
  }
  public void query() throws sqlexception{
    connection conn = this.getconnection();
    string strsql = "select emp_id from employee where emp_id = ?";
    preparedstatement pstmt = conn.preparestatement(strsql);
    pstmt.setstring(1,"pma42628m");
    resultset rs = pstmt.executequery();
    while(rs.next()){
       string fname = rs.getstring("emp_id");
       system.out.println("the fname is " + fname);
    }
    rs.close();
    pstmt.close();
    conn.close();
  }
  private connection getconnection() throws sqlexception{
//    class.
    connection conn = null;
    try {
      class.forname(db_driver);
      conn = drivermanager.getconnection(url,"sa","sa");
    }
    catch (classnotfoundexception ex) {}
    return conn;
  }
  //main
  public static void main(string[] args) throws sqlexception {
    mypreparedstatement jdbctest1 = new mypreparedstatement();
    jdbctest1.query();
  }
}
posted on   Jersey  阅读(842)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示