1. PreparedStatement
- java.sql包
- 继承自Statement接口
- 表示预编译的 SQL 语句的对象。
- 好处
- 避免SQL注入攻击
2. SQL注入攻击
用特定格式的字符串,直接访问数据库,绕过用户名和密码的验证;
String stuName = "张三' or '1'='1"; //用户名,注入攻击字符串
int stuNo = 400;//密码
sql = "select stuNo,stuName,age,birthday,score
from Student
where stuName = '"+stuName+"' and stuNo = "+stuNo;
3. 使用占位符?代替变量
编写SQL语句的时候,不需要关心拼接SQL语句的单引号和变量。
String sql = "insert into Student(stuNo,stuName,age,birthday,score)
values (seq_stu.nextval,?,?, to_date(?,'yyyy-MM-DD'),?)";
4. 为PreparedStatement对象设置参数
4.1 语法
pstmt.setXXX(位置,值);
注意:位置从1开始
4.2 示例
pstmt.setString(1, stuName);
pstmt.setInt(2, age);
pstmt.setString(3, birthday);
pstmt.setDouble(4, score);
4.3 示例代码
PreparedStatement pstmt = null;
//声明变量
String stuName = "lisi";
int age = 17;
String birthday = "1987-1-11";
double score = 89.35;
//SQL语句
String sql = "insert into Student(stuNo,stuName,age,birthday,score)
values (seq_stu.nextval,?,?, to_date(?,'yyyy-MM-DD'),?)";
//实例化pstmt,对SQL进行编译(预编译)
pstmt = conn.prepareStatement(sql);
//设置参数(占位符从1开始)
pstmt.setString(1, stuName);
pstmt.setInt(2, age);
pstmt.setString(3, birthday);
pstmt.setDouble(4, score);
//执行SQL语句
int i = pstmt.executeUpdate();
System.out.println("影响行数:" + i);