JAVA技术方向面试题-数据库(下)

本文探讨了PreparedStatement与Statement接口的区别,前者提供更好的性能、可读性和安全性。连接池在数据库编程中的作用在于提高性能,避免频繁创建和释放连接。事务的ACID属性包括原子性、一致性、独立性和持久性,确保数据操作的可靠。同时,给出了三个SQL查询示例,涉及学生、课程和成绩的统计与比较。
摘要由CSDN通过智能技术生成


五、Statement接口与PreparedStatement接口的区别?

关系: PreparedStatement接口继承自Statement接口。

区别:

  1. PreparedStatement提高了代码的可读性和可维护性。

PreparedStatement使用占位符,容易理解,可读性强,而Statement使用字符串拼接,麻烦而且过长时可读性差。

  1. PreparedStatement性能更高。

创建PreparedStatement对象时使用SQL语句做参数,会解析并编译SQL语句。也可以使用带占位符“?”的SQL语句做参数,在通过setXxx()方法给占位符赋值后执行SQL语句时无需再解析和编译SQL语句,直接执行的。当进行批处理(多次执行相同操作)时,效率高。

而创建Statement对象不使用SQL参数,不会解析并编译SQL语句,每次调用执行SQL语句时都要进行SQL语句的解析和编译操作,效率低。

  1. PreparedStatement更安全。

PreparedStatement使用预编译处理,传入的任何参数都不会和已经预编译的SQL语句进行拼接,避免了SQL注入攻击问题。

六、在进行数据库编程时,连接池有什么作用?

由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的)。

为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略(浪费了空间存储连接,但节省了创建和释放连接的时间)。

七、事务的ACID是指什么?

  1. Atomicity(原子性)
    原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件容是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
  2. Consistency(一致性)
    一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务开始前是一个一致状态,事务结束后是另一个一致状态,事务将数据库从一个一致状态转移到另一个一致状态。
  3. Isolation(独立性)
    从字面上来说,独立性是其中最难理解的一点,但如果结合Oracle中的undo,也就不难理解了。所谓的独立性就是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务还未提交,它所访问的数据就不受未提交事务的影响。换句话说,一个事务的影响在该事务提交前对其它事务是不可见的。
    注意:这里的Isolation跟隔离级别(Isolation Level)是无关的。
  4. 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#))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值