Java中PreparedStatement与Statement的总结
概要:
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的总结的更多相关文章
- Java中PreparedStatement和Statement的用法区别(转)
1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 ...
- JDBC 中preparedStatement和Statement区别
一.概念 PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement.PreparedStatement 和 CallableStatement三种方式 ...
- 【Java】PreparedStatement VS Statement
创建时: Statement statement = conn.createStatement(); PreparedStatement preStatement = conn.prepareS ...
- JDBC中PreparedStatement和Statement的区别
共同点: PreparedStatement和Statement都是用来执行SQL查询语句的API之一. 不同点: 在PreparedStatement中,当我们经常需要反复执行一条结构相似的sql语 ...
- JDBC中PreparedStatement相比Statement的好处
Statement对象: 用于执行不带参数的简单SQL语句: 特点: a. 只执行单条的sql语句: b. 只能执行不带参数的sql语句: c.运行原理的角度,数据库接收到sql语句后需要对该条sql ...
- oracle 包,函数,过程,块的创建和执行及在java中执行(转)
SQL> create or replace procedure sp_guocheng1 is--如果有这个名字就替换 2 begin--执行部分 3 insert into guoc ...
- Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...
- java.sql.preparedstatement和java.sql.statement的区别
本文转自CSDN,然后整理了一遍.原文出处:CSDN JDBC(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.stateme ...
- java的PreparedStatement中使用like时的问题
SQL:select * from students where name like '%tommy%'; 正常的sql如上,是可以直接执行的, 那放到java的P热怕热的Statement中就应该是 ...
随机推荐
- PHP 基础(赋值及函数)
开端<?php>结尾</php> 弱类型语言 定义变量的时候 不需要 声明 但是 每一个变量前 都必须 加$ 符号 储存文件按 统一放到 安装文件夹下面的 WA ...
- hibernate中一对多关系中的inverse,cascade属性
举例说明: 一对多关系的两张表:boy.girl(一个男孩可以多个女朋友) boy表结构 Field Type ------ ----------- name varcha ...
- MySQL源码分析:源码文件结构及主要数据结构
原文地址:http://blog.itpub.net/30186219/viewspace-1481125/BUILD: 内含在各个平台.各种编译器下进行编译的脚本.如compile-pentium- ...
- XCode 中的代码块导出与导入
目标文件放置位置 ~/Library/Developer/Xcode/UserData/CodeSnippets CodeSnippets 这整个文件夹都是 直接搬移整个文件夹 操作方法: 解压缩并复 ...
- CompletionService/ExecutorCompletionService/线程池/concurrent包
线程池 线程池的基本思想:线程频繁的创建.销毁会极大地占用系统资源,为了减少系统在创建销毁线程时的开销,线程池应运而生.线程池包括多个已创建的线程,当有任务要在新线程中执行时,将任务提交给线程池,线程 ...
- iOS第三方Api及常用框架总结
iOS常用框架汇总: SVProgressHUD:产生覆盖层,禁止某种操作 SDWebImage: 专业下载图片框架 AFN:网络数据请求框架 MJExtension,模型对象之间互转 第三方分享第三 ...
- java发送GET和post请求
package com.baqingshe.bjs.util; import java.io.BufferedReader; import java.io.IOException; import ja ...
- wordpress电子商务插件和主题的使用方法
前提步骤:卸载wordpress干净,需要把相应的数据库删除:drop databade **: (1)先改wordpress中重要文件的权限:777 (2)用usradd -d www /html命 ...
- Xcode 插件失效
1.终端输入: 如果放在了应用程序里,就是这个: defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityU ...
- SQLite 粗劣内容
SQLite 的官网 http://addons.mozillan.org/firefox/addon/sqlite-manager/ http://www.sqlite.org sqlite3 *s ...