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中就应该是 ...
随机推荐
- winrt简单克隆对象
public MapPoint Copy()//MapPoint克隆方法 { MapPoint p = new MapPoint();//这是我自定义的对象 //利用反射获得类成员 FieldInfo ...
- (iOS逆向工程)class-dump 安装与使用
class-dump,是可以把OC运行时的声明的信息导出来的工具.说白了,就是可以导出.h文件.用class-dump可以把未经加密的app的头文件导出来.废话不多说.class-dump的下载地址是 ...
- cisco-log
每个日志消息被关联一个严重级别,用来分类消息的严重等级:数字越低,消息越严重.严重级别的范围从0(最高)到7(最低). 日志消息的严重级别,使用logging命令可以用数字或者名称来指定严重性. ...
- [Android Pro] ScrollView嵌套RecyclerView时滑动出现的卡顿
reference to : http://zhanglu0574.blog.163.com/blog/static/113651073201641853532259/ ScrollView嵌套Rec ...
- 最小生成树的Kruskal算法实现
最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...
- .NET中RabbitMQ的使用
概述 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public ...
- windows批处理语法
写批处理文件,除了了解基本语法外,你还需要熟悉常用的windows命令,那就先看看这篇文章:windows常用命令 #重要说明 文件及目录路径:要使用反斜杠'\',不要使用正斜杠'/' 如:del d ...
- Microchip微芯HCS301解密HCS360解密HCS361芯片解密多少钱?
Microchip微芯HCS系列芯片解密型号: HCS101 | HCS200 | HCS201 | HCS201T | HCS300 | HCS300T HCS301 | HCS301T | HCS ...
- java打包文件夹为zip文件
//待压缩的文件目录 String sourceFile=sourceFilePath+"\\"+userName; //存放压缩文件的目录 String zipFilePath ...
- cookie编码乱码问题与cookie禁用后session操作
Cookie传输的值只能是ASCII码,该编码表相对老旧不含有很多符号与文字 特别是中文,所以在cookie传值过程中需要先转成相应的ASCII编码再解析 如下 URLEncoder.encode(& ...