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. AJAX 与 MySQL

    AJAX 与 MySQL AJAX 可用来与数据库进行交互式通信. AJAX 数据库实例 下面的实例将演示网页如何通过 AJAX 从数据库读取信息: 实例   Select a person:   P ...

  2. XML Schema and XMLspy notes

    Introduction An xml documents consists of elements, attributes and text. There are two structures in ...

  3. Swift3.0P1 语法指南——枚举

    原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...

  4. C和指针 第十四章 预处理器 头文件

    编写一个C程序,第一个步骤称为预处理,预处理在代码编译之前,进行一些文本性质的操作,删除注释.插入被include的文件.定义替换由#define定义的符号,以及确定代码的部分内容是否应该按照条件编译 ...

  5. 06OC之内存管理

    在高级语言中,例如C#是通过垃圾回收机制(GC)来解决这个问题,但是在OC并没有类似的垃圾回收机制,因此必须由程序员手动去维护.今天就讲讲OC中的内存管理: 一.内存管理原理 在Xcode4.2之后的 ...

  6. dos 下删除文件、文件夹

    删除文件 /p 删除每一个文件之前提示确认/f 强制删除只读文件 /s 从当前目录及所有子目录删除指定文件/q 安静模式.删除全局通配符时,不要求确认/a 根据属性选择要删除的文件 指定下列文件属性中 ...

  7. Codeforces 696 C. PLEASE

    Description 三个杯子,一开始钥匙在中间,每次等概率的选择两边的两个,与中间的交换,问第 \(n\) 次选择中间的杯子是钥匙的概率是多少. \(n=\sum_{i=1}^{k} a_i,a_ ...

  8. 6个变态的C语言Hello World程序

    6个变态的C语言Hello World程序   下面的六个程序片段主要完成这些事情: 输出Hello, World 混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C+ ...

  9. python logging模块笔记

    1 ) 给logger定制了两个日志级别INFO和DEBUG,分别通过filehandler添加不同输出到不同文件,但如何让DEBUG里只有DEBUG的信息? 答案:可重写DEBUG对应的Fileha ...

  10. 链表原地反转Demo

    现在就是Qt开发和给师弟师妹讲下数据结构吧,感觉还挺漫长的,上个Qt帖子等我把成品做出来再更. //Convert_plug.h #ifndef CONVERT #define CONVERT #de ...