先看一段代码:
try {
Statement statement = conn.createStatement();
statement.executeUpdate("insert into table1(column1,column2) values(101,'xxx')");
} catch (SQLException e) {
e.printStackT\frace();
}
其中,是直接使用了Statement向表中插入数据,则会存在SQL注入的危险。再看下例:
String id = "5";
String sql = "delete from tablename where id=" + id;
Statement st = conn.createStatement();
st.executeQuery(sql);//查询到表中将无数据
//如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录
为了预防SQL注入,我们可以使用PreparedStatement
。在使用它时,SQL语句在程序运行之前就已经进行了预编译,当运行时把参数传给PreparedStatement,即使参数里有敏感字符,如
‘1=1’,数据库也会作为参数的一个字段属性值来处理,而不会作为一个SQL指令。
我们来结合代码来看一下它的 使用:
String sql="insert into student(id,name,sex,age) values(?,?,?,?),(?,?,?,?),(?,?,?,?)";//此处插入三条记录,在要插入的位置先使用占位符
statement =conn.prepareStatement(sql);
statement.setInt(1,1); //占位符从1开始,此处表示了在第1个占位符处,插入的数据是整数1,也可以使用setObject
statement.setString(2,"张三");//在第2个占位符处,插入的数据是一个字符串类型的“张三”
statement.setString(3,"男"); //其它的以此类推
statement.setInt(4,19);
statement.setInt(5,2);
statement.setString(6,"李四");
statement.setString(7,"女");
statement.setInt(8,18);
statement.setInt(9,3);
statement.setString(10,"王五");
statement.setString(11,"男");
statement.setInt(12,20);
statement.executeUpdate();//每执行一个sql语句就需要执行该方法
版权声明:本文为qq_45577911原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。