Java PreparedStatement

PreparedStatement是一个用于执行sql语句的标准接口的对象。它是继承与Statement。根据里氏代换原则。用Statement执行的语句,一定可以用Prepared替换了。那么他们之间有什么不同呢。

PreparedStatement

  • 使用参数化的方式,可以用?表明变量的值位置,执行时根据位置提供变量的值。
  • 该对象是预编译的,多次执行的效率高
  • 安全性方面,高于Statement。

Statement

  • 执行没有参数,可以动态的执行sql
  • 没有预编译,每次都是执行。多次执行的效率低

以上是他们各自的特点。各自具有优点同时也具有自身的缺点。所以我们应根据不同的场合具体使用,不能说谁的优点多就使用谁,具体情况应该具体分析。例如,一个组合的sql,sql是动态的,由于Statement本身具有动态的执行sql特点,若安全性不高,首先考虑它还是很好的选择。

下面我们就做个对比 根据id查询

Statement写法

stringsql ="select * from people p where p.i = "+id;

PreparedStatement写法

stringsql ="select * from people p where p.id = ? ";
preparedstatement ps= connection.preparestatement(sql);

这个写法很熟悉,在.NET中是常见的。所以并没有学习什么新鲜的东西。

以上两种写法是截然不同的。记得在vb中我常用的是statmen的写法,那么还不摘掉什么是sql注入,等师父验收的使用,不费吹灰之力就进入了我的系统。而如果使用PreparedStatement就不存在这种方式。验证如下

String sql ="select * from tb_name where name= '"+varname+"' andpasswd='"+varpasswd+"'";
select* from tb_name = '随意' and passwd = '' or '1' = '1';

因为‘1‘=‘1‘肯定成立,所以可以任何通过验证。甚至知道表明就可以删除里面的所有数据了。

当然了这是statement的缺点。而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.

如何使用PreparedStatement

1引入特定包

importjava.sql.PreparedStatement;

importjava.sql.ResultSet;

2实例化PreparedStatement和结果集

PreparedStatementprepstmt = null;

ResultSetrs = null;

3得到sql语句

conn 为Connection类型

prepstmt= conn.prepareStatement(String StrSQl);

4执行sql,得到结果集

rs 为ResultSet类型。

rs= prepstmt.executeQuery();

一个完整的事例

importjava.sql.Connection;
importjava.sql.PreparedStatement;//
import java.sql.ResultSet;//结果集包
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.sql.Timestamp;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.List;

importcom.bjpower.drp.sysmgr.domain.User;
importcom.bjpower.drp.util.DbUtil;
importcom.bjpower.drp.util.PageModel;

/**
 * 根据用户代码查询用户
 * @param userId
 * @return
 * @throws SQLException
 */
publicUser findUserById(String userId) throws Exception {
StringBuffersql= new StringBuffer();
sql.append("selectuser_id, user_name, password, contact_tel, email, create_date from t_user  where user_id= ?");
Connection conn=null;//连接
PreparedStatement pstmt=null;//实例化PreparedStatement
ResultSet rs= null;//实例化结果集,存放PreparedStatement查询的结果
User user=null;//返回的User实体对象
try{
conn= DbUtil.getconnection();//创建数据库连接
pstmt=conn.prepareStatement(sql.toString());//得到sql语句
pstmt.setString(1, userId);//传入参数
rs=pstmt.executeQuery();//执行sql语句,得到结果集
//User对象得到结果集中的值
if(rs.next()){
user=newUser();

user.setUserId(rs.getString("user_id"));
user.setUserName(rs.getString("user_name"));
user.setPassword(rs.getString("password"));
user.setContactTel(rs.getString("contact_tel"));
user.setEmail(rs.getString("email"));
user.setCreateDate(rs.getTimestamp("create_date"));
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
//关闭连接
DbUtil.close(rs);
DbUtil.close(pstmt);
DbUtil.close(conn);
}
returnuser;
}
 

小结

以上是PreparedStatement的基本使用。很向自己在.net中编写的sql和Parameter的结合体。知识都是类似的,这次并没什么新东西。回顾对比下,只是多了几个包的引用。继续加油了。

Java PreparedStatement

时间: 2024-10-10 17:40:59

Java PreparedStatement的相关文章

java PreparedStatement操作oracle数据库

import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; //import java.sql.Statement; import java.sql.PreparedStatement; public class lx02{ public static void main(String[] args) throws SQLException, ClassNotFoundException

【JDBC】java PreparedStatement操作oracle数据库

************************************************************************ ****原文:blog.csdn.net/clark_xu  徐长亮的专栏 ************************************************************************ import java.sql.Connection; import java.sql.ResultSet; import java

用java PreparedStatement就不用担心sql注入了吗?

先感慨下,好久没写博客了,一是工作太忙,二是身体不太给力,好在终于查清病因了,趁着今天闲下来,迫不及待与读者交流,最后忠告一句:身体是活着的本钱! 言归正传,对java有了解的同学基本上都体验过JDBC,基本都了解PreparedStatement,PreparedStatement相比Statement基本解决了SQL注入问题,而且效率也有一定提升. 关于PreparedStatement和Statement其他细节我们不讨论,只关心注入问题.无论读者是老鸟还是菜鸟,都需要问一下自己,Prep

java PreparedStatement和statement的区别

1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.2.作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能.三种方法execute. executeQuery 和 executeUpdate 已被更改以使之不再需要参数 3.在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStat

java PreparedStatement造成内存泄漏 的解决方法

最近用java写一个数据库程序,发现运行一段时间后总会出现内存溢出.想用内存监控工具查看一下是哪里内存泄漏了,于是上网查看了一下,看到了jmap工具. jmap工具 jmap打印出某个java进程(使用pid)内存内的,所有'对象'的情况(如:产生那些对象,及其数量). 可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本.使用方法 jmap -histo pid.如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文

博客收藏列表

个人博客 田守枝的博客 许令波的博客 阮一峰的博客 flyne的博客 陶邦仁的博客 方腾飞的博客 技术入门 VIM入门 zookeeper简单介绍 JMS相关1.JMS相关2 原理探究 OAuth2.0介绍 RSA加密介绍 用java PreparedStatement就不用担心sql注入了吗? 许令波关于Java中文乱码的分析 问题解决 Maven工程中,Java访问resources文件夹下文件 scp ssh 不输密码 Tar 命令 RPM 命令 CentOS 编译MySql 工具 mav

Java -- JDBC 学习--PreparedStatement

可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象.PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句.PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参

【Java编程】JDBC注入攻击-Statement 与 PreparedStatement

在上一篇[Java编程]建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement我们介绍了如何使用JDBC驱动建立一个简单的连接,并实现使用Statement和PreparedStatement进行数据库查询,本篇blog将接着上篇blog通过SQL注入攻击比较Statement和PreparedStatement.当然这两者还有很多其他方面的不同,在之后的blog中会继续更新. [Statement查询] 1.在DBH

Java中PreparedStatement和Statement的用法区别

Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能.三种方法 execute. executeQuery