五、Statement接口与PreparedStatement接口的区别?
关系: PreparedStatement接口继承自Statement接口。
区别:
- PreparedStatement提高了代码的可读性和可维护性。
PreparedStatement使用占位符,容易理解,可读性强,而Statement使用字符串拼接,麻烦而且过长时可读性差。
- PreparedStatement性能更高。
创建PreparedStatement对象时使用SQL语句做参数,会解析并编译SQL语句。也可以使用带占位符“?”的SQL语句做参数,在通过setXxx()方法给占位符赋值后执行SQL语句时无需再解析和编译SQL语句,直接执行的。当进行批处理(多次执行相同操作)时,效率高。
而创建Statement对象不使用SQL参数,不会解析并编译SQL语句,每次调用执行SQL语句时都要进行SQL语句的解析和编译操作,效率低。
- PreparedStatement更安全。
PreparedStatement使用预编译处理,传入的任何参数都不会和已经预编译的SQL语句进行拼接,避免了SQL注入攻击问题。
六、在进行数据库编程时,连接池有什么作用?
由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的)。
为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略(浪费了空间存储连接,但节省了创建和释放连接的时间)。
七、事务的ACID是指什么?
- Atomicity(原子性)
原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件容是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。 - Consistency(一致性)
一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务开始前是一个一致状态,事务结束后是另一个一致状态,事务将数据库从一个一致状态转移到另一个一致状态。 - Isolation(独立性)
从字面上来说,独立性是其中最难理解的一点,但如果结合Oracle中的undo,也就不难理解了。所谓的独立性就是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务还未提交,它所访问的数据就不受未提交事务的影响。换句话说,一个事务的影响在该事务提交前对其它事务是不可见的。
注意:这里的Isolation跟隔离级别(Isolation Level)是无关的。 - Durability(持久性)
持久性也不难理解,是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
八、编写以下三条SQL语句
有以下这个表:
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
(1)查询所有同学的学号、姓名、选课数、总成绩;
select s.S#, Sname, count(C#) as 选课数, sum(score) as 总成绩
from Student s, SC
where s.S#=SC.S#
group by s.S#
(2)查询不同老师所教不同课程平均分从高到低显示
select Tname, avg(score) as 平均分
from Course C, SC, Teacher T
where C.C#=SC.C# and T.T#=C.T#
group by Tname
order by desc
(3)查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名。
select S.S#, Sname
from Student S, SC
where((select score from SC where C#=002 and S.S#=SC.S#)<
(select score from SC where C#=001 and S.S#=SC.S#))