java常见面试知识点

SSH三大框架

1.Hibernate工作原理,为什么要用?

原理

1.读取并解析配置文件。2.读取并解析映射信息,创建SessionFactory。3.打开Session。4.创建事务。5.关闭Session。6.提交事务。7关闭SesstionFactory。

为什么用?

1 对JDBC访问数据库的代码做了封装,简化了数据访问层繁琐的重复性代码。2 Hibernate是一个基于JDBC的主流框架,很好的ORM实现。简化了DAO层的编码工作。3 Hibernate 使用java反射机制,而不是字节码怎价程序来实现通透性。4 hibernate的性能非常好,轻量级框架。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2.hibernate 是如何延迟加载?

延迟加载实现:对象   集合

hiber提供了属性的延迟加载功能当hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在内存中,就实现了延迟加载,节省了服务器的内存,从而提高了服务器的性能。

Hibernate的二级缓存

(1)缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。

(2)Hibernate的Session就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于Session代表一次会话过程,一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因此,Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session没有这种效果。

如何优化hibernate?

1.使用双向一对多关联,不使用单向一对多

2.灵活使用单向一对多关联

3.不用一对一,用多对一取代

4.配置对象缓存,不使用集合缓存

5.一对多集合使用Bag,多对多集合使用Set

6. 继承类使用显式多态

7. 表字段要少,表关联不要怕多,有二级缓存撑腰。


struts:是基于JSP和servlet的一个开源的Web应用框架,使用的是MVC的设计模式struts2是基于webwork技术的框架

struts1流程?

1.客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被ActionServlet接收。3、根据struts-config.xml配置, ActionServlet先将请求中的参数填充到ActionForm中,然后ActionServlet再将请求发送到Action 进行处理。4、是否验证,需要验证则调用ActionForm的validate方法,验证失败则跳转到input,成功则继续。5、Action从ActionForm获得数据,调用javabean 中的业务方法处理数据。6、Action返回ActionForward对象,跳转到相应JSP页面或Action。7、返回HTTP响应到客户端浏览器。ruts

struts2流程?

1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。

为什么要用

JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。

(Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。)


Struts的validate框架是如何验证的?

在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。


说下Struts的设计模式

MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数 据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对 象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动 态的网页,返回给客户。

Struts的优点

1实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
2. 有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。

3.页面导航,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。


传统的架构:

1) Session Bean <-> Entity Bean<-> DB

为了解决性能障碍的替代架构:

2) Session Bean <-> DAO <->JDBC <-> DB

使用Hibernate来提高上面架构的开发效率的架构:

3) Session Bean <-> DAO <->Hibernate <-> DB

就上面3个架构来分析:

1、内存消耗:采用JDBC的架构2无疑是最省内存的,Hibernate的架构3次之,EB的架构1最差。

2、运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通JDBC,运用 Batch语句,调整PreapredStatement的Batch Size和Fetch Size等参数,以及在必要的情况下采用结果集cache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率。 EB的架构效率会差的很远。

3、开发效率:在有JBuilder的支持下以及简单的项目,EB架构开发效率最高,JDBC次之,Hibernate最差。但是在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate效率高的惊人,JDBC次之,而EB架构很可能会失败。

由于有SB做为Facade,3个架构没有区别。


spring

spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程)


spring工作机制

1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。

2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.

3.DispatcherServlet请请求提交到目标Controller

4.Controller进行业务逻辑处理后,会返回一个ModelAndView

5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 .

6.视图对象负责渲染返回给客户端。

spring aop  ioc

IOC,控制反转这样理解举个简单的例子一个人要去砍柴。

我们会这样设计程序

class Axe{   //一些字段或方法

}class person{   

private Axe axe = new Axe();        //自己制造斧头   

public void cut(Axe axe)  

{        axe.cut();    }}

即是,我们要去砍柴,我们要自己制造斧头。而IOC的意思就是我们需要斧头,这时候斧头就已经制造好了,我们去取就可以,不用自己制造.

class person{    private Axe axe = springFactory.getBean("axe");  

public void cut(Axe axe)    {        axe.cut();    }}这些axe就是在spring的配置文件里声明的bean. IOC和控制反转是一个意思

AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。

使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。

IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。 Spring即使一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。

Servlet的生命周期?

答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。

SERVLET API中forward() 与redirect()的区别?

答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

jsp有哪些内置对象?

request 用户端请求,此请求会包含来自GET/POST请求的参数

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet 正在执行的内容

out 用来传送回应的输出

config servlet的构架部件

page JSP网页本身

exception 针对错误网页,未捕捉的例外。

  request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
  response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)

  out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

  pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
  session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息

  applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

  config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。

  page表示从该页面产生的一个servlet实例 。

JSP中动态INCLUDE与静态INCLUDE的区别

动态INCLUDE用jsp:include动作实现 <jsp:include page=included.jspflush=true />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file=included.htm %>

MVC的各个部分都有那些技术来实现?如何实现?

答:MVC是Model-View-Controller的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), View 是应用的表示面(由JSP页面产生),Controller 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。


数据库


1.取出sql表中第31到40的记录

sql server

select top 10 * from t where id not in (select top 30 id from t order by id ) orde byid

oracle

select * from (select rownum r,* from t where r<=40) wherer>30

2.删除除了id号不同,其他都相同的学生冗余信息

delete from student2 where id not in(selectmid from (select min(id) mid

from student2 group by name) as t);或者:

delete from student2 where id not in(selectmin(id) from (select * from s

tudent2) as t group by t.name);

3.查询起飞城市是北京的所有航班,按到达城市的名字排序

表结构

flight{flightID,StartCityID,endCityID,StartTime}

city{cityID, CityName)

select  * from flight f,city c

         wheref.endcityid = c.cityid and startcityid =

         (selectc1.cityid from city c1 where c1.cityname = "北京")

         orderby c.cityname asc;

4.求出发帖最多的人:

select authorid,count(*) total fromarticles

group by authorid

having total=

(select max(total2) from (select count(*)total2 from articles group by authorid) as t);

 已知关系模式:

  S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名

  C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师

  SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩

  1. 找出没有选修过“李明”老师讲授课程的所有学生姓名

  --实现代码:

  SELECT SNAME FROM S

  WHERE NOT EXISTS(

  SELECT * FROM SC,C

  WHERE SC.CNO=C.CNO

  AND CNAME='李明'

  AND SC.SNO=S.SNO)

  2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

  --实现代码:

  SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)

  FROM S,SC,(

  SELECT SNO

  FROM SC

  WHERE SCGRADE<60

  GROUP BY SNO

  HAVING COUNT(DISTINCT CNO)>=2

  )A WHERE S.SNO=A.SNO AND SC.SNO=A.SNO

  GROUP BY S.SNO,S.SNAME

  3. 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名

  --实现代码:

  SELECT S.SNO,S.SNAME

  FROM S,(

  SELECT SC.SNO

  FROM SC,C

  WHERE SC.CNO=C.CNO

  AND C.CNAME IN('1','2')

  GROUP BY SNO

  HAVING COUNT(DISTINCT CNO)=2

  )SC WHERE S.SNO=SC.SNO

  4. 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号

  --实现代码:

  SELECT S.SNO,S.SNAME

  FROM S,(

  SELECT SC1.SNO

  FROM SC SC1,C C1,SC SC2,C C2

  WHERE SC1.CNO=C1.CNO AND C1.NAME='1'

  AND SC2.CNO=C2.CNO AND C2.NAME='2'

  AND SC1.SCGRADE>SC2.SCGRADE

  )SC WHERE S.SNO=SC.SNO

  5. 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩

  --实现代码:

  SELECT S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]

  FROM S,(

  SELECT SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE

  FROM SC SC1,C C1,SC SC2,C C2

  WHERE SC1.CNO=C1.CNO AND C1.NAME='1'

  AND SC2.CNO=C2.CNO AND C2.NAME='2'

  AND SC1.SCGRADE>SC2.SCGRADE

  )SC WHERE S.SNO=SC.SNO



设有学生选取修课程数据库:
S(Sid, SNAME, AGE, SEX, DEPARTMENT, ADDRESS, BIRTHPLACE)
SC(Sid, Cid, GRADE)
C(Cid, CNAME, TEACHER)
(1) 李老师所教的课程号、课程名称;


select cid,cname

from c

where teacher = '李'


(2) 年龄大于23岁的女学生的学号和姓名;


select sid,sname

from s

where s.age>23 and sex = '女'


(3) “李小波”所选修的全部课程名称;



select c.cname

from c

where c.cid in (

          select sc.cid

          from s,sc

          where s.sid = sc.sid and s.sname = '李小波'

);


(4) 所有成绩都在80分以上的学生姓名及所在系;


select sname,department

from s

where sid in (

          select sid from sc group by sid having min(grade)>=80

);


(5) 没有选修“操作系统”课的学生的姓名;



select sname
from s
where s.sid not in (
     select sc.sid from sc,c where sc.cid = c.cid and c.cname = '操作系统'   
)


(6) 与“李小波”同乡的男生姓名及所在系;


select s.sname, s.department
from s
where s.sex='男'
and s.birthplace = (
     select s.birthplace
         from s
    where s.sname='李小波'
);


(7) 英语成绩比数学成绩好的学生;



select s.sname from s where s.sid in(
select x.sid from sc x, sc y
where x.sid = y.sid
and x.grade>y.grade
and x.cid =(select cid from c where c.cname='英语')
and y.cid = (select cid from c where c.cname='数学')
);


(8) 选修同一门课程时,女生比男生成绩好的学生名单;
SELECT  X1.SNAME
FROM  S  X1, SC  Y1
WHERE  X1.Sid=Y1.Sid AND
          X1.SEX='女'  AND
          Y1.GRaDe>ALL
    (SELECT  Y2.GRaDe
FROM  S  X2,  SC  Y2
WHERE  X2.Sid=Y2.Sid  AND
          X2.SEX='男'  AND
          Y2.Cid=Y1.Cid )

(9) 至少选修两门以上课程的学生姓名、性别;



select s.sname,s.sex
  from s
where sid in (
           select sid
    from sc
    group by sid
    having count(*)>=2
)


(10) 选修了李老师所讲课程的学生人数;

select count(cid)
  from sc
where sc.cid in(
    select cid
    from c
    where c.teacher = '李老师'
)
(11) “操作系统”课程得最高分的学生姓名、性别、所在系;

select s.sname,s.sex,s.department from s,sc,c where s.sid= sc.sid and sc.cid = c.cid and c.cname ='操作系统' and sc.grade = (
select max(sc.grade)
from sc,c
where sc.cid = c.cid and c.cname = '操作系统' )



分页:

sql server:
         Stringsql =

         "selecttop " + pageSize + " * from students where id not in" +
   "(select top " + pageSize *(pageNumber-1) + " id from students order by id)" +
"order by id";

mysql:       

Stringsql =

        "select* from students order by id limit " + pageSize*(pageNumber-1) +"," + pageSize;       

oracle:
Stringsql =

          "select * from " + 

          (select *,rownum rid from (select * fromstudents order by postime desc) where rid<=" + pagesize*pagenumber +") as t" +

          "where t>" +pageSize*(pageNumber-1);



xml有哪些解析技术,区别是什么

有DOM,SAX,STAX等

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问

STAX:Streaming API for XML (StAX)

你可能感兴趣的:(数据库,面试,ssh)