JavaShuo
栏目
标签
JDBC为何要使用PreparedStatement而不是Statement
时间 2019-11-09
标签
jdbc
为何
使用
preparedstatement
不是
statement
栏目
Java
繁體版
原文
原文链接
prepareStatement与Statement的区别
1.区别:
stmt=conn.CreateStatement();
resultSet rs=stmt.executeQuery(sql);
上面是statement的用法
============================
下面是PrepareStatement的用法
ptmt=conn.PreparedStatement(sql);
resultSet rs=ptmt.executeQuery();
================================
Statement 是PreparedStatement的父类
还有就是sql放置的位置不一样 。
在开发中通常用PrepareStatement
jdbc(java database connectivity,java数据库链接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力。在使用statement获取jdbc访问时所具备的一个共通的问题是输入适当格式的日期和时间戳:2002-02-05 20:56 或者 02/05/02 8:56 pm。 经过使用java.sql.preparedstatement,这个问题能够自动解决。一个preparedstatement是从java.sql.connection对象和所提供的sql字符串获得的,sql字符串中包含问号(?),这些问号标明变量的位置,而后提供变量的值,最后执行语句,例如: stringsql = "select * from people p where p.id = ? and p.name = ?";preparedstatement ps = connection.preparestatement(sql);ps.setint(1,id);ps.setstring(2,name);resultset rs = ps.executequery(); 使用preparedstatement的另外一个优势是字符串不是动态建立的。下面是一个动态建立字符串的例子: stringsql = "select * from people p where p.i = "+id; 这容许jvm(javavirtual machine,java虚拟机)和驱动/数据库缓存语句和字符串并提升性能。preparedstatement也提供数据库无关性。当显示声明的sql越少,那么潜在的sql语句的数据库依赖性就越小。因为preparedstatement具有不少优势,开发者可能一般都使用它,只有在彻底是由于性能缘由或者是在一行sql语句中没有变量的时候才使用一般的statement。一个完整的preparedstatement的例子:package jstarproject;import java.sql.*;public class mypreparedstatement {private final string db_driver="com.microsoft.jdbc.sqlserver.sqlserverdriver";private final string url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs";public mypreparedstatement() {}public void query() throws sqlexception{connection conn = this.getconnection();string strsql = "select emp_id from employee where emp_id = ?";preparedstatement pstmt = conn.preparestatement(strsql);pstmt.setstring(1,"pma42628m");resultset rs = pstmt.executequery();while(rs.next()){string fname = rs.getstring("emp_id");system.out.println("the fname is " + fname);}rs.close();pstmt.close();conn.close();}private connection getconnection() throws sqlexception{// class.connection conn = null;try {class.forname(db_driver);conn = drivermanager.getconnection(url,"sa","sa");}catch (classnotfoundexception ex) {}return conn;}//mainpublic static void main(string[] args) throws sqlexception {mypreparedstatement jdbctest1 = new mypreparedstatement();jdbctest1.query();}}为何要始终使用PreparedStatement代替Statement?为何要始终使用PreparedStatement代替Statement?在JDBC应用中,若是你已是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任什么时候候都不要使用Statement.基于如下的缘由:一.代码的可读性和可维护性.虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码不管从可读性仍是可维护性上来讲.都比直接用Statement的代码高不少档次:stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");perstmt.setString(1,var1);perstmt.setString(2,var2);perstmt.setString(3,var3);perstmt.setString(4,var4);perstmt.executeUpdate();不用我多说,对于第一种方法.别说其余人去读你的代码,就是你本身过一段时间再去读,都会以为伤心.二.PreparedStatement尽最大可能提升性能.每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.由于预编译语句有可能被重复调用.因此语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不须要编译,只要将参数直接传入编译过的语句执行代码中(至关于一个涵数)就会获得执行.这并非说只有一个Connection中屡次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任什么时候候就能够不须要再次编译而能够直接执行.而statement的语句中,即便是相同一操做,而因为每次操做的数据不一样因此使整个语句相匹配的机会极小,几乎不太可能匹配.好比:insert into tb_name (col1,col2) values ('11','22');insert into tb_name (col1,col2) values ('11','23');即便是相同操做但由于数据内容不同,因此整个个语句自己不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.固然并非因此预编译语句都必定会被缓存,数据库自己会用一种策略,好比使用频度等因素来决定何时再也不缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.三.最重要的一点是极大地提升了安全性.即便到目前为止,仍有一些人连基本的恶义SQL语法都不知道.String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";若是咱们把[' or '1' = '1]做为varpasswd传入进来.用户名随意,看看会成为何?select * from tb_name = '随意' and passwd = '' or '1' = '1';由于'1'='1'确定成立,因此能够任何经过验证.更有甚者:把[';drop table tb_name;]做为varpasswd传入进来,则:select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有不少数据库就可使这些语句获得执行.而若是你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据作任何过虑.而若是使用普通的statement,有可能要对drop,;等作费尽心机的判断和过虑.上面的几个缘由,还不足让你在任什么时候候都使用PreparedStatement吗
相关文章
1.
【jdbc】为何使用PreparedStatement而不是Statement
2.
JDBC为何要使用PreparedStatement而不是Statement
3.
JDBC为什么要使用PreparedStatement而不是Statement
4.
JDBC之使用Statement,PreparedStatement,ResultSet
5.
JDBC Statement PreparedStatement CallableStatement
6.
JDBC 的 PreparedStatement 与 Statement
7.
jdbc中PreparedStatement和Statement
8.
为何要使用ConcurrentHashMap而不是HashMap
9.
为何要使用 SLF4J 而不是 Log4J
10.
为何要使用SLF4J而不是Log4J
更多相关文章...
•
XSD 如何使用?
-
XML Schema 教程
•
为什么使用 XML Schemas?
-
XML Schema 教程
•
Composer 安装与使用
•
使用Rxjava计算圆周率
相关标签/搜索
statement
preparedstatement
而是
为何要用真机
要是
为何
何为
使用不当
为何须要FabricPath
为要
Java
Spring教程
Docker教程
Docker命令大全
应用
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
说说Python中的垃圾回收机制?
2.
蚂蚁金服面试分享,阿里的offer真的不难,3位朋友全部offer
3.
Spring Boot (三十一)——自定义欢迎页及favicon
4.
Spring Boot核心架构
5.
IDEA创建maven web工程
6.
在IDEA中利用maven创建java项目和web项目
7.
myeclipse新导入项目基本配置
8.
zkdash的安装和配置
9.
什么情况下会导致Python内存溢出?要如何处理?
10.
CentoOS7下vim输入中文
本站公众号
欢迎关注本站公众号,获取更多信息
相关文章
1.
【jdbc】为何使用PreparedStatement而不是Statement
2.
JDBC为何要使用PreparedStatement而不是Statement
3.
JDBC为什么要使用PreparedStatement而不是Statement
4.
JDBC之使用Statement,PreparedStatement,ResultSet
5.
JDBC Statement PreparedStatement CallableStatement
6.
JDBC 的 PreparedStatement 与 Statement
7.
jdbc中PreparedStatement和Statement
8.
为何要使用ConcurrentHashMap而不是HashMap
9.
为何要使用 SLF4J 而不是 Log4J
10.
为何要使用SLF4J而不是Log4J
>>更多相关文章<<