WHY?

  <1>使用Statement需要进行拼写SQL语句,容易出错;
  <2>PreparedStatement:是Statement的子接口,可以传入带占位符的SQL语句,并且提供了补充占位符变量的方法。

  <3>有效的防止SQL注入

    SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令从而利用系统的SQL引擎完成恶意行为的做法;对于java而言要防范SQL注入,只要用PreparedStatement取代Statement就可以了。

  SQL注入的实现:

    String username="a' or password= ";
      String password=" or '1'='1";
      String SQL="select * from users where username='"+username+"' and password='"+password+"'";

  <4>PreparedStatement能最大可能提高性能:

    ---DBServer会对预编译语句提供性能优化。因为预编译语句可能重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,下次调用时只要是相同的预编译语句就不需要编译,只要将参数直                 接传入编译过的语句执行代码中就会得到执 行。

    ---在Statement语句中,即使是相同的操作但因为数据内容的不一样所以整个语句本身不能匹配,没有缓存语句的意义。事实是没有数据库会对普通语句编译后的执行代码缓存,这样每执行一次都要对传入

的语句进行一次编译。

    ---语法检查、语义检查、翻译成二进制命令,缓存。

@Test
 public void testPreparedStatement(){
  
    Student stu=null;
    Connection conn=null;
    PreparedStatement ps=null;
  
    try {
       conn=JDBCTools.getConnection();
       String sql="insert into customers (name,email,birth) "
         + "values(?,?,?)";
       ps=conn.prepareStatement(sql);

     //设置占位符的值
       ps.setString(1, "kk");
       ps.setString(2, "123@。com");
       ps.setDate(3, new Date(new java.util.Date().getTime()));
       ps.executeUpdate();
    } catch (Exception e) {
       e.printStackTrace();
    }finally{
       JDBCTools.release(null, ps, conn);
    }
 }

修改后的更新语句方法:

@Test
 public void testPreparedStatement(){
  
    Student stu=null;
   
    String sql="insert into customers (name,email,birth) "
         + "values(?,?,?)";
    JDBCTools.update(sql, "mx","123@。com",new Date(new java.util.Date().getTime()));
 }

JDBCTools.java  修改后的工具类

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCTools {
 
 /*
  * 执行SQL的方法
  *   insert,update,delete
  * */
 public static void update(String sql,Object...args){
  
  Connection conn=null;
  PreparedStatement ps=null;
  
  try {
   /*
    * 1、获取Connection连接
    * 2、获取Statement
    * 3、SQL语句
    * 4、关闭数据库连接
    *
    * */
   conn=getConnection();
   ps=conn.prepareStatement(sql);
   
   for (int i = 0; i < args.length; i++) {
    ps.setObject(i+1, args[i]);
   }
   
   ps.executeUpdate();
   
   
  } catch (Exception e) {
   e.printStackTrace();
  }finally{
   release(null,ps, conn);
  }
 }

public static Connection getConnection() throws Exception {

String driverClass = null;
  String jdbcUrl = null;
  String user = null;
  String password = null;

// 读取类路径下的jdbc.properties文件
  InputStream in = JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
  Properties properties = new Properties();
  properties.load(in);

driverClass = properties.getProperty("driver");
  jdbcUrl = properties.getProperty("jdbcUrl");
  user = properties.getProperty("user");
  password = properties.getProperty("password");
  // 加载数据库驱动程序
  Class.forName(driverClass);
  // 通过DriverManager的getConnection()方法获取数据库连接
  Connection connection = DriverManager.getConnection(jdbcUrl, user, password);
  return connection;

}
  
 public static void release(ResultSet rs,Statement st,Connection conn){
  
  if (rs!=null) {
   try {
    rs.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  
  if (st!=null) {
   try {
    st.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  
  if (conn!=null) {
   try {
    conn.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
 }
}

<四>JDBC_PreparedStatement的使用的更多相关文章

  1. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  2. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  3. 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户

    阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...

  4. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  5. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  6. “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)

    前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...

  7. 【翻译】MongoDB指南/CRUD操作(四)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...

  8. HTML 事件(四) 模拟事件操作

    本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4.  ...

  9. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

随机推荐

  1. arguments 对象的老历史

    引题:为什么 JavaScript 中的 arguments 对象不是数组 http://www.zhihu.com/question/50803453 JavaScript 1.0 1995 年, ...

  2. tyvj1463 智商问题

    背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有小姊妹的智商小姊妹的智商都是非负整 ...

  3. average slice

    A non-empty zero-indexed array A consisting of N integers is given. A pair of integers (P, Q), such ...

  4. dos 操作显示 > nul 2>nul

    1>nul 屏蔽操作成功显示的信息,但是出错还是会显示(同 >nul)2>nul 屏蔽操作失败显示的信息,但是成功还是会显示>nul 2>nul 就是正确的错误的一起屏蔽 ...

  5. Python自动化之django的ORM操作——Python源码

    """ The main QuerySet implementation. This provides the public API for the ORM. " ...

  6. stack.sh failing giving error "g-api did not start"

    same issue i faced , tried with ./unstack.sh and ./clean.sh also but couldn't fix the issue.Followin ...

  7. 查看cpu的信息cat /proc/cpuinfo

    cat /proc/cpuinfo processor : vendor_id : GenuineIntel cpu family : model : model name : Intel(R) Co ...

  8. 百度地图-省市县联动加载地图 分类: Demo JavaScript 2015-04-26 13:08 530人阅读 评论(0) 收藏

    在平常项目中,我们会遇到这样的业务场景: 客户希望把自己的门店绘制在百度地图上,通过省.市.区的选择,然后加载不同区域下的店铺位置. 先看看效果图吧: 实现思路: 第一步:整理行政区域表: 要实现通过 ...

  9. Nginx反向代理的工作方式

    如图所示: 当客户端发来HTTP请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存 ...

  10. Jmeter之Web端HTTP性能测试(九)

    之前有跟大家讲过通过Badboy来录制脚本,这里就不多说了,需要的可以参考 Jmeter之Badboy录制脚本及简化脚本http请求(三) 这边就不用项目的链接了,直接采用http://www.cnb ...