我们在通过JDBC执行SQL语句时,为了避免SQL注入,可以用PrepareStatement
来代替Statement
来获取数据库操作对象,这两个接口的区别如下(如果对JDBC基础操作不熟悉,可参考我的另一篇文章)
Statement
接口:
先进行字符串的拼接,再进行SQL
语句的编译,这就给到了不法分子可乘之机PrepareStatement
接口:
先进行SQL
语句的预编译,再进行传值操作,可以有效避免SQL
注入问题
Statement state = con.createStatement();
String sql = "select * from student where name='java'";
ResultSet res = state.executeQuery(sql);//执行查找语句后返回一个ResultSet
我们可以将以上代码改成如下:
String s = "java";
String sql = "select * from student where name='java'";//这里的?没有加引号,代表占位符
PrepareStatement state = con.prepareStatement(sql);
sql.setString(1,s);//这里的1代表第一个占位符,s将传入这个位置,可以根据数据类型变成setInt等方法
res = state.executeQuery();//这里不需要传入sql语句
注意占位符传入的必须为值,不能为关键字,如上述student为表明,不可用占位符传值