Statement和PreparedStatement的理解

前言

我们用Java操作MySQL数据库的时候大致流程是:

  1. 发送SQL语句到MySQL数据库;
  2. 数据库进行编译;
  3. 数据库执行;

Statement的使用

// 增加多条数据
Connection conn = DriverManager.getConnection(url, user, pwd);
Statement s = conn.createStatement();
for (int i = 0; i < 100; i++) {  
	s.executeUpdate("INSERT INTO t (name, pwd) VALUES ('Arya', '123')");
}
调用Statement的executeUpdate方法的时候,会使前言中的3个步骤全走一遍,上面For循环就会导致类似的SQL语句被编译多次

// 删除数据
Connection conn = DriverManager.getConnection(url, user, pwd);
Statement s = conn.createStatement();
s.executeUpdate("DELETE FROM t WHERE name = " + name);
如果我们传入的数据是"'10001' OR 1 = 1",会得到"DELETE FROM t WHERE name = '10001' OR 1 = 1",此时OR充当MySQL操作符的角色,那么数据都被删除了。


PreparedStatement的使用

// 增加多条数据
Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement("INSERT INTO t (name, pwd) VALUES ('Arya', '123')");
for (int i = 0; i < 100; i++) {  
	 ps.executeUpdate();
}
调用PreparedStatement的prepareStatement方法时,就已经走了前言中的前两步。继续调用executeUpdate方法的时候,数据库执行的只是已经编译好的SQL语句,不用每次都编译。

// 删除数据
Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement("DELETE FROM t WHERE name = ?");
ps.setString(1, name);
ps.executeUpdate();
调用PreparedStatement的prepareStatement方法时,SQL语句已经编译,如果我们传入的数据是"'10001' OR 1 = 1",数据库中删除的也只是name"'10001' OR 1 = 1"的数据。因为此时这个数据是全部都作为参数值了,OR不是充当一个操作符的角色。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值