欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PreparementStatement接口

程序员文章站 2022-05-29 12:04:30
1.SQL注入问题在以前过程中,总是采取拼接SQL语句的方式,来实现数据的增删改查! String Sql=select * from user where username="" and password="" 由于没有对拼接的字符进行检查,很容易遭受到恶意的攻击,例如变成如下操作。 select ......

1.sql注入问题
在以前过程中,总是采取拼接sql语句的方式,来实现数据的增删改查!

string sql=select * from user where username="" and password=""

由于没有对拼接的字符进行检查,很容易遭受到恶意的攻击,例如变成如下操作。

select * from user where username='老李' or '1'='1' and password=";
由此及产生了sql注入的问题。

 

2.preparement

preparedstatement 解决sql注入原理,运行在sql中参数以?占位符的方式表示

select * from user where username = ? and password = ? ;

将带有?的sql 发送给数据库完成编译(不能执行的sql 带有?的sql 进行编译 叫做预编译),在sql编译后发现缺少两个参数

preparedstatement 可以将? 代替参数发送给数据库服务器,因为sql已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到sql注入的目的主要是采取预编译

3.demo演示

 1  public user finduserbyusernameandpassword(string username, string password) {  
 2   
 3         string sql = "select * from user where username=? and password=?";  
 4   
 5         connection con = null;  
 6         preparedstatement pst = null;  
 7         resultset rs = null;  
 8         try {  
 9             // 1.得到连接对象  
10             con = jdbcutils.getconnection();  
11   
12             // 2.获取操作sql语句对象  
13             pst = con.preparestatement(sql); // 将sql语句进行预加载.  
14   
15             // 需要对占位符进行传参数  
16             pst.setstring(1, username);  
17             pst.setstring(2, password);  
18   
19             // 3.操作sql语句  
20             rs = pst.executequery();// 注意无参数  
21   
22             // 4.操作结果集  
23             if (rs.next()) {  
24                 user user = new user();  
25                 user.setid(rs.getint("id"));  
26                 user.setusername(rs.getstring("username"));  
27                 user.setpassword(rs.getstring("password"));  
28                 return user;  
29             }  
30         } catch (classnotfoundexception e) {  
31             e.printstacktrace();  
32         } catch (sqlexception e) {  
33             e.printstacktrace();  
34         }  
35   
36         return null;  
37     }

4.批处理操作

另外preparementstatement还支持批量sql语句的操作,有兴趣的可以查一下相关的api,主要方法如下

addbatch(); 添加sql到批处理

executebatch();执行批处理

 

 

5.demo演示

 1 public class preparedstatementbatchtest {  
 2   
 3     public static void main(string[] args) throws classnotfoundexception,  
 4             sqlexception {  
 5   
 6         string sql = "insert into user values(?,?)";  
 7         // 1.得到connection  
 8         connection con = jdbcutils.getconnection();  
 9   
10         // 2.得到preparedstatement 对象  
11         preparedstatement pst = con.preparestatement(sql);  
12   
13         // 3.执行批处理  
14         long l1=system.currenttimemillis();  
15         for (int i = 1; i <= 10000; i++) {  
16   
17             pst.setint(1, i);  
18             pst.setstring(2, "name" + i);  
19   
20             pst.addbatch(); //添加批处理  
21               
22             if(i%1000==0){  
23                 pst.executebatch();  
24                 pst.clearbatch(); //清空批处理语句.  
25             }  
26         }  
27           
28         system.out.println(system.currenttimemillis()-l1);  
29           
30         pst.executebatch();  
31           
32         //4.关闭资源  
33         pst.close();  
34         con.close();  
35     }