大纲
- [x] 一、Java基础(语言、集合框架、OOP、设计模式等)
- [x] 二、Java高级(JavaEE、框架、服务器、工具等)
- [x] 三、多线程和并发
- [x] 四、Java虚拟机
- [x] 五、数据库(Sql、MySQL、Redis等)
- [x] 六、算法与数据结构
- [x] 七、计算机网络
- [x] 八、操作系统(OS基础、Linux等)
- [x] 九、其他
五、数据库(Sql、MySQL、Redis等)
1. Statement
1.1 基本内容
- Statement是最基本的用法, 不传参, 采用字符串拼接,存在注入漏洞
- PreparedStatement传入参数化的sql语句, 同时检查合法性, 效率高可以重用, 防止sql注入
- CallableStatement接口扩展PreparedStatement,用来调用存储过程
- BatchedStatement用于批量操作数据库,BatchedStatement不是标准的Statement类
public interface CallableStatement extends PreparedStatement
public interface PreparedStatement extends Statement
1.2 Statement与PrepareStatement的区别
- 创建时的区别
Statement statement = conn.createStatement();
PreparedStatement preStatement = conn.prepareStatement(sql);
- 执行的时候
ResultSet rSet = statement.executeQuery(sql);
ResultSet pSet = preStatement.executeQuery();
由上可以看出,PreparedStatement有预编译的过程,已经绑定sql,之后无论执行多少遍,都不会再去进行编译,而 statement 不同,如果执行多遍,则相应的就要编译多少遍sql,所以从这点看,preStatement 的效率会比 Statement要高一些
- 安全性
PreparedStatement是预编译的,所以可以有效的防止SQL注入等问题
- 代码的可读性和可维护性
PreparedStatement更胜一筹
2. 游标
3. 列出 5 个应该遵循的 JDBC 最佳实践
有很多的最佳实践,你可以根据你的喜好来例举。下面是一些更通用的原则:
a)使用批量的操作来插入和更新数据
b)使用 PreparedStatement 来避免 SQL 异常,并提高性能
c)使用数据库连接池
d)通过列名来获取结果集,不要使用列的下标来获取
4. 数据库索引的实现
数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
B树:
一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:
1、根结点至少有两个子女;2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:┌m/2┐ <= k <= m ;4、所有的叶子结点都位于同一层。
由于B-Tree的特性,在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。
一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N 1)/2),检索一个key,其查找节点个数的渐进复杂度为O(logdN)。从这点可以看出,B-Tree是一个非常有效率的索引数据结构。
B 树:
B-Tree有许多变种,其中最常见的是B Tree,例如MySQL就普遍使用B Tree实现其索引结构。
B 树是B树的变形,它把所有的data都放在叶子结点中,只将关键字和子女指针保存于内结点,内结点完全是索引的功能。
与B-Tree相比,B Tree有以下不同点:
1、每个节点的指针上限为2d而不是2d 1。
2、内节点不存储data,只存储key;叶子节点存储data不存储指针。
一般在数据库系统或文件系统中使用的B Tree结构都在经典B Tree的基础上进行了优化,增加了顺序访问指针。
在B Tree的每个叶子节点增加一个指向相邻叶子节点的指针
例如图4中如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。
为什么B树(B 树)?
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。
这涉及到磁盘存取原理、局部性原理和磁盘预读。
先从B-Tree分析,根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。
为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:
每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。
B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。
综上所述,用B-Tree作为索引结构效率是非常高的。
而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。
至于B Tree为什么更适合外存索引,原因和内节点出度d有关。
由于B Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能。
【感谢您能看完,如果能够帮到您,麻烦点个赞~】
更多经验技术欢迎前来共同学习交流:一点课堂-为梦想而奋斗的在线学习平台 http://www.yidiankt.com/
![关注公众号,回复“1”免费领取-【java核心知识点】]
QQ讨论群:616683098
QQ:3184402434
想要深入学习的同学们可以加我QQ一起学习讨论~还有全套资源分享,经验探讨,等你哦!