发表于: 2020-04-08 11:59:56

1 1312


Statement和preparedStatement的区别

关系:PreparedStatement继承自Statement,都是接口
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高   

PreparedStatement:表示预编译的 SQL 语句的对象。

   接口:public interface PreparedStatement extends Statement之间有继承关系

   SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

   注:(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法,问号的位置也是应该注意的,因为第一个问好的位置为1,第二个问号的位置为2.

如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。

   在以下设置参数的示例中,con 表示一个活动连接:

              PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SALARY = ? WHERE ID = ?");

              pstmt.setBigDecimal(1, 1533.00)

              pstmt.setInt(2, 1102)

              pstmt.execute()//注意提交时这里不能再有sql语句,不同于Statment

参考链接:https://blog.csdn.net/suwu150/article/details/52745055


Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。

 接口:public interface Statement extends Wrapper

在默认情况下,同一时间每个 Statement 对象只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。

如以下操作:创建statement对象

          Statement stat=conn.createStatement();

          String sql="insert into lover values(6,'suxingxing',to_date('21-9-2016','dd-mm-yyyy'))";

          stat.execute(sql);//这里提交时应该有sql语句,不同于PreparedStatment



sql注入攻击防护的了解

如果用简单的statement查询就会导致数据库返回所有结果:

但用防止sql注入的预编译prepareStatement查询就得到不一样的sql语句:将整个String视为一个name

针对 SQL 注入漏洞的防护,主要是要意识到这种漏洞的存在,不信任任何来自客户端 的数据。可以通过过滤一些 SQL 关键字的方式进行防护,比如“select”、“insert”这一类 关键字,“`” (反引号) 、“ ””(双引号)、“--”( SQL 注释开头)这一类保留字符等。当然因为各种编码和绕过技术,手工进行过滤是不够的,容易遗漏,比较安全的方式是采用语言 预置的功能,例如,用 Java 的 PreparedStatment 进行 SQL 操作。


下次内容:jdbc事务



返回列表 返回列表
评论

    分享到