1.SQL注入问题
在以前过程中,总是采取拼接SQL语句的方式,来实现数据的增删改查!

String Sql=select * from user where username="" and password=""

由于没有对拼接的字符进行检查,很容易遭受到恶意的攻击,例如变成如下操作。

select * from user where username='老李' or '1'='1' and password=";
由此及产生了SQL注入的问题。

2.Preparement

PreparedStatement 解决SQL注入原理,运行在SQL中参数以?占位符的方式表示

select * from user where username = ? and password = ? ;

将带有?的SQL 发送给数据库完成编译(不能执行的SQL 带有?的SQL 进行编译 叫做预编译),在SQL编译后发现缺少两个参数

PreparedStatement 可以将? 代替参数发送给数据库服务器,因为SQL已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到SQL注入的目的主要是采取预编译

3.Demo演示

  public User findUserByUserNameAndPassword(String username, String password) {  

         String sql = "select * from user where username=? and password=?";  

         Connection con = null;
PreparedStatement pst = null;
ResultSet rs = null;
try {
// 1.得到连接对象
con = JdbcUtils.getConnection(); // 2.获取操作sql语句对象
pst = con.prepareStatement(sql); // 将sql语句进行预加载. // 需要对占位符进行传参数
pst.setString(1, username);
pst.setString(2, password); // 3.操作sql语句
rs = pst.executeQuery();// 注意无参数 // 4.操作结果集
if (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} return null;
}

4.批处理操作

另外PreparementStatement还支持批量SQL语句的操作,有兴趣的可以查一下相关的API,主要方法如下

addBatch(); 添加sql到批处理

executeBatch();执行批处理

5.Demo演示

 public class PreparedStatementBatchTest {  

     public static void main(String[] args) throws ClassNotFoundException,
SQLException { String sql = "insert into user values(?,?)";
// 1.得到Connection
Connection con = JdbcUtils.getConnection(); // 2.得到PreparedStatement 对象
PreparedStatement pst = con.prepareStatement(sql); // 3.执行批处理
long l1=System.currentTimeMillis();
for (int i = 1; i <= 10000; i++) { pst.setInt(1, i);
pst.setString(2, "name" + i); pst.addBatch(); //添加批处理 if(i%1000==0){
pst.executeBatch();
pst.clearBatch(); //清空批处理语句.
}
} System.out.println(System.currentTimeMillis()-l1); pst.executeBatch(); //4.关闭资源
pst.close();
con.close();
}

PreparementStatement接口的更多相关文章

  1. Eclipse中java向数据库中添加数据,更新数据,删除数据

    前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...

  2. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  3. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  4. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  5. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  6. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  7. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  8. 【WCF】自定义错误处理(IErrorHandler接口的用法)

    当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...

  9. PHP以接口方式实现多重继承(完全模拟)--学习笔记

     1.UML类图: 2.PHP代码: <?php /** * Created by PhpStorm. * User: andy * Date: 16-11-23 * Time: 下午7:57 ...

随机推荐

  1. MongoDB中的一些坑(最好不要用)

    MongoDB 是目前炙手可热的 NoSQL 文档型数据库,它提供的一些特性很棒:如自动 failover 机制,自动 sharding,无模式 schemaless,大部分情况下性能也很棒.但是薄荷 ...

  2. bzoj 1657 [Usaco2006 Mar]Mooo 奶牛的歌声——单调栈水题

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1657 #include<iostream> #include<cstdio ...

  3. poj1050最大矩阵和——暴力枚举

    题目:http://poj.org/problem?id=1050 s[i][j]数组记录以点(i,j)为右下角.(1,1)为左上角的子矩阵内部和: 枚举子矩阵左上角和右下角,取最大值即可. 代码如下 ...

  4. RT-Thread的线程(任务)处理 rt_thread_create/rt_thread_init区别

    RT-Thread中使用线程这个概念,而不是任务.两者相似,我在这里把他的线程当作任务来理解了 1.任务处理: 动态任务相关API 创建任务:rt_thread_create函数,创建任务之后会返回r ...

  5. Django简单快速实现PUT、DELETE方法

    使用django的小伙伴们应该都知道我们是无法开心的处理PUT跟DELETE的 $.ajax({ url: 'XXX', type: 'PUT', dataType: 'json', data: { ...

  6. JSP介绍(2)--- 九大隐式对象

    request对象 每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求. request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等 ...

  7. session和cookie(2)

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  8. [hdu1269]迷宫城堡(SCC)

    题意:求一张图的强连通分量,若为1,则输出yes,否则输出no. 解题关键:targin算法模板题. #include<iostream> #include<cstring> ...

  9. css属性学习

    CSS display 属性 display 属性规定元素应该生成的框的类型. none:此元素不会被显示. block:此元素将显示为块级元素,此元素前后会带有换行符. inline默认.此元素会被 ...

  10. html中NAME和ID区别

    html中NAME和ID区别 NAME 的最大作用就是可以与服务端进行交互.Struts2中要设NAME的属性才能在Action中取到值,ID取不到. id与name的作用,作为标签的标识符,基本上是 ...