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

PreparedStatement

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

Statement

  • 运行没有參数,能够动态的运行sql
  • 没有预编译,每次都是运行。多次运行的效率低

以上是他们各自的特点。各自具有长处同一时候也具有自身的缺点。所以我们应依据不同的场合详细使用,不能说谁的长处多就使用谁,详细情况应该详细分析。比如,一个组合的sql,sql是动态的,因为Statement本身具有动态的运行sql特点,若安全性不高,首先考虑它还是非常好的选择。

以下我们就做个对照 依据id查询

Statement写法

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

PreparedStatement写法

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

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

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

  1. String sql ="select * from tb_name where name= '"+varname+"' andpasswd='"+varpasswd+"'";
  2. 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();

一个完整的事例

  1. importjava.sql.Connection;
  2. importjava.sql.PreparedStatement;//
  3. import java.sql.ResultSet;//结果集包
  4. importjava.sql.SQLException;
  5. importjava.sql.Statement;
  6. importjava.sql.Timestamp;
  7. importjava.util.ArrayList;
  8. importjava.util.Date;
  9. importjava.util.List;
  10.  
  11. importcom.bjpower.drp.sysmgr.domain.User;
  12. importcom.bjpower.drp.util.DbUtil;
  13. importcom.bjpower.drp.util.PageModel;
  14.  
  15. /**
  16. * 依据用户代码查询用户
  17. * @param userId
  18. * @return
  19. * @throws SQLException
  20. */
  21. publicUser findUserById(String userId) throws Exception {
  22. StringBuffersql= new StringBuffer();
  23. sql.append("selectuser_id, user_name, password, contact_tel, email, create_date from t_user where user_id= ?");
  24. Connection conn=null;//连接
  25. PreparedStatement pstmt=null;//实例化PreparedStatement
  26. ResultSet rs= null;//实例化结果集,存放PreparedStatement查询的结果
  27. User user=null;//返回的User实体对象
  28. try{
  29. conn= DbUtil.getconnection();//创建数据库连接
  30. pstmt=conn.prepareStatement(sql.toString());//得到sql语句
  31. pstmt.setString(1, userId);//传入參数
  32. rs=pstmt.executeQuery();//运行sql语句,得到结果集
  33. //User对象得到结果集中的值
  34. if(rs.next()){
  35. user=newUser();
  36.  
  37. user.setUserId(rs.getString("user_id"));
  38. user.setUserName(rs.getString("user_name"));
  39. user.setPassword(rs.getString("password"));
  40. user.setContactTel(rs.getString("contact_tel"));
  41. user.setEmail(rs.getString("email"));
  42. user.setCreateDate(rs.getTimestamp("create_date"));
  43. }
  44. }catch(SQLExceptione){
  45. e.printStackTrace();
  46. }finally{
  47. //关闭连接
  48. DbUtil.close(rs);
  49. DbUtil.close(pstmt);
  50. DbUtil.close(conn);
  51. }
  52. returnuser;
  53. }

小结

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

Java PreparedStatement的更多相关文章

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

    先感慨下,好久没写博客了,一是工作太忙,二是身体不太给力,好在终于查清病因了,趁着今天闲下来,迫不及待与读者交流,最后忠告一句:身体是活着的本钱! 言归正传,对java有了解的同学基本上都体验过JDB ...

  2. 【JDBC】java PreparedStatement操作oracle数据库

    ************************************************************************ ****原文:blog.csdn.net/clark_ ...

  3. java PreparedStatement和statement的区别

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

  4. Java SQL注入学习笔记

    1 简介 文章主要内容包括: Java 持久层技术/框架简单介绍 不同场景/框架下易导致 SQL 注入的写法 如何避免和修复 SQL 注入 2 JDBC 介绍 JDBC: 全称 Java Databa ...

  5. 浅析Statement和PreparedStatement的区别

    当我们使用java程序来操作sql server时会使用到Statement和PreparedStatement,俩者都可以用于把sql语句从java程序中发送到指定数据库,并执行sql语句.那么如何 ...

  6. SQL注入的原理与预防

    1. 什么是SQL注入? SQL注入是常见的网络攻击方式之一,通过SQL语句实现无账号登录,非法获取甚至篡改数据库中的数据. 2. SQL注入的思路 (1)找到SQL注入位置: (2)判断服务器类型和 ...

  7. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  8. Java中PreparedStatement与Statement的总结

    概要: PreparedStatement 接口继承自 Statement 接口,PreparedStatement 比普通Statement 对象使用起来更加灵活,更有效率. 一.PreparedS ...

  9. Type mismatch: cannot convert from java.sql.PreparedStatement to com.mysql.jdbc.PreparedStatement

    Connection.prepareStatement()函数出错,提示: Type mismatch: cannot convert from java.sql.PreparedStatement ...

随机推荐

  1. XML文件解析之--DOM与SAX

    xml文件又称‘可扩展性标记语言’,可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发. 我们在进行web开发的时候离不开xml文件,xml ...

  2. 【Demo 0007】Android 信使(Intent)

    本章学习要点:       1.  了解Intent功能作用:       2.  掌握Intent在显示和隐示基本使用方法及规则:           

  3. Linux下的链接文件

    整理自<鸟哥的Linux私房菜>,整理者:华科小涛http://www.cnblogs.com/hust-ghtao/ Linux中的链接文件分为两种:硬链接和软链接.软链接(symbol ...

  4. ASP.NET - TreeView 增删

    效果: 前端代码: <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Si ...

  5. 使用JDBC调用数据库的存储过程

    本篇讲述如何使用JDBC来调用MySQL数据库中的存储过程.建议在学习如何使用JDBC调用存储过程前,请先了解如何在数据库中使用存储过程. 存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句 ...

  6. shell telnet 路由器

    #!/usr/bin/expect -f spawn telnet 172.16.1.80 expect "login" { send "admin\n" ex ...

  7. java输出空心菱形

    package com.zsh; import java.util.Scanner; public class Test08 { public static void main(String[] ar ...

  8. linux kill进程和子进程小trick

           我们的hive web是调用polestar restful service(https://github.com/lalaguozhe/polestar-1)来执行具体的hive或者s ...

  9. python实现PKCS5Padding

    python实现PKCS5Padding     python实现PKCS5Padding    2008-09-21     请参考    ssl-3-padding-mode    php的加密函 ...

  10. android图片压缩的3种方法实例

    android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = ...