时间:2021-07-01 10:21:17 帮助过:14人阅读
- <span style="font-size: 14px"><span style="color: #008080">1</span> <span style="color: #000000">employee:
- </span><span style="color: #008080">2</span>
- <span style="color: #008080">3</span> <span style="color: #000000">eid,ename,salary,deptid;
- </span><span style="color: #008080">4</span>
- <span style="color: #008080">5</span> <span style="color: #0000ff">select</span> <span style="color: #808080">*</span> <span style="color: #0000ff">from</span> employeeorder <span style="color: #0000ff">by</span> deptid <span style="color: #0000ff">desc</span>,salary <span style="color: #0000ff">asc</span>;</span>
2、数据库三范式是什么?
- <span style="color: #000000"><span style="font-size: 14px">第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)数据库表中的字段都是单一属性的,不可再分。</span><br> <br><span style="font-size: 14px">例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。
- 第二范式(2NF):
- 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
- 要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
- 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字</span><br><br><span style="font-size: 14px">的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。<br><br>简而言之,第二范式就是非主属性非部分依赖于主关键字。
- 第三范式的要求如下:
- 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
- 所以第三范式具有如下特征:
- 1,每一列只有一个值
- 2,每一行都能区分。
- 3,每一个表都不包含其他表已经包含的非主关键字信息。</span> </span>
3、说出一些数据库优化方面的经验?
- <span style="color: #000000">用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服务器,语法检查和编译成为内部指令,缓存和执行指令。<br><br>根据缓存的特点,不要拼凑条件,而是用?和PreparedStatment.
- 还有索引对查询性能的改进也是值得关注的。 </span>
4、union和 union all有什么不同?
- <span style="font-size: 14px">UNION 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录.</span>
5、Class.forName的作用?为什么要用?
- <span style="color: #000000; font-size: 14px">按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class 实例对象,<br><br>否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。<br><br>加载完这个Class 字节码后,接着就可以使用Class 字节码的newInstance 方法去创建该类的实例对象了。
- 有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时
- 才能确定,这时候就需要使用Class.forName 去动态加载该类,这个类名通常是在配置文
- 件中配置的,例如,spring 的ioc 中每次依赖注入的具体类就是这样配置的,jdbc 的驱动类名<br><br>通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名。</span>
6、大数据量下的分页解决方法。
最好的办法是利用sql 语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。再sql 语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据。
- <span style="font-size: 14px"><span style="color: #008080"> 1</span> <span style="color: #000000">sql 语句分页,不同的数据库下的分页方案各不一样,下面是主流的三种数据库的分页sql:
- </span><span style="color: #008080"> 2</span>
- <span style="color: #008080"> 3</span> <span style="color: #000000">sql server:
- </span><span style="color: #008080"> 4</span>
- <span style="color: #008080"> 5</span> String sql <span style="color: #808080">=</span>"<span style="color: #0000ff">select</span> <span style="color: #0000ff">top</span>" <span style="color: #808080">+</span> pageSize <span style="color: #808080">+</span> " <span style="color: #808080">*</span> <span style="color: #0000ff">from</span> students <span style="color: #0000ff">where</span> id <span style="color: #808080">not</span> <span style="color: #808080">in</span>" <span style="color: #808080">+</span>"(<span style="color: #0000ff">select</span> <span style="color: #0000ff">top</span> "<span style="color: #808080">+</span> pageSize <span style="color: #808080">*</span> (pageNumber<span style="color: #808080">-</span><span style="color: #800000; font-weight: bold">1</span>) <span style="color: #808080">+</span> " id <span style="color: #0000ff">from</span> students <span style="color: #0000ff">order</span> <span style="color: #0000ff">by</span> id)" <span style="color: #808080">+</span>"<span style="color: #0000ff">order</span> <span style="color: #0000ff">by</span><span style="color: #000000"> id";
- </span><span style="color: #008080"> 6</span>
- <span style="color: #008080"> 7</span> <span style="color: #000000">mysql:
- </span><span style="color: #008080"> 8</span>
- <span style="color: #008080"> 9</span> String sql <span style="color: #808080">=</span>"<span style="color: #0000ff">select</span> <span style="color: #808080">*</span> <span style="color: #0000ff">from</span> students <span style="color: #0000ff">order</span> <span style="color: #0000ff">by</span> id limit " <span style="color: #808080">+</span> pageSize<span style="color: #808080">*</span>(pageNumber<span style="color: #808080">-</span><span style="color: #800000; font-weight: bold">1</span>) <span style="color: #808080">+</span> ","<span style="color: #808080">+</span><span style="color: #000000">pageSize;
- </span><span style="color: #008080">10</span>
- <span style="color: #008080">11</span> <span style="color: #000000">oracle:
- </span><span style="color: #008080">12</span>
- <span style="color: #008080">13</span> String sql <span style="color: #808080">=</span>"<span style="color: #0000ff">select</span> <span style="color: #808080">*</span> <span style="color: #0000ff">from</span> " <span style="color: #808080">+</span>(<span style="color: #0000ff">select</span> <span style="color: #808080">*</span>,rownum rid <span style="color: #0000ff">from</span> (<span style="color: #0000ff">select</span> <span style="color: #808080">*</span> <span style="color: #0000ff">from</span> students <span style="color: #0000ff">order</span> <span style="color: #0000ff">by</span> postime <span style="color: #0000ff">desc</span>) <span style="color: #0000ff">where</span> rid<span style="color: #808080"><=</span>" <span style="color: #808080">+</span> pagesize<span style="color: #808080">*</span>pagenumber <span style="color: #808080">+</span>") <span style="color: #0000ff">as</span> t" <span style="color: #808080">+</span>
- <span style="color: #008080">14</span>
- <span style="color: #008080">15</span> "<span style="color: #0000ff">where</span> t<span style="color: #808080">></span>" <span style="color: #808080">+</span>pageSize<span style="color: #808080">*</span>(pageNumber<span style="color: #808080">-</span><span style="color: #800000; font-weight: bold">1</span>);</span>
7、用 JDBC查询学生成绩单,把主要代码写出来
- <span style="color: #008080"> 1</span> Connection cn<span style="color: #808080">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;
- </span><span style="color: #008080"> 2</span> PreparedStatement pstmt<span style="color: #808080">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;
- </span><span style="color: #008080"> 3</span> ResultSet rs<span style="color: #808080">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;
- </span><span style="color: #008080"> 4</span> <span style="color: #000000">try{
- </span><span style="color: #008080"> 5</span> <span style="color: #000000">Class.forName(driver.ClassName);
- </span><span style="color: #008080"> 6</span> cn<span style="color: #808080">=</span><span style="color: #000000">DriverManager.getConnection(url,username,password);
- </span><span style="color: #008080"> 7</span> pstmt<span style="color: #808080">=</span>cn.prepareStatement(“<span style="color: #0000ff">select</span> score,<span style="color: #808080">*</span> <span style="color: #0000ff">from</span> score,student”<span style="color: #808080">+</span>
- <span style="color: #008080"> 8</span> “<span style="color: #0000ff">where</span> score.stuid<span style="color: #808080">=</span>student.id <span style="color: #808080">and</span> student.name<span style="color: #808080">=</span><span style="color: #000000">?”);
- </span><span style="color: #008080"> 9 </span>pstmt.setString(<span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">,studentName);
- </span><span style="color: #008080">10</span>
- <span style="color: #008080">11</span> ResultSet rs<span style="color: #808080">=</span><span style="color: #000000">pstmt.executeQuery();
- </span><span style="color: #008080">12</span>
- <span style="color: #008080">13</span> <span style="color: #0000ff">while</span>(rs.<span style="color: #0000ff">next</span><span style="color: #000000">()){
- </span><span style="color: #008080">14</span> system.out.println(rs.getInt(“subject”) <span style="color: #808080">+</span> “ ” <span style="color: #808080">+</span><span style="color: #000000">rs.getFloat(“score”) );
- </span><span style="color: #008080">15</span> <span style="color: #000000">}
- </span><span style="color: #008080">16</span> <span style="color: #000000">}catch(Exception e){e.printStackTrace();}
- </span><span style="color: #008080">17</span> <span style="color: #000000">finally
- </span><span style="color: #008080">18</span> <span style="color: #000000">{
- </span><span style="color: #008080">19</span> <span style="color: #0000ff">if</span>(rs <span style="color: #808080">!=</span> <span style="color: #0000ff">null</span><span style="color: #000000">)
- </span><span style="color: #008080">20</span> try{rs.<span style="color: #0000ff">close</span><span style="color: #000000">() }catch(exception e){}
- </span><span style="color: #008080">21</span> <span style="color: #0000ff">if</span>(pstmt <span style="color: #808080">!=</span> <span style="color: #0000ff">null</span><span style="color: #000000">)
- </span><span style="color: #008080">22</span> try{pstmt.<span style="color: #0000ff">close</span><span style="color: #000000">()}catch(exception e){}
- </span><span style="color: #008080">23</span> <span style="color: #0000ff">if</span>(cn <span style="color: #808080">!=</span> <span style="color: #0000ff">null</span><span style="color: #000000">)
- </span><span style="color: #008080">24</span> try{cn.<span style="color: #0000ff">close</span><span style="color: #000000">() }catch(exception e){}
- </span><span style="color: #008080">25</span> }
8、说出数据连接池的工作机制是什么?
- <span style="color: #000000; font-size: 14px">J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。<br><br>如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,<br><br>其他调用就可以使用这个连接。
- 实现方式,返回的Connection 是原始Connection 的代理,代理Connection 的close 方法,不是真正关连接,而是把它代理的Connection 对象还回到连接池中。</span>
9、为什么要用ORM?和JDBC有何不一样?
- <span style="color: #000000; font-size: 14px">orm 是一种思想,就是把object 转变成数据库中的记录,或者把数据库中的记录转变成objecdt,我们可以用jdbc 来实现这种思想,<br><br>其实,如果我们的项目是严格按照oop 方式编写的话,我们的jdbc 程序不管是有意还是无意,就已经在实现orm 的工作了。
- 现在有许多orm 工具,它们底层调用jdbc 来实现了orm 工作,我们直接使用这些工具,就省去了直接使用jdbc 的繁琐细节,<br><br>提高了开发效率,现在用的较多的orm 工具是hibernate。也听说一些其他orm 工具,如toplink,ojb 等。</span>
Java面试-数据库篇(一)
标签:jdb use stack 情况 分页sql 结果 面试 连接 final