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中我经常使用的是statment的写法,那么还不知道什么是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的更多相关文章
- 用java PreparedStatement就不用担心sql注入了吗?
先感慨下,好久没写博客了,一是工作太忙,二是身体不太给力,好在终于查清病因了,趁着今天闲下来,迫不及待与读者交流,最后忠告一句:身体是活着的本钱! 言归正传,对java有了解的同学基本上都体验过JDB ...
- 【JDBC】java PreparedStatement操作oracle数据库
************************************************************************ ****原文:blog.csdn.net/clark_ ...
- java PreparedStatement和statement的区别
1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.2.作为 St ...
- Java SQL注入学习笔记
1 简介 文章主要内容包括: Java 持久层技术/框架简单介绍 不同场景/框架下易导致 SQL 注入的写法 如何避免和修复 SQL 注入 2 JDBC 介绍 JDBC: 全称 Java Databa ...
- 浅析Statement和PreparedStatement的区别
当我们使用java程序来操作sql server时会使用到Statement和PreparedStatement,俩者都可以用于把sql语句从java程序中发送到指定数据库,并执行sql语句.那么如何 ...
- SQL注入的原理与预防
1. 什么是SQL注入? SQL注入是常见的网络攻击方式之一,通过SQL语句实现无账号登录,非法获取甚至篡改数据库中的数据. 2. SQL注入的思路 (1)找到SQL注入位置: (2)判断服务器类型和 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java中PreparedStatement与Statement的总结
概要: PreparedStatement 接口继承自 Statement 接口,PreparedStatement 比普通Statement 对象使用起来更加灵活,更有效率. 一.PreparedS ...
- Type mismatch: cannot convert from java.sql.PreparedStatement to com.mysql.jdbc.PreparedStatement
Connection.prepareStatement()函数出错,提示: Type mismatch: cannot convert from java.sql.PreparedStatement ...
随机推荐
- Eclipse用法和技巧十三:自动生成的TODO注释1
使用eclipse的快捷键自动生成的代码,经常有这样的注释. 一眼看上去这个注释和一般的注释并无什么差别,不过TODO这个字符串的颜色不一样,应该有些内容.TODO是eclipse中提供的一种任务标签 ...
- RHEL4 i386下安装rdesktop【原创】
http://rpmfind.net/ 1.根据系统下载rdesktop (1)查看Linux版本:# lsb_release -aLSB Version: :core-3.0-ia32:core-3 ...
- canvas 多种形状绘图方法
function canvasUploadImg(image,imageName,imgType,callbackfn){ var img_width = image.width; var img_h ...
- Swift - 异步获取网络数据封装类
使用NSURLConnection.sendAsynchronousRequest()可以采用异步获取的方式取得数据.下面通过对数据获取类进行封装,演示如何进行数据请求与接收. 1,HttpContr ...
- Xamarin相关学习预估
以前没有开发过app也没有了解过,当然只是用过,现在迫于形势无奈活到老学到老. 初步想了下app相关开发所涉及的知识点 一 app相关资源监视 1.1 网络监视器:https://github.co ...
- Xamainr 地图之webview初探
一 说几点 当下移动开发主要实现方式有传统的Native以及新的混合开发想Rect.js,nodejs这些前段框架,其本质要么是原生控件来实现UI,要么html来实现UI.Xamarin其实也只是取巧 ...
- xvfb 初步探究
有时候我们不关注程序是否有界面(比如自动化测试),只要程序在运行就可以了 很感谢 xvfb 这个工具给我们提供了相关的功能 比如在没有 X server 的机器上运行 gedit, 可以用下面的命令 ...
- eclipse weblogic debug 简易配置版
1. eclipse->help->marketplace->search->weblogic 1.1安装对应eclipse版本的weblogic plugin 查看eclip ...
- CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模
很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...
- Oracle 12C 简介
2013年6月26日,Oracle Database 12c版本正式发布,首先发布的版本号是12.1.0.1.0,率先提供下载的平台有Linux和Solaris: Oracle官方下载地址: http ...