Connection.prepareStatement()如何理解?

2024-12-21 03:30:00
推荐回答(1个)
回答1:

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

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

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

例如下面这条SQL语句:
select userid, username from tableA where email = ? order by username;

通过编译后的内部的指令可能是,只是举个例子,我并不了解内部细节:
1,从字典中找出tableA 所有的表空间数据文件,
2,email 是不是一个索引中的列?如果是我们不需要读取所有数据块,只需要根据索引来快速得到数据(因为是精确查询)
3,从表空间中分析出 tableA 大致在哪块 block 块中。
4,在这些块对比 email 列得到记录。
5,排序么?
6,在符合条件的记录中提取字段usrid 和 username。