您的位置:首页 > 编程语言 > Java开发

Java之五大框架(Struts、Hibernate、MyBatis、Spring、Spring MVC)知识点总结(一)

2019-03-13 16:32 232 查看

目录

一、Struts相关知识点

1、简述Struts架构

2、Struts的工作原理

3、Struts的工作流程

4、Struts对MVC的体现

5、Struts优缺点

二、Hibernate相关知识点

1、Hibernate框架的认识

2、Hibernate工作原理及为什么要用? 

3、什么是ORM及为什么要用?

4、常用的ORM框架

5、ORM与JDBC的区别

6、Hibernate是如何延迟加载(懒加载)?

7、Hibernate的缓存机制

8、Hibernate的查询方式

9、Hibernate中get和load的区别

10、如何对hibernate进行优化?

三、MyBatis相关知识点

1、MyBatis的认识

2、MyBatis的工作原理

3、MyBatis的工作流程

4、MyBatis的优缺点

5、MyBatis中#{}和${}的区别是什么?

6、Mybatis的mapper文件中resultType和resultMap的区别

7、Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的,其内部是怎么实现的?

8、MyBatis和Hibernate的相同点及区别

我们知道,传统的Java Web应用程序是采用JSP+Servlet+Javabean来实现的,这种模式实现了最基本的MVC分层,使的程序结构分为几层,有负责前台展示的JSP、负责流程逻辑控制的Servlet以及负责数据封装的Javabean。但是这种结构仍然存在问题:如JSP页面中需要使用<%%>符号嵌入很多的Java代码,造成页面结构混乱,Servlet和Javabean负责了大量的跳转和运算工作,耦合紧密,程序复用度低等等。

 框架相当于一个工具,比如你在挖矿的时候,需要一把铲子,和一个动作,框架就是这把铲子和动作。Struts、Hibernate、MyBatis、Spring、Spring MVC是我们Java开发中的常用关键,他们分别针对不同的应用场景给出最合适的解决方案。

 

一、Struts相关知识点

1、简述Struts架构

Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有如下的主要功能: 一.包含一个controller servlet,能将用户的请求发送到相应的Action对象。 二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。 三.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。

 

2、Struts的工作原理

在Struts2框架中的处理大概分为以下几个步骤 :
(1)客户端初始化一个指向Servlet容器(例如Tomcat)的请求 ;
(2) 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) ;
(3) 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action ;
(4)如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy ;
(5) ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 ;
(6)ActionProxy创建一个ActionInvocation的实例。 
(7) ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 
(8) 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 。

 

3、Struts的工作流程

(1)客户端浏览器发出HTTP请求。

(2)根据web.xml配置,该请求被FilterDispatcher接收。

(3)根据struts.xml配置,找到需要调用的Action类和方法,经过一系列的拦截器(Interceptor)执行后,程序执行到action中的指定的方法, 并且从前台接收的参数通过IoC方式,将值注入给Aciton。

(4)Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。

(5)Action执行完毕,根据struts.xml中的配置result找到对应的返回结果result,并跳转到相应页面。

(6)返回HTTP响应到客户端浏览器。

 

4、Struts对MVC的体现

M: 在Struts中,模型由JavaBean和EJB组件组成,用来实现程序的业务逻辑部分.
C: ActionServlet,RequestProcessor和Struts辅助类来实现控制器。ActionServlet是Struts中的核心控制器ActionServlet会根据在Struts配置文件中的配置将控制权转交给相应的Action类。Action 类是业务的代理,在Action类中可以调用模型组件或者编写其他业务逻辑代码来完成一项具体的业务。
V: Struts框架中的视图主要由JSP文件构成,在JSP文件中可应用Struts标签和自定义标签来表现模型组件中的数据进行简单的处理。ActionForm Bean实际上是一个遵循了特殊约定的JavaBean,在Struts中ActionForm Bean可看作为一个中间存储器在视图与控制器之间进行数据传递。

 

5、Struts优缺点

优点:
1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
2.有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率
3. 页面导航
使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
4. 提供Exception处理机制 .
5. 数据库链接池管理
6. 支持I18N
缺点:
一、 转到展示层时,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器
二、 Struts 的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。
三、 测试不方便. Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试。
四、 类型的转换. Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。
五、 对Servlet的依赖性过强. Struts处理Action时必需要依赖ServletRequest 和ServletResponse,所有它摆脱不了Servlet容器。
六、 前端表达式语言方面.Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。
七、 对Action执行的控制困难. Struts创建一个Action,如果想控制它的执行顺序将会非常困难。甚至你要重新去写Servlet来实现你的这个功能需求。
八、 对Action 执行前和后的处理. Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操作。
九、 对事件支持不够. 在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能 对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件。

 

二、Hibernate相关知识点

1、Hibernate框架的认识

Hibernate是一个轻量级的持久层开源框架,它是连接Java应用程序和关系数据库的中间件,负责Java对象和关系数据之间的映射。
Hibernate内部对JDBC API进行了封装,负责Java对象的持久化。因为它封装了所有的数据访问细节,使得业务逻辑层可以专注于实现业务逻辑。它是一种优秀的ORM映射工具,提供了完善的对象-关系映射服务,开发过程不依赖容器,灵活性非常大,可以无缝集成到任何一个java系统中。

 

2、Hibernate工作原理及为什么要用? 

工作原理:

1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.通过sessionFactory.openSession();//打开Sesssion
5.通过session.beginTransaction();//创建事务Transation
6.由persistent operate进行持久化操作
7.session.getTransaction().commit();//提交事务
8.关闭Session
9.关闭SesstionFactory

Hibernate优点为什么要用?
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。它很大程度的简化DAO层的编码工作;

3. Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

4. Hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

Hibernate缺点 
1、Hibernate在批量数据处理时有弱势 。

2、针对单一对象简单的增删查改,适合于Hibernate,而对于批量的修改,删除,不适合用Hibernate,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用Hibernate 。

 

3、什么是ORM及为什么要用?

简述ORM

    ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。

为什么使用:

当我们实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存、删除、读取对象信息,而这些代码都是重复的。而使用ORM则会大大减少重复性代码。对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。

ORM的优缺点:

优点: 
1)提高开发效率,降低开发成本 
2)使开发更加对象化 
3)可移植 
4)可以很方便地引入数据缓存之类的附加功能 
缺点: 
1)自动化进行关系数据库的映射需要消耗系统性能。其实这里的性能消耗还好啦,一般来说都可以忽略之。 
2)在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。

 

4、常用的ORM框架

   (1)Hibernate全自动需要些hql语句(以面向对象的方式去编程,封装了JDBC

   (2)iBATIS半自动自己写sql语句,可操作性强,小巧;

   (3)EclipseLink 一个可扩展的支持JPA的ORM框架,供强大的缓存功能,缓存支持集群。

   (4)Apache OJB等等;

 

5、ORM与JDBC的区别

ORM:是对象关系模型,如hibernate,让你以面向对象的方式去编程,封装了JDBC。

JDBC:是java操作数据库的规范接口,是从底层访问数据库服务器。一般银行,金融行业为了安全起见,直接用JDBC访问。

 

6、Hibernate是如何延迟加载(懒加载)?

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

 Hibernate2延迟加载实现:

a)实体对象  b)集合(Collection)

禁用延迟加载的方式:

1.使用代理对象:Hibernate.initialize("代理对象");

2.在需要禁用懒加载的映射文件中显示的加入lazy = "false"

3.使用openSessionInView【需要借助于过滤器】 需要在web.xml文件中配置

 

7、Hibernate的缓存机制

Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存。

1.Hibernate一级缓存又称为“Session的缓存”。

Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。一级缓存中,持久化类的每个实例都具有唯一的OID。

2.Hibernate二级缓存又称为“SessionFactory的缓存”。

由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。

第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。

Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。

 

8、Hibernate的查询方式

Sql、Criteria、object comptosition、HQL:

1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数


9、Hibernate中get和load的区别

(1)不存在对应记录时表现不一样

load :找不到数据的话会抛出org.hibernate.ObjectNotFoundException异常。此时hibernate会使用延迟加载加载机制。

 get:如果查询不到数据,get 会返回 null,但是不会报错。
(2)load返回的是代理对象(javassist.jar生成二进制码),等到真正用到对象的内容才会发出SQL语句
(3)get直接从数据库加载,不会延迟
无论是get还是load,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()方法,可以强制清除。

 

10、如何对hibernate进行优化?

(1) 使用双向一对多关联,不使用单向一对多;
(2)灵活使用单向一对多关联;
(3)不用一对一,用多对一取代;
(4)配置对象缓存,不使用集合缓存;
(5)一对多集合使用Bag,多对多集合使用Set;
(6) 继承类使用显式多态;
(7)表字段要少,表关联不要怕多,有二级缓存.
 

三、MyBatis相关知识点

1、MyBatis的认识

MyBatis是一个优秀的持久层框架,他对jdbc操作数据库的过程进行了封装,使开发着只用关注sql本身,不用去关注例如注册驱动,加载链接,得到statement,处理结果集等复杂的过程。 
MyBatis通过xml或者注解的方式,将要执行的各种sql语句配置起来,并通过Java对象和statement中的sql语句映射生成最终的sql语句,最后由MyBatis框架执行sql语句,并将结果映射成Java对象返回。 

 

2、MyBatis的工作原理

MyBatis通过配置文件创建sqlsessionFactory,sqlsessionFactory根据配置文件(配置文件来源于两个方面:一个是xml,一个是Java中的注解),获取sqlSession。SQLSession包含了执行sql语句的所有方法,可以通过SQLSession直接运行映射的sql语句,完成对数据的增删改查和事物的提交工作,用完之后关闭SQLSession。

 

3、MyBatis的工作流程

(1)通过SqlSessionFactoryBuilder创建SqlSessionFactory;

(2)通过SqlSessionFactory创建SqlSession;

(3)通过SqlSession拿到Mapper对象的代理;

(4)通过MapperProxy调用Maper中相应的方法(执行增删改查方法);

处理操作请求过程:

  1. 根据SQL的ID查找对应的MappedStatement对象。
  2. 根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
  3. 获取数据库连接,根据得到的最终SQL语句和执行传入参数,到数据库执行,并得到执行结果。
  4. 根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
  5. 释放连接资源。

(5)返回处理结果将最终的处理结果返回。

 

4、MyBatis的优缺点

MyBatis优点:
1:半自动化的ORM实现(实体类和SQL语句之间建立映射关系)
2:SQL代码从程序代码中彻底分离,可重用
3:与JDBC相比,减少了50%以上的代码量
4:小巧灵活、简单易学,是最简单的持久化框架
5:提供XML标签,支持编写动态SQL
6:提供映射标签,支持对象与数据库的ORM字段映射

MyBatis缺点:
1:SQL语句编写工作量大,对开发人员有一定sql技术要求
2:数据库移植性差(不同数据库,sql语句语法有所不同)

 

5、MyBatis中#{}和${}的区别是什么?

#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。

 

6、Mybatis的mapper文件中resultType和resultMap的区别

resultType和resultMap功能类似,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是,resultType就比较鸡肋了,必须字段名一样,比如说 cId和c_id 这种的都不能映射 。下面介绍几个常用的映射关系:

 

7、Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的,其内部是怎么实现的?

mybatis通过JDK的动态代理Proxy方式,在启动加载配置文件时,根据配置mapper的xml去生成Dao的实现。

Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回

 

8、MyBatis和Hibernate的相同点及区别

相同点:

(1)Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。Hibernate和MyBatis都支持JDBC和JTA事务处理。

(2)Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为

不同点:

(1)hibernate是全自动,而mybatis是半自动

hibernate是面向对象的思想操作数据生成Sql语句,而mybatis是以纯sql操作数据。hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。

(2)hibernate数据库移植性远大于mybatis

hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(Oracle、MySQL等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。

(3)hibernate拥有完整的日志系统,mybatis则欠缺一些

hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。

(4)mybatis相比hibernate需要关心很多细节

hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。但也正因为mybatis使用简单,才导致它要比hibernate关心很多技术细节。mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因此很容易上手并开发项目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发出软件却很快。hibernate则正好与之相反。但是如果使用hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。

(5)sql直接优化上,mybatis要比hibernate方便很多

由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上hibernate不及mybatis。

(6)缓存机制上,hibernate要比mybatis更好一些

MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。而Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。

 

关于Spring、Spring MVC等框架在下篇进行总结:)

传送门:https://www.geek-share.com/detail/2763544983.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: