PreparedStatement 预编译
来源:互联网 发布:mac jenkins 安装 编辑:程序博客网 时间:2024/06/11 18:30
什么是预编译语句?
预编译语句PreparedStatement是java.sql中的一个接口,它是Statement的子接口。通过Statement对象执行sql语句时,需要将sql语句发送给DBMS,由DBMS首先进行编译再执行(在创建通道的时候并不进行sql的编译工作,事实上也无法进行编译)。而通过PreparedStatement不同,在创建PreparedStatement对象时就指定了sql语句,该语句立即发送给DBMS进行编译,当该语句被执行时,DBMS直接运行编译后的sql语句,而不需要像其他sql语句那样首先将被编译。
例如我们在向数据库插入数据:
一种是使用Statement对象
java.sql.Statement stmt=conn.createStatement();
stmt.executeUpdate("insert into student(name,id,number,count) "
+ "values('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
另一种是使用PreparedStatement对象
String sql ="insertinto student values(null,?,?,?)";
//创建PreparedStatement对象时编译sql语句
java.sql.PreparedStatement pstmt=conn.preparedStatement(sql); pstmt.setString(1,var1);
pstmt.setString(2,var2);
pstmt.setString(3,var3);
pstmt.setString(4,var4);
//当该语句被执行时,DBMS直接运行编译后的sql语句
使用占位符?代替
将参数与SQL语句分离出来,这样就可以方便对程序的更改和延续,同样,也可以减少不必要的错误
pstmt.executeUpdate();
什么时候使用预编译语句?
当语句格式固定的时我们倾向于使用PreparedStatement,只有当语句格式无法预见时,才考虑使用Statement。
一般在考虑反复使用一个sql语句时才使用预编译,预编译语句常常放在一个循环中使用(在这种情况下预编译的优势就很明显了),通过反复设置参数从而达到多次使用该语句;还有一个原因就是防止sql注入漏洞。
为什么使用预编译语句?
1、提高效率
当需要数据库进行数据插入、更新或者删除的时候,程序给发送整个sql语句给数据库处理和执行。数据库处理一条sql语句,需要完成对sql语句的解析、检查语法以及生成代码;一般来说,处理时间要比执行sql的时间长。预编译语句在创建的时候就已经将sql语句发送给了DBMS,完成了解析、检查语法以及生成代码的过程。因此,当一个sql语句需要执行多次时,使用预编译语句可以减少处理时间,提高执行效率。
2、提高安全性
恶意的sql语句
Stringsql = “select * from user_tb where username= ‘”+username+”’and password = ‘”+password+”’;
如果我们把[‘or’1’=’1]作为password传入,用户名随意,那么就可以随意登陆了。更有甚者,把[‘;drop table user_tb;]作为password传入,这就严重危害了数据库安全了。
- PreparedStatement like 预编译
- PreparedStatement 预编译
- PreparedStatement 预编译原理
- PreparedStatement 预编译原理
- mysql preparedStatement预编译
- PreparedStatement 预编译
- PreparedStatement 预编译
- PreparedStatement 预编译原理
- 预编译语句(PreparedStatement)
- 预编译语句对象PreparedStatement
- PreparedStatement 预编译原理 可防止SQL注入
- 使用PreparedStatement预编译语句对象
- 预编译PreparedStatement以及jdbc缺点
- JDBC:PreparedStatement预编译执行SQL语句
- PreparedStatement 预编译原理 (From@_@http://choelea.javaeye.com)
- JDBC 开发步骤及PreparedStatement预编译处理对象
- 预编译的 SQL 语句的对象-PreparedStatement
- [疯狂Java]JDBC:PreparedStatement预编译执行SQL语句
- qt学习第三课:窗口布局
- 了解Objective-C中Selector基本概念和操作
- Java NIO - 简介
- 机试算法讲解:第36题 Floyd
- 学习AngularJS的一些资料及网站
- PreparedStatement 预编译
- 敏捷开发Scrum
- 机试算法讲解: 第37题 Dijkstra
- ubuntu 如何创建新用户
- iOS alloc和new的区别与联系
- windows下如何将本地项目push到github仓库
- UVa 10340 All in All
- zedboard 8路拨码开关
- HDU 2128Tempter of the Bone II(bfs + 保存每一步的图)