前言
我们用Java操作MySQL数据库的时候大致流程是:
- 发送SQL语句到MySQL数据库;
- 数据库进行编译;
- 数据库执行;
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();