PrepareStatement与Statement在使用时的区别:
Statement:
Sql
executeUpdate(sql)
PrepareStatement:
Sql(可能存在占位符)
在创建PrepareStatement 对象时,将sql预编译 PrepareStatement()
executeUpdate()
setXxx()替换占位符?
推荐使用PrepareStatement 原因如下:
1.编码更加简便(避免了字符串的拼接)
例如:
String name=”zs”;
Int age=23;
Statement:
String sql =”insert into student(stuno,stuname) values(‘“+name+”’,”age”)”;
Stmt.executeUpdate(sql);
PrepareStatement:
Statement:String sql =”insert into student(stuno,stuname) values(?,?)”;
pstmt=connection.PrepareStatement(sql);//预编译sql
pstmt.setString(1,name);
pstmt.setInt(2,age);
2.提高性能(因为有预编译操作,一般来说预编译只执行一次)
例:需要重复增加100条(批量处理)
Statement:每次sql都得编译执行
String sql =”insert into student(stuno,stuname) values(‘“+name+”’,”age”)”;
For(100) Stmt.executeUpdate(sql);
PrepareStatement:
Statement: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(sql);//sql不需要编译,只需要执行
3.安全(能有效防止sql注入)
sql注入:将客户输入的内容与开发人员的SQL语句混为一体
例如:
Statement:存在被sql注入的风险
(例如输入 用户名:任意值 ‘ or 1=1 --
密码;任意值)
分析:
Select count(*) from login where uname =’任意值’ or 1=1 --’and upwd=’任意值’;
Select count(*) from login where uname =’任意值’ or 1=1; --’and upwd=’任意值’;
原因:利用逻辑语句使用户名永远为真,再利用数据库语言中--将密码注释掉,导致输入为真
PrepareStatement:有效防止sql注入()因为pstmt用?代替变量)