PreparedStatement与Statemnt语句的差别及PreparedStatement语句的优势

(1)差别

1PreparedStatement接口继承Statement接口PreparedStatement提供了一种预编译的sql语句功能,这种sql能在java上根据运行时的需要进行重用,但和数据库本身对sql的预编译完全是两回事情。


2PreparedStatement能接受带?号的String作为sql语句,并且在执行之前你可以对那些sql语句中出现的 ?号根据具体需要进行赋值,所以PreparedStatement接口比Statement多提供了一堆setInt,setDate之类的方法,就是对?号进行替换时用的。所以PreparedStatement比普通的Statement对象使用起来更加灵活,更有效率。


3使用preparedstatement的字符串不是动态创建的。这允许jvm(javavirtualmachine,java虚拟机)和驱动/数据库缓存语句和字符串并提高性能。preparedstatement也提供数据库无关性。当显示声明的sql越少,那么潜在的sql语句的数据库依赖性就越小。只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement。


(2)PreparedStatement语句的优势

1代码的可读性和可维护性

虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码从可读性和可维护性上来说,都比直接用Statement的代码高很多档次。


2 PreparedStatement尽最大可能提高性能

每一种数据库都会尽最大努力对预编译语句提供最大的性能优化。因为预编译语句有可能被重复调用,所以语句在被DB的编译器编译后的执行代码被缓存下来,下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行。这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配,那么在任何时候就可以不需要再次编译而可以直接执行。而statement的语句中,即使是相同一操作,由于每次操作的数据不同,所以使整个语句相匹配的机会极小,几乎不太可能匹配。


3极大地提高了安全性

传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。

在公共Web站点环境下,有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序来个SQL注入,那就有麻烦。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Statement和PreparedStatement执行SQL语句的代码示例: 1. 使用Statement执行SQL语句[^1]: ```java import java.sql.*; public class StatementExample { public static void main(String[] args) { try { // 建立数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password"); // 创建Statement对象 Statement stmt = conn.createStatement(); // 执行SQL查询语句 String sql = "SELECT * FROM mytable"; ResultSet rs = stmt.executeQuery(sql); // 处理查询结果 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } // 关闭连接 rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 2. 使用PreparedStatement执行SQL语句[^2]: ```java import java.sql.*; public class PreparedStatementExample { public static void main(String[] args) { try { // 建立数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password"); // 创建PreparedStatement对象 String sql = "SELECT * FROM mytable WHERE id = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); // 设置参数 pstmt.setInt(1, 1); // 执行查询 ResultSet rs = pstmt.executeQuery(); // 处理查询结果 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } // 关闭连接 rs.close(); pstmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值