• JDBC——Statement和PreparedStatement有什么区别?


    答:与Statement相比,①PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。

     

    SQL注入问题

    假设有登录案例SQL语句如下:

    SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;

    此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为XXX 密码为:XXX’  OR ‘a’=’a时,则真正执行的代码变为:

    SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

    此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。

    为此,我们使用PreparedStatement来解决对应的问题。

    API详解:预处理对象

    使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。

    String sql = "insert into sort(sid,sname) values(?,?)";;

    PreparedStatement预处理对象代码:

    PreparedStatement psmt = conn.prepareStatement(sql)

             常用方法:

    1. 执行SQL语句:

    l  int executeUpdate(); --执行insert update delete语句.

    l  ResultSet executeQuery(); --执行select语句.

    l  boolean execute(); --执行select返回true 执行其他的语句返回false.

    1. 设置实际参数

    l  void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx值。在将此值发送到数据库时,驱动程序将它转换成一个 SQL Xxx类型值。

    例如:

    setString(2, "家用电器") 把SQL语句中第2个位置的占位符? 替换成实际参数 "家用电器"

  • 相关阅读:
    LC 综合 中级算法笔记
    LC 212. 单词搜索2
    [NLP] 2.2 文本正规化 (Text Normalization)
    本地秘钥复制到github,实现两者之间的交互
    Python 实例化对象
    C# 左补齐+ 生成一个星期的日期
    hello world
    迭代器模式、观察者模式
    代理模式、桥接模式、装饰器模式、适配器模式
    外观模式、组合模式、享元模式
  • 原文地址:https://www.cnblogs.com/wy20110919/p/8093399.html
Copyright © 2020-2023  润新知