以下内容转载自网上各种面试题,整理而成。有需要的可以看一下
1.0 数据库三范式是什么?
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
第一范式(1NF):确保每一列的原子性。如果每一列都是不可再分的最小数据单元,则满足第一范式。数据库至少会满足第一范式
但是具体地址到底要不要拆分 还要看具体情形,比如看看将来会不会按国家或者省市进行分类汇总或者排序,如果需要,最好就拆,如果不需要而仅仅起字符串的作用,可以不拆,操作起来更方便。
第二范式:非键字段必须依赖于键字段
如果一个关系满足1NF,并且除了主键以外的其它列,都依赖与该主键,则满足二范式(2NF),第二范式要求每个表只描述一件事。
第三范式:在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性
(在2NF基础上消除传递依赖)
2.0 union和union all有什么不同?
Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All,对两个结果集进行并集操作,包括重复行,不进行排序;
Intersect,对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
3.0 查出比经理薪水还高的员工信息:?
Drop table if not exists employees;
create table employees(id int primary key auto_increment,name varchar(50)
,salary int,managerid int references employees(id));
insert into employees values (null,'zxx',10000,null), (null,'lhm',15000,1
),(null,'flx',9000,1),(null,'tg',10000,2),(null,'wzg',10000,3);
Wzg大于flx,lhm大于zxx
select e.* from employees e,employees m where e.managerid=m.id and e.sala
ry>m.salary;
4.0 注册Jdbc驱动程序的三种方式?
1. Class.forName(“com.mysql.jdbc.Driver”);//加载数据库驱动
此方式由于参数为字符因此很容易修改,移植性强。最常见的注册方式,也是推荐的方式。
Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议
Connection conn=DriverManager.getConnection(url,"username","password");
2. System.setProperty(“jdbc.drivers”,“com.mysql.jdbc.Driver”);//通过系统的属性设置
System.setProperty("jdbc.driver","com.mysql.jdbc.Driver");//系统属性指定数据库驱动
String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议
Connection conn=DriverManager.getConnection(url,"username","password");
可以同时导入多个jdbc驱动,中间用冒号“:”分开
比如System.setProperty("jdbc.drivers","XXXDriver:XXXDriver:XXXDriver");
3. new com.mysql.jdbc.Driver() ;//创建driver对象,加载数据库驱动
起来比较直观的一种方式,注册相应的db的jdbc驱动,3在编译时需要导入对应的lib
new com.mysql.jdbc.Driver();//创建driver对象,加载数据库驱动
String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议
Connection conn=DriverManager.getConnection(url,"username","password");
总结】第二种与第三种注册的方法看起来更加的直接与好理解。第一种方法是通过Class把类先装载到java的虚拟机中,并没有创建Driver类的实例。
第一种与第二种方法可以脱离jdbc的驱动进行编译,第三种方法不可以的,它一定要有jdbc的驱动才可以通过编译,这样对我们的程序就有很多的不好之处,为程序换数据库会带来麻烦。
所以推荐使用第一种方法来注册驱动。
总结:推荐1,和2两种方式。
原因:3在编译时需要导入对应的lib。1,2不需要。
5.0 用JDBC如何调用存储过程?
存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后以后再调用任意次都不需要重新编译了。说白了就是一堆SQL语句的合并,中间加了点逻辑控制,俗称为数据库中的函数。在一些金融等大型企业中,基本都是由内部人员编写好存储过程,然后由外部程序员调用存储过程,因为内部数据逻辑处理方式涉及商业机密等等。
答案略,后续更新
6.0 JDBC中的PreparedStatement相比Statement的好处
1、PreparedStatement尽最大可能提高性能。PreparedStatement是预编译语句;预编译语句有可能被重复调用,语句在被编译器编译后的执行代码被缓存下来,下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
2、极大地提高了安全性,可以有效的避免SQL注入
3、PreparedStatement支持批量处理、而Statement不支持
7.0 Class.forName的作用?为什么要用?
调用该访问返回一个以字符串指定类名的类的对象。
8.0 大数据量下的分页解决方法
最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。再sql语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据
sql语句分页,不同的数据库下的分页方案各不一样,下面是主流的三种数据库的分页sql
sql server:
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";
mysql:
String sql =
"select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;
oracle:
String sql =
"select * from " +
(select *,rownum rid from (select * from students order by postime desc) where rid<=" + pagesize*pagenumber + ") as t" +
"where t>" + pageSize*(pageNumber-1);
9.0 说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
10 为什么要用 ORM? 和 JDBC 有何不一样?
orm是一种思想,就是把object转变成数据库中的记录,或者把数据库中的记录转变成objecdt,我们可以用jdbc来实现这种思想,其实,如果我们的项目是严格按照oop方式编写的话,我们的jdbc程序不管是有意还是无意,就已经在实现orm的工作了。
现在有许多orm工具,它们底层调用jdbc来实现了orm工作,我们直接使用这些工具,就省去了直接使用jdbc的繁琐细节,提高了开发效率,现在用的较多的orm工具是hibernate。也听说一些其他orm工具,如toplink,ojb等