项目地址:https://gitee.com/martinHuang/jsp-basic
之前都是使用的是Statement接口,这个是最原始,最直观的一种方法,为什么这么说呢,因为它所使用的SQL语句,是靠字符串的拼接,比较容易让人理解。不过这个也带来一个问题,就是安全性,许许多多的SQL注入都是利用这个弱点,这个漏洞还是蛮可怕的,我们老师有演示过,除了可以不用密码直接登陆之外,还能搞掉你整个数据库。。。吓死宝宝了,所以,强烈推荐使用PreparedStatement接口进行参数化查询,提高安全性。
这次的示例就基于之前几篇的代码,直接修改
知识储备:
先查查看JDK的API文档,观察一下PreparedStatement接口
蓝色圈圈处就是用法,先拿到数据库的连接con,再构建对象,说明这个接口支持多参数的SQL语句
再来看看它的方法
是不是跟Statement很像呢?唯一不同的地方,就是不用传入sql语句,sql语句在create的时候就传入,可以看上面蓝色画圈的用法
它的参数值的设定都是使用setXXX方法,要注意的是方法的第一个参数表示SQL语句参数的位置,下标从1开始
1、先看增(Insert)
绿色注释部分是以前的Statement,不安全
完整代码如下:
<%@page import="jdk.nashorn.internal.ir.RuntimeNode.Request"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="com.Database.*"%>
<%@ page import="java.sql.*"%>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pro = request.getParameter("pro");
//String sql = "insert into personinfo(name , birthProvince) values('"+name+"','"+pro+"')";
String sql = "insert into personinfo(name,birthProvince) values (?,?)";
conDB db = new conDB();
db.connectDB();
//Statement state = db.getConnection().createStatement();
//int flag = state.executeUpdate(sql);
PreparedStatement state = db.getConnection().prepareStatement(sql);
state.setString(1, name);
state.setString(2, pro);
int flag = state.executeUpdate();
if(flag != 0)
{
out.println("<script>alert('插入成功!');history.go(-1);</script>");
}
else
{
out.println("<script>alert('插入失败!');history.go(-1);</script>");
}
state.close();
%>
2、接着看删
如果不知道SQL参数的数据类型的化,最保险的是用setObject,系统会自动帮你解决类型问题~
完整代码如下
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="com.Database.*" %>
<%@ page import="java.sql.*" %>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
conDB db = new conDB();
db.connectDB();
//Statement state = db.getConnection().createStatement();
//String sql = "delete from personinfo where id = "+id;
//int flag= state.executeUpdate(sql);
String sql = "delete from personinfo where id = ?";
PreparedStatement state = db.getConnection().prepareStatement(sql);
state.setObject(1, id);
int flag = state.executeUpdate();
if(flag > 0)
{
out.println("<script>alert('删除成功!');history.go(-1)</script>");
}
else
{
out.println("<script>alert('删除失败!');history.go(-1)</script>");
}
state.close();
%>
3、然后看改
大同小异是不是~~
4、最后看查
上面这个是更新第一步(查询数据)的部分