PreparedStatement
1.Sql注入:由于jdbc程序在执行的过程中sql语句在拼装时使用了由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻击方式就叫做sql注入,参考用户注册登录案例。
2.PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用预编译机制,在创建PreparedStatement对象时就需要将sql语句传入,传入的过程中参数要用?替代,这个过程回导致传入的sql被进行预编译,然后再调用PreparedStatement的setXXX将参数设置上去,由于sql语句已经经过了预编译,再传入特殊值也不会起作用了。
3.PreparedStatement使用了预编译机制,sql语句在执行的过程中效率比Statement要高。

SQL注入攻击:
由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击

PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题

PreparedStatement主要有如下的三个优点:
~1.可以防止sql注入
~2.由于使用了预编译机制,执行的效率要高于Statement
~3.sql语句使用?形式替代参数,然后再用方法设置?的值,比起拼接字符串,代码更加优雅.

示例代码:

  1. package com.dzq.dao;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import com.dzq.domian.User;
  7. import com.dzq.util.JDBCUtils;
  8.  
  9. public class MySqlUserDao2 implements UserDao{
  10.  
  11. @Override
  12. public User findUserByUserName(String username) {
  13.  
  14. String sql="select * from users where username=?";
  15. Connection conn=null;
  16. PreparedStatement ps=null;
  17. ResultSet rs=null;
  18. try {
  19. conn=JDBCUtils.getConn();
  20. ps=conn.prepareStatement(sql);
  21. ps.setString(1, username);
  22. rs=ps.executeQuery();
  23. if(rs.next()){
  24. User user=new User();
  25. user.setId(rs.getInt("id"));
  26. user.setUsername(rs.getString("username"));
  27. user.setPassword(rs.getString("password"));
  28. user.setNickname(rs.getString("nickname"));
  29. user.setEmail(rs.getString("email"));
  30. return user;
  31. }else{
  32. return null;
  33. }
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. throw new RuntimeException(e);
  37. }finally{
  38. JDBCUtils.close(rs, ps, conn);
  39. }
  40. }
  41.  
  42. @Override
  43. public void addUser(User user) {
  44. String sql="insert into users values (null,?,?,?,?)";
  45. Connection conn=null;
  46. PreparedStatement ps=null;
  47. ResultSet rs=null;
  48. try {
  49. conn=JDBCUtils.getConn();
  50. ps=conn.prepareStatement(sql);
  51. ps.setString(1, user.getUsername());
  52. ps.setString(2, user.getPassword());
  53. ps.setString(3, user.getNickname());
  54. ps.setString(4, user.getEmail());
  55. //int count=stat.executeUpdate(sql);
  56. int count=ps.executeUpdate();
  57.  
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. throw new RuntimeException(e);
  61. }finally{
  62. JDBCUtils.close(rs, ps, conn);
  63. }
  64.  
  65. }
  66.  
  67. @Override
  68. public User findUserByUNAndPWD(String username, String password) {
  69.  
  70. String sql="select * from users where username=? and password=?";
  71. Connection conn=null;
  72. PreparedStatement ps=null;
  73. ResultSet rs=null;
  74. try {
  75. conn=JDBCUtils.getConn();
  76. ps=conn.prepareStatement(sql);
  77. ps.setString(1, username);
  78. ps.setString(2, password);
  79. rs=ps.executeQuery();
  80. if(rs.next()){
  81. User user=new User();
  82. user.setId(rs.getInt("id"));
  83. user.setUsername(rs.getString("username"));
  84. user.setPassword(rs.getString("password"));
  85. user.setNickname(rs.getString("nickname"));
  86. user.setEmail(rs.getString("email"));
  87. return user;
  88. }else{
  89. return null;
  90. }
  91. } catch (Exception e) {
  92. e.printStackTrace();
  93. throw new RuntimeException(e);
  94. }finally{
  95. JDBCUtils.close(rs, ps, conn);
  96. }
  97. }
  98.  
  99. }

20160408javaweb之JDBC ---PreparedStatement的更多相关文章

  1. Type mismatch: cannot convert from java.sql.PreparedStatement to com.mysql.jdbc.PreparedStatement

    Connection.prepareStatement()函数出错,提示: Type mismatch: cannot convert from java.sql.PreparedStatement ...

  2. 关于Mysql数据库longblob格式数据的插入com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V问题分析

    当数据库字段为blob类型时 ,我们如果使用PreparedStatement中的setBinaryStream(int,InputStream,int)方法需要注意 在向blob字段类型中插入数据时 ...

  3. mysql数据库插入数据获取自增主键的三种方式(jdbc PreparedStatement方式、mybatis useGeneratedKeys方式、mybatis selectKey方式)

    通常来说对于mysql数据库插入数据获取主键的方法是采用selectKey的方式,特别是当你持久层使用mybatis框架的时候. 本文除此之外介绍其它两种获取主键的方式. 为了方便描述我们先建一张my ...

  4. Method com/mysql/jdbc/PreparedStatement.isClosed()Z is abstract 报错解决

    java.lang.AbstractMethodError: Method com/mysql/jdbc/PreparedStatement.isClosed()Z is abstract ----- ...

  5. JDBC PreparedStatement Statement

    参考:预编译语句(Prepared Statements)介绍,以MySQL为例 1. 背景 本文重点讲述MySQL中的预编译语句并从MySQL的Connector/J源码出发讲述其在Java语言中相 ...

  6. JDBC/PreparedStatement

      JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力     JDBC  AP 是Sun公司提供的I 内容:供程序员调用的接口,集成在Java.sql和javax.sql包中, 如 ...

  7. 关于JDBC PreparedStatement

    PreparedStatement的执行步骤: 1. 向数据库服务器发送SQL语句,数据库对SQL进行解析和优化(conn.preparedStatement(sql)) 2. 向数据库发送绑定的参数 ...

  8. JavaEE JDBC PreparedStatement

    PreparedStatement @author ixenos PreparedStatement工作原理 注意:虽然mysql不支持PreparedStatement优化,但依然有预编译的实现! ...

  9. JDBC——PreparedStatement执行SQL的对象

    Statement的子接口,预编译SQL,动态SQL 功能比爹强大 用来解决SQL注入的 预编译SQL:参数使用?作为占位符,执行SQL的时候给?赋上值就可以了 使用步骤: 1.导入驱动jar包 复制 ...

随机推荐

  1. 使用 testng.xml 参数化

    1. 创建 Java 测试类 2. 添加测试方法 TestngParameterTest(String name, String age) 3. 为测试方法添加注释 @Parameters({&quo ...

  2. tmux快捷键`

    Ctrl+b 激活控制台:此时以下按键生效 系统操作 ? 列出所有快捷键:按q返回 d 脱离当前会话:这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 D 选择要脱离的 ...

  3. HDOJ-ACM1013(JAVA)

    这道题也很简单~主要是将输入转为字符串(存储大数,操作字符数组) 题意: 24 : 2 + 4 = 6  输出6 39 : 3 + 9 = 12 , 1 + 2 = 3 输出3 999: 9 + 9 ...

  4. windows service自动重启服务

    服务一般都能正常的运行,但有时候也会有一些假死现象,比如公司有一考勤服务就因为依赖于硬件厂家的api, 但厂家api运行一段时间后会默名的假死,引起整个服务假死,因为这一假死现象具有不确定性,所以不太 ...

  5. Go语言简介

    Go语言简介 - Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率. Go语言简介 Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率. Go ...

  6. 关于easyui模拟win2012桌面的一个例子系列

    最近时间比较充裕,想到之前领导问我,什么界面更适合公司这种屏幕小但是又要求可以同时处理更多的工作. 我感觉  windows是最合适的,毕竟微软已经做了这么多年的系统了,人的操作习惯已经被他们确定了. ...

  7. springMVC学习笔记--初识springMVC

    前一段时间由于项目的需要,接触了springMVC(这里主要是讲3.1版,以下内容也是围绕这个版本展开),发觉其MVC模式真的很强大,也简单易用,完全是基于注解实现其优雅的路径配置的.想想以前接手的项 ...

  8. 框架技术--S2SH框架整合(spring部分)No 3--声明式事务

    声明式事务:就是讲事务的处理,通过配置进行配置. 几种传播特性  1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启(比较常用)  2. PROPA ...

  9. 校友信息管理系统&SNS互动平台之用户需求及概要设计

    前言.提纲及说明: 请移步:<校友信息管理&SNS互动平台之前言.目录及说明>(博客园地址:http://www.cnblogs.com/s6cn/p/3516876.html) ...

  10. mysql-no-install 手动安装

    D:\mysql-5.5.28-win32 1.下载mysql-5.5.15-win32.zip,解压到本地D:\mysql. 2.将my-small.ini另存为my.ini .(根据情况可以选择别 ...