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. Mongo DB 2.6 需要知道的一些自身限定

    在现实的世界中,任何事情都有两面性,在程序的世界中,亦然! 我们不论是在使用一门新的语言,还是一门新的技术,在了解它有多么的让人兴奋,让人轻松,多么的优秀之余,还是很有必要了解一些他的局限性,方便你在 ...

  2. NoClassDefFoundError vs ClassNotFoundException

    我们先来认识一下Error 和Exception, 两个都是Throwable类的直接子类.  Javadoc 很好的说明了Error类: An Error is a subclass of Thro ...

  3. tyvj1463 智商问题

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

  4. [Scala] 快学Scala A2L2

    集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快 ...

  5. maven项目常见问题

    问题1:Maven项目,右键-update project后报错如下的解决办法: 1).DescriptionResourcePathLocationType Java compiler level ...

  6. c#微信开发 转

    using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System. ...

  7. C和指针 第十章 结构和联合 (一)

    结构体: 聚合数据类型是指,能够同时存储超过一个的单独数据,C语言中有两个聚合数据类型,数组和结构体.数组中储存的类型必须相同,元素通过下标和指针引用来访问的. 结构体也是一些值的集合,但是结构体中每 ...

  8. Java的内存机制

    Java 把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空 ...

  9. 安装配置LDAP遇到的问题

    问题1:安装完启动ldap服务报错: ldap: unrecognized service? 原因在于新版的openldap将服务名改为了slapd,使用service slapd start即可启动 ...

  10. WEB API异常处理

    当一个web api抛出一个异常后 此异常会被转化成一个HTTP响应 错误代码为500的服务错误 但是如果你不想让客户端看到500的错误码 你也可以自定义错误码 如下代码当用户输入的ID没有与之相关的 ...