PreparedStatement与Statement在使用时的区别
1.Statement
sql
executeUpdate(sql)
2.PreparedStatement
sql(可能存在占位符?)
在创建PreparedStatement对象时,将sql预编译PreparedStatement(sql)
executeUpdate()
setXxx()替换占位符?
推荐使用PreparedStatement:原因如下:
1.编码更加简洁(避免了字符串的拼接)
String name="23";
int age=23;
stmt:
String sql="insert into student(stuno,stuname)values('"+name+"',"+age+")";
pstmt:
String sql="insert into student(stuno,stuname)values(?,?)";
pstmt=connection.prepareStatement(sql);//预编译SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
2.提高性能(因为有预编译操作,预编译只需执行一次)
需要重复增加100条数
stmt:
String sql="insert into student(stuno,stuname)values('"+name+"','"+age+"')";
stmt.executeUpdate(sql);
pstmt:
String sql="insert into student(stuno,stuname)values(?,?)";
pstmt=connection.prepareStatement(sql);//预编译SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
for(100){
pstmt.executeUpdate();
}
3.安全(可以有效防止sql注入)
sql注入:将用户输入的内容和开发人员的SQL语句混为一体
stmt:存在被sql注入的风险
(例如输入 用户名:任意值 'or 1=1 --
密码:任意值)
分析:
select count(*) from login where uname='任意值' or 1=1 --' and upwd='任意值';
select count(*) from login where uname='任意值' or 1=1;
select count(*) from login;
select count(*) from login where uname='"+name+"' and upwd='"+pwd+"';
pstmt:防止sql注入