您的位置:首页 >动态频道 > 滚动动态 >

prepareStatement原理(preparestatement)

导读 大家好,今天小六子来为大家解答以下的问题,关于prepareStatement原理,preparestatement这个很多人还不知道,现在让我们一起来看看吧!1、...

大家好,今天小六子来为大家解答以下的问题,关于prepareStatement原理,preparestatement这个很多人还不知道,现在让我们一起来看看吧!

1、首先, 一个变量只是一个符号,接口类型的变量并不表示你必须用接口来 new 一样,这是面向对象的基本概念,任何一个对象实例都能赋值给它的父类型。

2、你应该先理解面向对象的概念,你这些问题表示你没有理解概念。

3、class Child implements Parent {}class Child extends parent {}Parent k = new Child(); // 上面两种情况都可以这样操作。

4、看完完整的样例再说,prepareStatement 是带参数的,一般来说数据库对于我们跑循环的情况(调用几百次但仅是参数不同的时候)会有优先的空间的,因为在SQL被数据库执行前它先要编译它把它翻译成一些内部指令,而这个过程对于 prepareStatement 来说只需要编译一次,当我们把参数 hard code 到 createStatement 中时因为SQL语句变了,所以数据库需要每次都重新编译而浪费了时间(很多复杂的SQL 几千个字符,涉及到N多表时编译和制定执行计划是很费时间的),当然像 Oracle 也够聪明,它发现你的SQL跟它缓存的已经编译过的SQL精确相同(连空格和大小写都完全相同)时也不再重新编译,其它的数据库就难说。

5、例如下面这条SQL语句:select userid, username from tableA where email = ? order by username;通过编译后的内部的指令可能是,只是举个例子,我并不了解内部细节:1,从字典中找出tableA 所有的表空间数据文件,2,email 是不是一个索引中的列?如果是我们不需要读取所有数据块,只需要根据索引来快速得到数据(因为是精确查询)3,从表空间中分析出 tableA 大致在哪块 block 块中。

6、4,在这些块对比 email 列得到记录。

7、5,排序么?6,在符合条件的记录中提取字段usrid 和 username。

本文分享完毕,希望对你有所帮助。

免责声明:本文由用户上传,如有侵权请联系删除!