Statement 和 PrepareStatement的区别

Statement 和 PrepareStatement二者都是用在获取数据库操作对象;
1当遇到sql注入问题的时候,Statement 不能排查出来, 即* or ‘1’=1 被认定为sql的语句而被编译。

			//3选择数据库操作对象
			 statement=connection.createStatement();
            //4执行sql
            String sql="select *from t_user where 
            loginName='"+uesrLoginInfo.get("user_name")+ "' and 
            loginPwd='"+uesrLoginInfo.get("user_password")+"'";
            resultSet=statement.executeQuery(sql);

PrepareStatement会先对sql语句进行检查,并且查询条件会在编译之后插入
编译条件用?代替,而且会编译自带 ""

 //3选择预编译数据库操作对象——要先写sql语句
            /**
             * "select *from t_user where loginName=? and loginPwd=?";
             * ?一个问题 表示一个占位符  占位符不能使用单引号
             */
            //String sql="select *from t_user where 
            loginName='"+uesrLoginInfo.get("user_name")+ "' and 
            loginPwd='"+uesrLoginInfo.get("user_password")+"'";
            String sql="select *from t_user where loginName=?and loginPwd=?";
            ps=connection.prepareStatement(sql);
            //预编译之后给sql语句中的?传值
            //第一个?是下标是1,后面依序增加
            ps.setString(1,uesrLoginInfo.get("user_name"));
            ps.setString(2,uesrLoginInfo.get("user_password"));

2PrepareStatement还会对sql语句的类型进行安全检查,如原定是String 类型 ,那么如果sql语句中是int类型,其也可以检擦出来 不会到sql执行阶段才报错

3最后一点是PrepareStatement对于完全相同的sql语句 它是编译一次 后续可以执行N次(省去N次编译),而Statement是编译N次执行N次。

因为PrepareStatement在执行sql时执行条件自带’'单引号,所以在进行排序等其他操作时,desc,asc会自动加单引号,所以StatemMent依旧在一些场所可用。
当然排序如果时在最后的话,利用字符串拼接也可以用ParpareStateMent

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值