我们在利用Statement接口时有一个缺陷。由于在利用Statement接口要进行sql语句的拼接,这样做不仅麻烦,随意马虎出错,而且还存在安全漏洞。便是我们在不知道精确的用户名或者密码的时候,在后面加上or 1=1 也可以获取精确的数据,这便是范例的sql注入。
如果利用Statement工具在实行SQL语句很随意马虎受到SQL的注入,那什么是SQL注入呢?
所谓SQL注入便是用户在能够掌握SQL查询、更新、插入、删除等语句的参数的情形下,攻击者通过布局分外的输入字符串使后端程序缺点地识别SQL查询语句中 ·的代码与数据部分从而导致数据库管理系统输出了非预期的结果的一种行为。

SELECT FROM Users WHERE Username='1' OR '1'='1' AND Password='1'OR '1'='1'
可以通过这样的SQL语句注入直接不须要输入精确的语句,就可以获取用户登录成功的精确账号信息等访问!
sql注入示例:
假设参数值是通过GET方法通报到做事器的,且域名为www.example.com 那么我们的访问要求便是:
http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
对上面的SQL语句作大略剖析后我们就知道由于该语句永久为真,以是肯定会返回一些数据,在这种情形下实际上并未验证用户名和密码,并且在某些系统中,用户表的第一行记录是管理员,那这样造成的后果则更为严重。而PrepareStatement接口就不存在这个问题。由于PrepareStatement利用的是预编译语句,传入的任何数据都不会和已经预编译的sql语句进行拼接,避免了sql注入攻击。
那么PrepareStatement比Statement好在哪呢?
①提高了代码的可读性和可掩护性。虽然利用PreparedStatement来替代Statement会多几行代码,但是避免了繁琐麻烦又随意马虎出错的sql语句拼接,提高了代码的可读性和可掩护性。
②提高了sql语句实行的性能。创建Statement工具时不该用sql语句做参数,不会解析和编译sql语句,每次调用方法实行sql语句时都要进行sql语句解析和编译操作,即操作相同仅仅是数据不同。而PrepareStatement就不会,由于每次创建PrepareStatement工具时利用sql语句做参数,会解析和编译该sql语句。也可以利用带有占位符的sql语句做参数,在通过setXxx()方法给占位符赋值后实行sql语句时无需在解析和编译sql语句,直接实行即可。多次实行相同的操作可以大大提高性能。
③提高了安全性。由于PrepareStatement利用的是预编译语句,传入的任何数据都不会和已经预编译的sql语句进行拼接,避免了sql注入攻击。