hibernate、springmvc、spring、mybatis、struts2总结

一:Springmvc
工作流程:

客户端请求–>前端控制器DispatcherServlet进行捕获–>调用处理器映射器HandlerMapping根据具体的URL找到对应的处理器–>生成处理器对象以及处理器拦截器(如果没有拦截器就不生成)–>将生成的处理器对象返回给前端控制器DispatcherServlet–>前端控制器通过处理器适配器HandlerAdapter根据处理器对象调用相应的处理器–>执行处理器–>处理器执行完毕后将ModelAndView返回给处理器适配器HandlerAdapter–>给处理器适配器HandlerAdapter将ModelAndView返回给前端控制器DispatcherServlet–>前端控制器DispatcherServlet将ModelAndView交给视图解析器ViewReslover进行解析–>视图解析器解析完成后将具体视图View返回给前端控制器DispatcherServlet–>对视图View进行渲染–>返回客户端

二:  Struts2
工作流程:

客户端–>struts2核心过滤器StrutsPrePareAndExcuteFilter–>判断是否是一个Struts2请求–>如果是,将请求交给ActionProxy–>创建一个ActionInvocation的实例,并进行初始化–>Action调用相关拦截器–>Action执行完毕–>ActionInvocation根据struts.xml中的配置找到对应的结果–>调用结果的execute方法,渲染结果–>执行相关拦截器–>结果返回给客户端

Struts2的优点:
1.实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现。
2.丰富的标签库,大大提高了开发的效率。
3.Struts2提供丰富的拦截器实现。
4.通过配置文件,就可以掌握整个系统各个部分之间的关系。
5.异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理。
6.Struts2的可扩展性高。Struts2中设置了一些默认的bean,resultType类型,默认拦截器等,所有这些默认设置,都可以利用配置文件更改为自己开发的bean,resulttype等。
Struts2与Struts1比较:

Struts2是如何管理action的:
一组业务相关的action放在同一包下Struts2 中默认的包是struts-default,每个包都应该继承这个默认包
SpringMVC与Struts2的区别

三:Mybatis
工作原理:

根据XML配置文件创建SqlSessionFactory,SqlSessionFactory根据配置文件、注解获取SqlSession。SqlSession包含了执行sql所需要的所有方法,通过SqlSession运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。
#{}和${}的区别:
#{}是占位符,相当于SQL语句中的“?”,如果是基本数据类型,{}中的值可以随便写,如果是字符串类型,基本不是用该方式,如果是pojo类型,{}中直接写pojo的属性名,如果是map类型,{}中写map中的key。
${}代表字符串拼接,如果是基本数据类型,{}中只能写value,如果是字符串类型,{}中直接写字符串,如果是pojo类型,{}中直接写pojo的属性名,如果是map类型,{}中写map中的key。

四:Hibernate
工作原理:

应用程序先调用Configration类,该类读取hibernate的配置文件及映射文件中的信息(如果是注解的话则不需要读取映射文件),使用这些信息创建SessionFactory。打开session连接,构造session对象,开启事务。通过Session对象进行数据库操作。如果没有异常,提交事务,否则会回滚事务。
Hibernate的三种数据状态:
瞬时态:刚new出来,数据库中还没有该数据(没id没session)。
持久态:从数据库查询出来的,或者刚保存到数据库,session还没有关闭,数据库有,内容中也有(有id有session)。
游离态:数据库有,内存中没有(有id没session)。
Hibernate的缓存机制:
一级缓存:session缓存、事务级缓存,生命周期从事务开始到事务结束。
二级缓存:sessionFactory缓存,所有的session共享一个二级缓存。
查询时,先到一级缓存,一级缓存中没有查询到,到二级缓存中查询,二级缓存中也没有查询到的话,会发送SQL查询,把查询到的结果保存在一、二级缓存中。
一、二级缓存只针对以ID为查询条件的查询方式生效(get、load方法)。
Hibernate中get、load区别:
1.get查询,查询不到结果会返回null,load查询会直接抛异常。
2.get查询会按照一级、二级、数据库的顺序进行查询,而load查询则是查询一级缓存,没有查询到就创建代理对象,在需要的时候再去二级缓存、数据库中进行查询。
Hibernate中的查询方式:
1.OID查询:findById
2.Query:hql 查询:比较面向对象的查询,查询的是对象和对象中的属性
3.Criteria:qbc 完全面向对象的查询
4.原生SQL查询
5.对象导航查询
Hibernate如何优化:

1.hql优化:
A.使用参数绑定:
使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用生成好的执行计划,这样做节省CPU时间和内存。
避免SQL注入。
B.尽量少使用NOT
如果where子句中包含not关键字,那么执行时该字段的索引失效。
C.尽量使用where来替换having
 having在检索出所有记录后才对结果集进行过滤,这个处理需要一定的开销,而where子句限制记录的数目,能减少这方面的开销。
D.减少对表的查询
 在含有子查询的HQL中,尽量减少对表的查询,降低开销。
E.使用表的别名
 当在HQL语句中连接多个表时,使用别名,提高程序阅读性,并把别名前缀与每个列连接上,这样一来,可以减少解析时间并减少列歧义引起的语法错误。
F. 实体的更新与删除
在Hibernate3以后支持hql的update与delete操作。
2.数据库设计
a) 降低关联的复杂性
b) 尽量不使用联合主键
c) ID的生成机制,不同的数据库所提供的机制并不完全一样
d) 适当的冗余数据,不过分追求高范式检索策略(抓取策略)
3.主配置参数优化
4.映射文件优化:使用双向一对多关联,用多对一取代一对一。
5.配置对象缓存,不使用集合缓存。
6.表字段要少,表关联可以多。

Hibernate运行时出现No Session问题的解决:
原因:执行load方法时,仅仅返回代理类实例,session会关闭,session放在到层,表现层获取不到,就会报错。
解决:
1.全局取消延迟加载(针对整个表,导致内存占用大,会去除不需要的数据)
2.局部取消延迟加载(在service和dao局部取消,具有针对性,更加灵活,建议使用)
3.扩大session作用范围(效率低,会加重服务器的负担)
Hibernate和mybatis的区别

五:Spring
工作原理:

Spring运行时,根据spring的配置文件动态的创建对象,调用对象里的方法,也就是spring中内部最核心的IOC控制反转。其内部对某一对象进行监督和控制,使用AOP面向切面编程,从而达到对一个模块扩充的功能。
IOC(控制反转):
把new对象的权利交给spring框架去执行,spring容器在初始化的时候通过反射将容器中的bean实例化
AOP(面向切面编程):
主要运用了动态代理中的Proxy类和InvicationHandler接口实现。举例简单来说假如想在原来的目标类的前后加入日志的功能。目标类一定要实现一个接口,如果没有实现接口,spring就会用cglib包实现AOP。推荐实现一个接口的方式。实现的过程大概就是实现了一个InvicationHandler接口的方法,里面有一个属性是目标类,在invoke方法中利用反射执行目标类的方法,并在其前后加入日志的方法。然后将目标类的类加载器,目标类实现的接口和实现了InvicationHandler接口的方法传入到Proxy的newProxyInstance方法中。这样就实现了AOP。
Spring中的依赖注入方法:
构造方法注入、set方法注入、接口注入。最常用的是set方法注入。
Spring中用到的设计模式:
   代理模式:AOP用的比较多
   单例模式:在spring配置文件中定义的bean默认为单例模式
   模板模式:用来解决代码重复问题
   工厂模式:BeanFactory用来创建对象

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *