Java面试中的数据库相关问题主要涵盖了存储过程与函数的区别、事务的概念及其ACID属性、游标的用途以及触发器的分类和作用。以下是对这些知识点的详细解释:
1. 存储过程与函数的区别:
- 存储过程是用户自定义的一系列SQL语句的集合,它们针对特定的数据库表或其他对象执行任务。存储过程可以被调用,并且可能包含复杂的逻辑,例如条件语句和循环。在执行时,它们可以修改数据库状态,并且不总是返回值。
- 函数则是数据库系统预定义的方法,它们接收输入参数并返回一个特定类型的值。函数通常不修改数据库状态,而是提供计算或转换等服务。在SQL中,函数可以嵌入到查询中,作为查询的一部分来使用。
2. 事务(ACID属性):
- 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,不允许部分操作完成。如果在执行过程中发生错误,整个事务会被回滚,确保数据库的一致性。
- 一致性(Consistency):事务完成后,数据库的所有数据都处于一致状态,符合业务规则和约束。
- 隔离性(Isolation):并发执行的事务之间互相隔离,每个事务看到的数据要么是其他事务开始前的状态,要么是其他事务完成后的新状态,不会看到事务执行过程中的中间状态。
- 持久性(Durability):一旦事务提交,其对数据库的修改就会永久保存,即使系统出现故障也能恢复。
3. 游标的作用:
- 游标允许应用程序按需逐行处理查询结果。在处理大量数据时,游标提供了在结果集中移动的能力,使得程序可以动态地读取、修改或更新数据。通过检查全局变量`@@FETCH_STATUS`,可以判断游标是否到达了结果集的末尾,如果该变量不等于0,通常表示出现错误或者已经到达了最后一行。
4. 触发器的类型:
- 事前触发器(Before Triggers):在触发事件实际发生之前执行,可以访问旧的字段值以及新的字段值,用于验证数据或准备额外的操作。
- 事后触发器(After Triggers):在触发事件发生之后执行,只能访问新的字段值,主要用于实现基于历史数据的更新或审计功能。
- 语句级触发器:在一个SQL语句执行完毕后触发,无论该语句影响了多少行,只触发一次。
- 行级触发器:对每一行受SQL语句影响的数据分别触发,因此可能触发多次。
此外,面试题中还涉及了Java语言中字符串的相关知识点:
- `String`对象的创建:当使用`new String("abc")`创建字符串时,会在堆中创建一个新的对象。如果字符串字面量已经存在于字符串池中(如`"abc"`),`String s1 = "abc";`会直接引用池中的对象,而不会创建新的对象。`intern()`方法用于将字符串对象加入到字符串池中,如果池中已有相同的字符串,就返回池中的引用。
- 字符串比较:`==`运算符比较的是两个对象的引用,而不是内容。因此,`s == s1`为`false`,因为它们引用不同的对象,即使内容相同。`equals()`方法用于比较字符串内容,`s.equals(s2)`为`true`时,`s.intern() == s2.intern()`也为`true`。
- 字符串连接:当使用`+`连接字符串时,如果两边都是字面量,编译器会在编译时合并为一个字符串字面量,所以`hello == "hel"+"lo"`为`true`。但如果有非字面量参与,如`"hel"+lo`,则会在运行时创建新的`String`对象,导致`hello == "hel"+lo`为`false`。