PreparedStatement(预编译)与 Statement 的关系:
PreparedStatement继承自Statement,都是接口
PreparedStatement(预编译)与 Statement 的区别:
1、语法不同:
PreparedStatement可以使用预编译的sql,只需要发送一次sql语句,后面只要发送参数即可,公用一个sql语句。
Statement只能使用静态的sql。
delete from student where id=1;
2、效率不同:PreparedStatement使用了sql缓冲区,可以使用占位符,效率要比Statement高。
3、安全性不同:PreparedStatement可以有效的防止sql注入,而Statement不能防止sql注入。
下面是很长时间之前经常出现的sql注入问题,由于之前使用 Statement接口完成JDBC,Statement是字符串简单的拼接,就会造成sql注入,比如用户登录,创建的`name`字段值为'xxx' OR 1=1 --y' AND 这时候你的密码passw不管输入什么都能登录查询。
CREATE
TABLE
users(
id
INT
PRIMARY
KEY
AUTO_INCREMENT,
`
name
`
VARCHAR
(10),
`
password
`
VARCHAR
(10)
);
INSERT
INTO
users(`
name
`, `
password
`)
VALUES
(
'lisi'
,123);
SELECT
*
FROM
users
WHERE
1=1;
-- 1=1 true
SELECT
*
FROM
users
WHERE
`
name
`=
'lisi'
AND
`
password
`=
'123'
;
-- zhangsan' OR 1=1 -- y
SELECT
*
FROM
users
WHERE
`
name
`='zhangsan
' OR 1=1 -- y'
AND
`
password
`=
'343'
;
由于字符串简单的拼接,sql语句的查询条件相当于
WHERE
`
name
`='zhangsan
' OR true;后面的成为了注释,严重影响了安全性。
而PreparedStatement使用占位符,类似于变量那样一个字段一个字段的赋值,一个萝卜一个坑,有效的解决了sql注入问题,效率也要比Statement高出很多。
下图为我练习JDBC时的一个插入数据测试方法,体现PreparedStatement的一个萝卜一个坑用法(占位符)