Java面试-数据库篇(一)

1、用两种方式根据部门号从高到低,工资从低到高列出每个员工的信息。

1 employee:
2
3 eid,ename,salary,deptid;
4
5 select * from employeeorder by deptid desc,salary asc; 

2、数据库三范式是什么?

第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)数据库表中的字段都是单一属性的,不可再分。

例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。

第二范式(2NF):

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。

要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字

的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。

简而言之,第二范式就是非主属性非部分依赖于主关键字。 

第三范式的要求如下:

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

所以第三范式具有如下特征:

1,每一列只有一个值

2,每一行都能区分。

3,每一个表都不包含其他表已经包含的非主关键字信息。 

3、说出一些数据库优化方面的经验?

用PreparedStatement 一般来说比Statement性能高:一个sql 发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存

有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)

(对于hibernate来说,就应该有一个变化:empleyee->Deptment对象,现在设计时就成了employeeàdeptid)

看mysql帮助文档子查询章节的最后部分,例如,根据扫描的原理,下面的子查询语句要比第二条关联查询的效率高:

1.select e.name,e.salary where e.managerid=(select id from employee where name=‘zxx‘);

2.select e.name,e.salary,m.name,m.salary from employees e,employees m where e.managerid = m.id and m.name=‘zxx‘;

表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等

将姓名和密码单独从用户表中独立出来。这可以是非常好的一对一的案例哟!

sql语句全部大写,特别是列名和表名都大写。特别是sql命令的缓存功能,更加需要统一大小写,sql语句,发给oracle服务器,语法检查和编译成为内部指令,缓存和执行指令。

根据缓存的特点,不要拼凑条件,而是用?和PreparedStatment.

还有索引对查询性能的改进也是值得关注的。 

4、union和 union all有什么不同?

UNION 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录.

5、Class.forName的作用?为什么要用?

按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class 实例对象,

否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。

加载完这个Class 字节码后,接着就可以使用Class 字节码的newInstance 方法去创建该类的实例对象了。

有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时

才能确定,这时候就需要使用Class.forName 去动态加载该类,这个类名通常是在配置文

件中配置的,例如,spring 的ioc 中每次依赖注入的具体类就是这样配置的,jdbc 的驱动类名

通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名。

6、大数据量下的分页解决方法。

最好的办法是利用sql 语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。再sql 语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据。

 1 sql 语句分页,不同的数据库下的分页方案各不一样,下面是主流的三种数据库的分页sql:
 2
 3 sql server:
 4
 5 String sql ="select top" + pageSize + " * from students where id not in" +"(select top "+ pageSize * (pageNumber-1) + " id from students order by id)" +"order by id";
 6
 7 mysql:
 8
 9 String sql ="select * from students order by id limit " + pageSize*(pageNumber-1) + ","+pageSize;
10
11 oracle:
12
13 String sql ="select * from " +(select *,rownum rid from (select * from students order by postime desc) where rid<=" + pagesize*pagenumber +") as t" +
14
15 "where t>" +pageSize*(pageNumber-1);

7、用 JDBC查询学生成绩单,把主要代码写出来

 1 Connection cn=null;
 2 PreparedStatement pstmt=null;
 3 ResultSet rs=null;
 4 try{
 5     Class.forName(driver.ClassName);
 6     cn=DriverManager.getConnection(url,username,password);
 7     pstmt=cn.prepareStatement(“select score,* from score,student”+
 8     “where score.stuid=student.id and student.name=?”);
 9      pstmt.setString(1,studentName);
10
11     ResultSet rs=pstmt.executeQuery();
12
13 while(rs.next()){
14     system.out.println(rs.getInt(“subject”) + “ ” +rs.getFloat(“score”) );
15 }
16 }catch(Exception e){e.printStackTrace();}
17      finally
18 {
19 if(rs != null)
20       try{rs.close() }catch(exception e){}
21 if(pstmt != null)
22        try{pstmt.close()}catch(exception e){}
23 if(cn != null)
24       try{cn.close() }catch(exception e){}
25 }

8、说出数据连接池的工作机制是什么?

J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。

如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,

其他调用就可以使用这个连接。

实现方式,返回的Connection 是原始Connection 的代理,代理Connection 的close 方法,不是真正关连接,而是把它代理的Connection 对象还回到连接池中。

9、为什么要用ORM?和JDBC有何不一样?

orm 是一种思想,就是把object 转变成数据库中的记录,或者把数据库中的记录转变成objecdt,我们可以用jdbc 来实现这种思想,

其实,如果我们的项目是严格按照oop 方式编写的话,我们的jdbc 程序不管是有意还是无意,就已经在实现orm 的工作了。

现在有许多orm 工具,它们底层调用jdbc 来实现了orm 工作,我们直接使用这些工具,就省去了直接使用jdbc 的繁琐细节,

提高了开发效率,现在用的较多的orm 工具是hibernate。也听说一些其他orm 工具,如toplink,ojb 等。
时间: 2025-01-05 18:43:54

Java面试-数据库篇(一)的相关文章

Java面试-数据库篇(二)

准备Java面试期间所见到的面试题和自己的整理归纳(仅供我个人学习使用的资料) 1. 主键 超键 候选键 外键 主    键: 数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合.一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null). 超    键: 在关系中能唯一标识元组的属性集称为关系模式的超键.一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键.超键包含候选键和主键. 候选键: 是最小超键,即没有冗余元素的超键. 外    键: 在一个表中存在

java面试-数据库篇(三)

主要整理的关于JDBC问题常见的面试题 1.什么是JDBC,在什么时候会用到它? JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库. JDBC接口及相关类在java.sql包和javax.sql包里.我们可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果. JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同的数据库变得更加简单. 2.有哪些不同类型的JDBC驱动? 有四类JDBC驱动.和数据库

Java面试-框架篇(SSH-Spring)

主要转自http://blog.csdn.net/lovesomnus/article/details/46470255 Java面试-Spring面试题 1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台. Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发. Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不

Java面试-框架篇(SSH-hibernate or Strut2)

这篇博客主要记录SSH框架的相关面试知识点和题 1.Hibernate工作原理及为什么要用? 原理:  读取并解析配置文件 读取并解析映射信息,创建SessionFactory 打开Sesssion 创建事务Transation 持久化操作 提交事务 关闭Session 关闭SesstionFactory 为什么要用:  对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现.他很大程度的简化DAO

java面试④数据库部分

2.3.1 数据库的分类及常用的数据库 数据库分为:关系型数据库和非关系型数据库 关系数据库:mysql,oracle,sqlServer 非关系型:redis,mongoDB 2.3.2 简单介绍一下关系数据库三范式 范式就是规范,就是关系型数据库在设置表时,要遵循的三个规范. 要满足第二范式必须先满足第一范式,要满足第三范式必须先满足第二范式. 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体列中的某个属性不能有多个值或者不能有重复的属性,列数

java面试基础篇-List

一.ArrayList: 底层为数组实现,线程不安全,查询,修改快,增加删除慢, 数据结构:数组以0为下标依次连续进行存储 数组查询元素:根据下标查询就行 数组增加元素:如果需要给index为10的位置添加,则从index为11的位置开始右移 数组删除元素:如果需要删除index为10的位置,则从index为11的位置开始左移 线程: 如果判断线程安不安全只需要了解到是否进行加锁,如果没有加锁的话,多个线程操作同一个对象时就会出现线程不安全的情况. 源码: 1.new一个arraylist,调用

【JAVA秒会技术之秒杀面试官】秒杀Java面试官——集合篇(一)

[JAVA秒会技术之秒杀面试官]秒杀Java面试官--集合篇(一) [JAVA秒会技术之秒杀面试官]JavaEE常见面试题(三) http://blog.csdn.net/qq296398300/article/category/6876287

Java面试准备十六:数据库——MySQL性能优化

这里只是为了记录,由于自身水平实在不怎么样,难免错误百出,有错的地方还望大家多多指出,谢谢. 来自MySQL性能优化的最佳20+经验 为查询缓存优化你的查询 EXPLAIN你的SELECT查询 当只要一行数据是使用LIMIT 1 为搜索字段建索引 在Join表的时候使用相当类型的列,并将其索引 千万不要ORDER BY RAND() 避免SELECT * 永远为每张表设置一个ID 使用ENUM而不是VARCHAR 从PROCEDURE ANALYSE() 取得建议 尽可能的使用NOT NULL

Java 面试知识点解析(二)——高并发编程篇

前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是重新学习一下 Java 吧. 前序文章链接: Java 面试知识点解析(一)--基础知识篇 (一)高并发编程基础知识 这里涉及到一些基础的概念,我重新捧起了一下<实战 Java 高并发程序设计>这一本书,感觉到心潮澎湃,这或许就是笔者叙述功底扎实的