当前位置: 首页 > news >正文

馆陶网站seo优化就业前景

馆陶网站,seo优化就业前景,网络服务业有哪些,263企业邮箱账号格式不管是spring jdbc ,jdbctemplate,mybatis,hibernate,具体最核心的东西还是JDBC,可能长时间不接触会慢慢忘记。 一、概念 PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、Prepa…

不管是spring jdbc ,jdbctemplate,mybatis,hibernate,具体最核心的东西还是JDBC,可能长时间不接触会慢慢忘记。

一、概念

PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时PreparedStatement还经常会在Java面试被提及,譬如:Statement与PreparedStatement的区别以及如何避免SQL注入式攻击?这篇教程中我们会讨论为什么要用PreparedStatement?使用PreparedStatement有什么样的优势?PreparedStatement又是如何避免SQL注入攻击的?

1.PreparedStatement:
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。

2.Statement
使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

二、深入理解statement 和prepareStatement

1、使用Statement而不是PreparedStatement对象
JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它们. 对于只执行一次的SQL语句选择Statement是最好的. 相反, 如果SQL语句被多次执行选用PreparedStatement是最好的.

PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行. 例如, 假设我使用Employee ID, 使用prepared的方式来执行一个针对Employee表的查询. JDBC驱动会发送一个网络请求到数据解析和优化这个查询. 而执行时会产生另一个网络请求.在JDBC驱动中,减少网络通讯是最终的目的. 如果我的程序在运行期间只需要一次请求, 那么就使用Statement. 对于Statement, 同一个查询只会产生一次网络到数据库的通讯.

对于使用PreparedStatement池的情况下, 本指导原则有点复杂. 当使用PreparedStatement池时, 如果一个查询很特殊, 并且不太会再次执行到, 那么可以使用Statement. 如果一个查询很少会被执行,但连接池中的Statement池可能被再次执行, 那么请使用PreparedStatement. 在不是Statement池的同样情况下, 请使用Statement.

2、使用PreparedStatement的Batch功能
Update大量的数据时, 先Prepare一个INSERT语句再多次的执行, 会导致很多次的网络连接. 要减少JDBC的调用次数改善性能, 你可以使用PreparedStatement的AddBatch()方法一次性发送多个查询给数据库. 例如, 让我们来比较一下下面的例子.

***为了区分 “Statement、PreparedStatement、PreparedStatement + 批处理” 这三者之间的效率,下面的示例执行过程都是在数据库表t1中插入1万条记录,并记录出所需的时间(此时间与电脑硬件有关)。实验结果如下:
1.使用Statement对象 用时31秒
2.预编译PreparedStatement 用时14秒
3.使用PreparedStatement + 批处理   用时485毫秒***
-------------------------------------------------------
1.使用Statement对象
使用范围:当执行相似SQL(结构相同,具体值不同)语句的次数比较少
优点:语法简单
缺点:采用硬编码效率低,安全性较差。
原理:硬编码,每次执行时相似SQL都会进行编译   示例执行过程:public void exec(Connection conn){try {Long beginTime = System.currentTimeMillis();conn.setAutoCommit(false);//设置手动提交Statement st = conn.createStatement();for(int i=0;i<10000;i++){String sql="insert into t1(id) values ("+i+")";st.executeUpdate(sql);}Long endTime = System.currentTimeMillis();System.out.println("Statement用时:"+(endTime-beginTime)/1000+"秒");//计算时间st.close();conn.close();} catch (SQLException e) {             e.printStackTrace();}}
执行时间:Statement用时:31秒
----------------------------------------------------------------
2.预编译PreparedStatement
使用范围:当执行相似sql语句的次数比较多(例如用户登陆,对表频繁操作..)语句一样,只是具体的值不一样,被称为动态SQL
优点:语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)
缺点: 执行非相似SQL语句时,速度较慢。
原理:相似SQL只编译一次,减少编译次数
事例执行过程:public void exec2(Connection conn){try {Long beginTime = System.currentTimeMillis();conn.setAutoCommit(false);//手动提交PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");for(int i=0;i<10000;i++){pst.setInt(1, i);pst.execute();   }conn.commit();Long endTime = System.currentTimeMillis();System.out.println("Pst用时:"+(endTime-beginTime)+"秒");//计算时间pst.close();conn.close();} catch (SQLException e) {               e.printStackTrace();}}
执行时间:Pst用时:14秒
------------------------------------------------------------------
3.使用PreparedStatement + 批处理
使用范围:一次需要更新数据库表多条记录
优点:减少和SQL引擎交互的次数,再次提高效率,相似语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)
缺点:
原理:批处理: 减少和SQL引擎交互的次数,一次传递给SQL引擎多条SQL。
名词解释:
PL/SQL引擎:在oracle中执行pl/sql代码的引擎,在执行中发现标准的sql会交给sql引擎进行处理。
SQL引擎:执行标准sql的引擎。
事例执行过程:
public void exec3(Connection conn){try {conn.setAutoCommit(false);Long beginTime = System.currentTimeMillis();PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");for(int i=1;i<=10000;i++){   pst.setInt(1, i);pst.addBatch();//加入批处理,进行打包if(i%1000==0){//可以设置不同的大小;如50,100,500,1000等等pst.executeBatch();conn.commit();pst.clearBatch();}//end of if}//end of forpst.executeBatch();Long endTime = System.currentTimeMillis();System.out.println("pst+batch用时:"+(endTime-beginTime)+"毫秒");pst.close();conn.close();} catch (SQLException e) {e.printStackTrace();}
}
执行时间:pst+batch用时:485毫秒

代码转自:http://blog.itpub.net/90618/viewspace-607949/

三、区别

1.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
stmt.executeUpdate(“insert into tb_name (col1,col2,col2,col4) values (‘”+var1+”’,’”+var2+”’,”+var3+”,’”+var4+”’)”);//stmt是Statement对象实例

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(); //prestmt是 PreparedStatement 对象实例

不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.

2.PreparedStatement尽最大可能提高性能.
语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values (‘11’,’22’);
insert into tb_name (col1,col2) values (‘11’,’23’);
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.

当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.

2.最重要的一点是极大地提高了安全性.

即使到目前为止,仍有一些人连基本的恶义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. PreparedStatement可以写参数化查询,比Statement能获得更好的性能。
  2. 对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,这种预处理语句查询比普通的查询运行速度更快。
  3. PreparedStatement可以阻止常见的SQL注入式攻击。
  4. PreparedStatement可以写动态查询语句
  5. PreparedStatement与java.sql.Connection对象是关联的,一旦你关闭了connection,PreparedStatement也没法使用了。
  6. “?” 叫做占位符。
  7. PreparedStatement查询默认返回FORWARD_ONLY的ResultSet,你只能往一个方向移动结果集的游标。当然你还可以设定为其他类型的值如:”CONCUR_READ_ONLY”。
  8. 不支持预编译SQL查询的JDBC驱动,在调用connection.prepareStatement(sql)的时候,它不会把SQL查询语句发送给数据库做预处理,而是等到执行查询动作的时候(调用executeQuery()方法时)才把查询语句发送个数据库,这种情况和使用Statement是一样的。
  9. 占位符的索引位置从1开始而不是0,如果填入0会导致java.sql.SQLException invalid column index异常。所以如果PreparedStatement有两个占位符,那么第一个参数的索引时1,第二个参数的索引是2.

以上就是为什么要使用PreparedStatement的全部理由,不过你仍然可以使用Statement对象用来做做测试。但是在生产环境下你一定要考虑使用 PreparedStatement 。
————————————————
版权声明:本文为CSDN博主「离水的鱼儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xuebing1995/article/details/72235380

类结构关系

在这里插入图片描述
在这里插入图片描述

在ConnectionImpl里:

获取PreparedStatement 对应2 public PreparedStatement prepareStatement(String sql) throws SQLException {try {return this.prepareStatement(sql, 1003, 1007);} catch (CJException var3) {throw SQLExceptionsMapping.translateException(var3, this.getExceptionInterceptor());}}获取Statement  对应1public Statement createStatement() throws SQLException {try {return this.createStatement(1003, 1007);} catch (CJException var2) {throw SQLExceptionsMapping.translateException(var2, this.getExceptionInterceptor());}}

转自:
JDBC 中preparedStatement和Statement区别
https://blog.csdn.net/xuebing1995/article/details/72235380

http://www.ds6.com.cn/news/99705.html

相关文章:

  • 在猪八戒找人做网站靠谱吗海外网络推广
  • 珠海 网站 设计地推拉新接单平台
  • 苏州朗冠网站建设公司网络营销策略实施的步骤
  • 手机网站设计制作服务媒体发稿网
  • 破解织梦做的网站友情链接交易平台
  • 公司网站建设请示报告美食软文300字
  • dede网站搬家国际域名注册网站
  • c 做网站教程网络营销推广seo
  • 建筑给排水代做网站哪里做网络推广
  • 简述网站建设的主要内容必应bing国内版
  • 郑州市网站制作公司漳州seo网站快速排名
  • 炫酷网站 css工具营销型网站外包
  • .net电商网站开发设计域名比价网
  • 网站加载效果怎么做的sem网站推广怎么做
  • 外国人做中国数学视频网站windows11优化大师
  • 兰溪网站建设学徒郑州抖音seo
  • 申请了域名怎么做网站大连百度关键词优化
  • wordpress适合企业网站模板郑州官网关键词优化公司
  • 整形美容网站源码如何屏蔽百度广告推广
  • 点评网站开发索引擎优化 seo
  • 建设免费网站制作seo教学
  • 做网站的公司有哪些免费技能培训网
  • 第一次做网站做什么比较好微信软文范例大全100
  • 足彩推荐网站开发seo流量软件
  • 郑州做网站哪个公司好公司品牌营销策划
  • 长春网站制作最专业宁波超值关键词优化
  • 做seo用什么网站系统手机app推广平台
  • 建设网站怎么查明细网页搜索快捷键
  • 电商网站建设收费大连网站排名推广
  • 专业零基础网站建设教学在哪里南昌seo优化公司