JAVA面试中级篇讲解Word格式文档下载.docx
- 文档编号:16187250
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:28
- 大小:81.27KB
JAVA面试中级篇讲解Word格式文档下载.docx
《JAVA面试中级篇讲解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《JAVA面试中级篇讲解Word格式文档下载.docx(28页珍藏版)》请在冰豆网上搜索。
5)处理结果
while(rs.next()){
System.out.println(rs.getInt("
empno"
)+"
-"
+rs.getString("
ename"
));
}
6)关闭资源
finally{
if(con!
=null){
try{
con.close();
}catch(SQLExceptione){
e.printStackTrace();
}
提示:
关闭外部资源的顺序应该和打开的顺序相反,也就是说先关闭ResultSet、再关闭Statement、在关闭Connection。
上面的代码只关闭了Connection(连接),虽然通常情况下在关闭连接时,连接上创建的语句和打开的游标也会关闭,但不能保证总是如此,因此应该按照刚才说的顺序分别关闭。
此外,第一步加载驱动在JDBC4.0中是可以省略的(自动从类路径中加载驱动),但是我们建议保留。
1.下列属于关系型数据库的是()
A.Oracle
B.MySql
C.IMS
D.MongoDB
答案:
AB
解答:
IMS(InformationManagementSystem)数据库是IBM公司开发的两种数据库类型之一;
一种是关系数据库,典型代表产品:
DB2;
另一种则是层次数据库,代表产品:
IMS层次数据库。
非关系型数据库有MongoDB、memcachedb、Redis等。
在进行数据库编程时,连接池有什么作用?
由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,再加上网络延迟,造成的开销是不可忽视的),为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略(浪费了空间存储连接,但节省了创建和释放连接的时间)。
池化技术在Java开发中是很常见的,在使用线程时创建线程池的道理与此相同。
基于Java的开源数据库连接池主要有:
C3P0、Proxool、DBCP、BoneCP、Druid等。
【补充】在计算机系统中时间和空间是不可调和的矛盾,理解这一点对设计满足性能要求的算法是至关重要的。
大型网站性能优化的一个关键就是使用缓存,而缓存跟上面讲的连接池道理非常类似,也是使用空间换时间的策略。
可以将热点数据置于缓存中,当用户查询这些数据时可以直接从缓存中得到,这无论如何也快过去数据库中查询。
当然,缓存的置换策略等也会对系统性能产生重要影响,对于这个问题的讨论已经超出了这里要阐述的范围。
什么是DAO模式?
DAO(DataAccessObject)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露数据库实现细节的前提下提供了各种数据操作。
为了建立一个健壮的JavaEE应用,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。
用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。
在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。
DAO模式实际上包含了两个模式,一是DataAccessor(数据访问器),二是DataObject(数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。
什么是ORM?
对象关系映射(Object-RelationalMapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(可以用XML或者是注解),将Java程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。
JDBC中如何进行事务处理?
Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;
当事务完成后用commit()显式提交事务;
如果在事务处理过程中发生异常则通过rollback()进行事务回滚。
除此之外,较新的JDBC标准还引入了Savepoint(保存点)的概念,允许事务回滚到指定的保存点。
事务的ACID是指什么?
1)原子性(Atomic):
事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
2)一致性(Consistent):
事务结束后系统状态是一致的;
3)隔离性(Isolated):
并发执行的事务彼此无法看到对方的中间状态;
4)持久性(Durable):
事务完成后所做的改动都会被持久化,即使发生灾难性的失败。
通过日志和同步备份可以在故障发生后重建数据。
【补充】关于事务,在面试中被问到的概率是很高的,可以问的问题也是很多的。
首先需要知道的是,只有存在并发数据访问时才需要事务。
使用JDBC操作数据库时,如何提升读取数据的性能?
如何提升更新数据的性能?
要提升读取数据的性能,可以指定通过结果集(ResultSet)对象指定每次抓取数据的大小(fetchsize);
要提升更新数据的性能可以使用PreparedStatement语句构建批处理(batch)。
如何优化数据库,如何提高数据库的性能?
1)硬件调整性能最有可能影响性能的是磁盘和网络吞吐量,解决办法扩大虚拟内存,并保证有足够可以扩充的空间;
把数据库服务器上的不必要服务关闭掉;
把数据库服务器和主域服务器分开;
把SQL数据库服务器的吞吐量调为最大;
在具有一个以上处理器的机器上运行SQL。
2)调整数据库
若对该表的查询频率比较高,则建立索引;
建立索引时,想尽对该表的所有查询搜索操作,按照where选择条件建立索引,尽量为整型键建立为有且只有一个簇集索引,数据在物理上按顺序在数据页上,缩短查找范围,为在查询经常使用的全部列建立非簇集索引,能最大地覆盖查询;
但是索引不可太多,执行UPDATEDELETEINSERT语句需要用于维护这些索引的开销量急剧增加;
避免在索引中有太多的索引键;
避免使用大型数据类型的列为索引;
保证每个索引键值有少数行。
3)使用存储过程
应用程序的实现过程中,能够采用存储过程实现的对数据库的操作尽量通过存储过程来实现,因为存储过程是存放在数据库服务器上的一次性被设计、编码、测试,并被再次使用,需要执行该任务的应用可以简单地执行存储过程,并且只返回结果集或者数值,这样不仅可以使程序模块化,同时提高响应速度,减少网络流量,并且通过输入参数接受输入,使得在应用中完成逻辑的一致性实现。
4)应用程序结构和算法
建立查询条件索引仅仅是提高速度的前提条件,响应速度的提高还依赖于对索引的使用。
因为人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,特别是对数据量不是特别大的数据库操作时,是否建立索引和使用索引的好坏对程序的响应速度并不大,因此程序员在书写程序时就忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在数据量特别大时或者大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。
在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。
在对它们进行适当的优化后,其运行速度有了明显地提高!
Statement和PreparedStatement有什么区别?
哪个性能更好?
与Statement相比,①PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);
②PreparedStatement中的SQL语句是可以带参数的;
③当批量处理SQL时或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同语句时就会很快。
【补充】为了提供对存储过程的调用,JDBCAPI中还提供了CallableStatement接口。
存储过程(StoredProcedure)是数据库系统中,一组为了完成特定功能的SQL语句的集合,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
虽然调用存储过程会带来网络开销、安全性、性能上的好处,但是存在如果底层数据库发生迁移时就会有很多麻烦,因为每种数据库的存储过程在书写上存在不少的差别。
JDBC能否处理Blob和Clob?
Blob是指二进制大对象(BinaryLargeObject),而Clob是指大字符对象(CharacterLargeObjec),因此其中Blob是为存储大的二进制数据而设计的,而Clob是为存储大的文本数据而设计的。
JDBC的PreparedStatement和ResultSet都提供了相应的方法来支持Blob和Clob操作。
下面的代码展示了如何使用JDBC操作LOB:
下面以MySQL数据库为例,创建一个张有三个字段的用户表,包括编号(id)、姓名(name)和照片(photo),建表语句如下:
createtabletb_user
(
idintprimarykeyauto_increment,
namevarchar(20)uniquenotnull,
photolongblob
下面的Java代码向数据库中插入一条记录:
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
classJdbcLobTest{
publicstaticvoidmain(String[]args){
Connectioncon=null;
//1.加载驱动(Java6以上版本可以省略)
Class.forName("
com.mysql.jdbc.Driver"
//2.建立连接
con=DriverManager.getConnection("
mysql:
//localhost:
3306/test"
root"
123456"
//3.创建语句对象
insertintotb_uservalues(default,?
?
)"
ps.setString(1,"
语文"
//将SQL语句中第一个占位符换成字符串
try(InputStreamin=newFileInputStream("
test.jpg"
)){//Java7的TWR
ps.setBinaryStream(2,in);
//将SQL语句中第二个占位符换成二进制流
//4.发出SQL语句获得受影响行数
System.out.println(ps.executeUpdate()==1?
"
插入成功"
:
插入失败"
}catch(IOExceptione){
System.out.println("
读取照片失败!
}catch(ClassNotFoundException|SQLExceptione){//Java7的多异常捕获
}finally{//释放外部资源的代码都应当放在finally中保证其能够得到执行
=null&
&
!
con.isClosed()){
//5.释放数据库连接
con=null;
//指示垃圾回收器可以回收该对象
XML
XML包括哪些解释技术,区别是什么?
包括:
DOM(DocumentObjectModal)文档对象模型,SAX(SimpleAPIforXML)。
DOM是一次性将整个文档读入内存操作,如果是文档比较小,读入内存,可以极大提高操作的速度,但如果文档比较大,那么这个就吃力了。
所以此时SAX应用而生,它不是一次性的将整个文档读入内存,这对于处理大型文档就比较就力了
XML文档定义有几种形式?
它们之间有何本质区别?
解析XML文档有哪几种方式?
XML文档定义分为DTD和Schema两种形式;
其本质区别在于Schema本身也是一个XML文件,可以被XML解析器解析。
对XML的解析主要有DOM(文档对象模型)、SAX、StAX(JDK1.6中引入的新的解析XML的方式,StreamingAPIforXML)等,其中DOM处理大型文件时其性能下降的非常厉害,这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问(典型的用空间换取时间的策略);
SAX是事件驱动型的XML解析方式,它顺序读取XML文件,不需要一次全部装载整个文件。
当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问;
如其名称所暗示的那样,StAX把重点放在流上。
实际上,StAX与其他方法的区别就在于应用程序能够把XML作为一个事件流来处理。
将XML作为一组事件来处理的想法并不新颖(事实上SAX已经提出来了),但不同之处在于StAX允许应用程序代码把这些事件逐个拉出来,而不用提供在解析器方便时从解析器中接收事件的处理程序。
你在项目中哪些地方用到了XML?
答:
XML的主要作用有两个方面:
数据交换(曾经被称为业界数据交换的事实标准,现在此项功能在很多时候都被JSON取代)和信息配置。
在做数据交换时,XML将数据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再从XML文件中还原相关信息进行处理。
目前很多软件都使用XML来存储配置信息,很多项目中我们通常也会将作为配置的硬代码(hardcode)写在XML文件中,Java的很多框架也是这么做的。
谈谈对XML的理解?
说明Web应用中Web.xml文件的作用?
XML(ExtensibleMarkupLanguage)即可扩展标记语言,它与HTML一样,都是SGML(StandardGeneralizedMarkupLanguage,标准通用标记语言)。
Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。
扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。
web.xml的作用是配置欢迎页,servlet,filter,listener等的。
XML是一种元语言,可以用它来描述其他语言。
A.正确
B.错误
B
XML(ExtensibleMarkupLanguage)即可扩展标记语言,它与HTML一样,都是SGML(StandardGeneralizedMarkupLanguage,标准通用标记语言)。
扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。
在XML中用于注释的符号是。
(选择1项)
A.<
!
––>
B.<
?
––?
>
C.<
%%>
D.<
––!
A
DTD与XMLSchema都是XML文档。
B.不正确
DTD不是XML文件,schema是XML文档
Servlet与JSP
Servlet接口中有哪些方法?
Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
-voidinit(ServletConfigconfig)throwsServletException
-voidservice(ServletRequestreq,ServletResponseresp)throwsServletException,java.io.IOException
-voiddestory()
-java.lang.StringgetServletInfo()
-ServletConfiggetServletConfig()
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;
请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;
当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。
转发(forward)和重定向(redirect)的区别?
forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源,但是可以从一个网站redirect到其他网站。
forward更加高效,所以在满足需要时尽量使用forward(通过调用RequestDispatcher对象的forward()方法,该对象可以通过ServletRequest对象的getRequestDispatcher()方法获得),并且这样也有助于隐藏实际的链接;
在有些情况下,比如需要访问一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect()方法实现)。
JSP有哪些内置对象和动作?
它们的作用分别是什么?
JSP共有以下9种基本内置组件:
request用户端请求,此请求会包含来自GET/POST请求的参数
response网页传回用户端的回应
pageContext网页的属性是在这里管理
session与请求有关的会话期
applicationservlet正在执行的内容
out用来传送回应的输出
configservlet的构架部件
pageJSP网页本身
exception针对错误网页,未捕捉的例外
常用的组件:
request、response、out、session、application、exception
描述JSP和Servlet的区别、共同点、各自应用的范围
JSP在本质上就是SERVLET,但是两者的创建方式不一样.Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观.JSP由HTML代码和JSP标签构成,可以方便地编写动态网页.因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.
如果用Servlet来生成网页中的动态内容无疑是非常繁琐的工作,另一方面,所有的文本和HTML标签都是硬编码,即使做出微小的修改,都需要进行重新编译。
JSP解决了Servlet的这些问题,它是Servlet很好的补充,可以专门用作为用户呈现视图(View),而Servlet作为控制器(Controller)专门负责处理用户请求并转发或重定向到某个页面。
基于Java的Web开发很多都同时使用了Servlet和JSP。
JSP页面其实是一个Servlet,能够运行Servlet的服务器(Servlet容器)通常也是JSP容器,可以提供JSP页面的运行环境,Tomcat就是一个Servlet/JSP容器。
第一次请求一个JSP页面时,Servlet/JSP容器首先将JSP页面转换成一个JSP页面的实现类,这是一个实现了JspPage接口或其子接口HttpJspPage的Java类。
JspPage接口是Servlet的子接口,因此每个JSP页面都是一个Servlet。
转换成功后,容器会编译Servlet类,之后容器加载和实例化Java字节码,并执行它通常对Servlet所做的生命周期操作。
对同一个JSP页面的后续请求,容器会查看这个JSP页面是否被修改过,如果修改过就会重新转换并重新编译并执行。
如果没有则执行内存中已经存在的Servlet实例。
我们可以看一段JSP代码对应的Java程序就知道一切了,而且9个内置对象的神秘面纱也会被揭开。
从以下哪一个选项中可以获得Servlet的初始化参数?
A.ServletB.ServletContextC.ServletConfigD.GenericServlet
C
servlet的生命周期的方法中有一个init方法,其中一个重载的init方法的参数为ServletConfig可以获取初始化参数。
哪一个对象可以用于获得浏览器发送的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 面试 中级 讲解