jsp数据库基础之--使用PreparedStatement操纵数据库

项目地址: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、最后看查


上面这个是更新第一步(查询数据)的部分


  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值