概要:

PreparedStatement 接口继承自 Statement 接口,PreparedStatement 比普通Statement 对象使用起来更加灵活,更有效率。

一、PreparedStatement与Statement相比,具有什么优势?

1、相对比较安全,可以防止sql注入。

2、有预编译功能,相同操作批量数据效率较高。

3、使用PreparedStatement 接口,继承自 Statement接口比Statement对象使用起来更加灵活,更有效率。

二、实例代码

 import java.sql.*;
import java.util.Scanner;
import org.apache.log4j.Logger;
/**
* 使用 Statement 安全性差,存在 SQL 注入隐患。
* @author CSEE
*/
public class Test6 {
private static Logger logger = Logger.getLogger(Test6.class.getName());
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//0、根据控制台提示输入用户账号和密码
Scanner input = new Scanner(System.in);
System.out.println("\t 宠物主人登录");
System.out.print("请输入姓名:");
String name=input.next();
System.out.print("请输入密码:");
String password=input.next();
// 1、加载驱动
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e) {
logger.error(e);
}
try {
// 2、建立连接
conn = DriverManager.getConnection(
"jdbc:sqlserver://localhost:1433;DatabaseName=epet",
"jbit", "bdqn");
// 3 、判断宠物主人登录是否成功
stmt = conn.createStatement();
String sql="select * from master where name='"+name+
"' and password='"+password+"'";
System.out.println(sql);
rs = stmt.executeQuery(sql);
if(rs.next())
System.out.println(" 登录成功,欢迎您!");
else
System.out.println(" 登录失败,请重新输入!");
} catch (SQLException e) {
logger.error(e);
} finally {
// 4、关闭 Statement 和数据库连接
try {
if (null != stmt) {
stmt.close();
}
if (null != conn) {
conn.close();
}
} catch (SQLException e) {
logger.error(e);
}
}
}
}

注:这就是网上典型的 SQL 注入攻击,原因就在于使用 Statement 接口方法时要进行 SQL
语 句 的 拼 接 , 不 仅 拼 接 繁 琐 麻 烦 , 容 易 出 错 , 还 存 在 安 全 漏 洞 。 而 使 用
PreparedStatement 接口就不存在这个问题。

三、PreparedStatement 比 Statement 好在哪里?
 提高了代码的可读性和可维护性。
         虽然使用 PreparedStatement 来代替 Statement 会多几行代码,但避免了繁琐
麻烦又容易出错的 SQL 语句拼接,提高了代码的可读性和可维护性。
 提高了 SQL 语句执行的性能。
         创建 Statement 对象时不使用 SQL 语句做参数,不会解析和编译 SQL 语句,每次
调用方法执行 SQL 语句时都要进行 SQL 语句解析和编译操作,即操作相同仅仅是数
据不同。
        创建 PreparedStatement 对象时使用带占位符的 SQL 语句做参数,会解析和编译
该 SQL 语句,在通过 setXxx 方法给占位符赋值后执行 SQL 语句时无需再解析和编
译 SQL 语句,直接执行即可。多次执行相同操作可以大大提高性能。
 提高了安全性。
         PreparedStatement 使用预编译语句,传入的任何数据都不会和已经预编译的 SQL
语句进行拼接,避免了 SQL 注入攻击。

Java中PreparedStatement与Statement的总结的更多相关文章

  1. Java中PreparedStatement和Statement的用法区别(转)

    1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.   2.作为 ...

  2. JDBC 中preparedStatement和Statement区别

    一.概念 PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement.PreparedStatement 和 CallableStatement三种方式 ...

  3. 【Java】PreparedStatement VS Statement

    创建时: Statement statement = conn.createStatement();    PreparedStatement preStatement = conn.prepareS ...

  4. JDBC中PreparedStatement和Statement的区别

    共同点: PreparedStatement和Statement都是用来执行SQL查询语句的API之一. 不同点: 在PreparedStatement中,当我们经常需要反复执行一条结构相似的sql语 ...

  5. JDBC中PreparedStatement相比Statement的好处

    Statement对象: 用于执行不带参数的简单SQL语句: 特点: a. 只执行单条的sql语句: b. 只能执行不带参数的sql语句: c.运行原理的角度,数据库接收到sql语句后需要对该条sql ...

  6. oracle 包,函数,过程,块的创建和执行及在java中执行(转)

    SQL> create or replace procedure sp_guocheng1 is--如果有这个名字就替换  2  begin--执行部分  3  insert into guoc ...

  7. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...

  8. java.sql.preparedstatement和java.sql.statement的区别

    本文转自CSDN,然后整理了一遍.原文出处:CSDN JDBC(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.stateme ...

  9. java的PreparedStatement中使用like时的问题

    SQL:select * from students where name like '%tommy%'; 正常的sql如上,是可以直接执行的, 那放到java的P热怕热的Statement中就应该是 ...

随机推荐

  1. 让EF飞一会儿:如何用Entity Framework 6 连接Sqlite数据库

    获取Sqlite 1.可以用NuGet程序包来获取,它也会自动下载EF6 2.在Sqlite官网上下载对应的版本:http://system.data.sqlite.org/index.html/do ...

  2. spring 注解

    @Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 by ...

  3. jquery this 和 event.target 区别

    1.this和event.target的区别: js中事件是会冒泡的,所以this是可以变化的,但event.target不会变化,它永远是直接接受事件的目标DOM元素: 2.this和event.t ...

  4. 关于网络-get/post

    关于网络: //英译  connection:连接 append:添加 resign:放弃 // 加载网页数据 步骤 [self.webView loadRequest:request]; NSURL ...

  5. vagrant安装及使用方法

    http://www.chenjie.info/1757 http://blog.csdn.net/zsl10/article/category/6324870   --以下转自MaxWellDuva ...

  6. 最小生成树的Kruskal算法实现

    最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...

  7. come on,逆战

    腾讯游戏       琳琅天上        逆战                                                                            ...

  8. (转)Java集合框架:HashMap

    来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...

  9. MVC 教程汇总

    http://www.cnblogs.com/powertoolsteam/archive/2015/08/13/4667892.html

  10. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...