SpringMVC工做流程描述 前端
(1)向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。 数据库
(2)DispatcherServlet 根据 <servlet-name>-servlet.xml 中的配置对请求的URL进行解析,获得请求资源标识符(URI)。 缓存
而后根据该URI,调用 HandlerMapping 得到该Handler配置的全部相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。安全
(3)DispatcherServlet 根据得到的Handler,选择一个合适的 HandlerAdapter。(附注:若是成功得到HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)。服务器
(4)提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程当中,根据你的配置,Spring将帮你作一些额外的工做:架构
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。app
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。ide
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。ui
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。编码
(5)Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
(6)根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
(7)ViewResolver 结合Model和View,来渲染视图。
(8)视图负责将渲染结果返回给客户端。
如今咱们知道了一个概念Hibernate Session,只有处于Session管理下的POJO才具备持久化操做能力。当应用程序对于处于Session管理下的POJO实例执行操做时,Hibernate将这种面向对象的操做转换成了持久化操做能力。
HIbernate简要的体系结构以下图所示:
经过上图可以发现HIbernate须要一个hibernate.properties文件,该文件用于配置Hibernate和数据库链接的信息。还须要一个XML文件,该映射文件肯定了持久化类和数据表、数据列之间的想对应关系。
除了使用hibernate.properties文件,还能够采用另外一种形式的配置文件: *.cfg.xml文件。在实际应用中,采用XML配置文件的方式更加普遍,两种配置文件的实质是同样的。
Hibernate的持久化解决方案将用户从赤裸裸的JDBC访问中释放出来,用户无需关注底层的JDBC操做,而是以面向对象的方式进行持久层操做。底 层数据链接的得到、数据访问的实现、事务控制都无需用户关心。这是一种“全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来。经过配置文件来管理底层的JDBC链接,让Hibernate解决持久化访问的实现。这种“全面解决”方案的体系结构图如图所示:
针对以上的Hibernate全面解决方案架构图:
(1)SessionFactory:这是Hibernate的关键对象,它是单个数据库映射关系通过编译后的内存镜像,它也是线程安全的。它是生成Session的工厂,自己要应用到ConnectionProvider,该对象能够在进程和集群的级别上,为那些事务之间能够重用的数据提供可选的二级缓存。
(2)Session:它是应用程序和持久存储层之间交互操做的一个单线程对象。它也是Hibernate持久化操做的关键对象,全部的持久化对象必须在Session的管理下才可以进行持久化操做。此对象的生存周期很短,其隐藏了JDBC链接,也是Transaction 的工厂。Session对象有一个一级缓存,现实执行Flush以前,全部的持久化操做的数据都在缓存中Session对象处。
(3)持久化对象:系统建立的POJO实例一旦与特定Session关联,并对应数据表的指定记录,那该对象就处于持久化状态,这一系列的对象都被称为持久化对象。程序中对持久化对象的修改,都将自动转换为持久层的修改。持久化对象彻底能够是普通的Java Beans/POJO,惟一的特殊性是它们正与Session关联着。
(4)瞬态对象和脱管对象:系统进行new关键字进行建立的Java 实例,没有Session 相关联,此时处于瞬态。瞬态实例多是在被应用程序实例化后,还没有进行持久化的对象。若是一个曾今持久化过的实例,但由于Session的关闭而转换为脱管状态。
(5)事务(Transaction): 表明一次原子操做,它具备数据库事务的概念。但它经过抽象,将应用程序从底层的具体的JDBC、JTA和CORBA事务中隔离开。在某些状况下,一个 Session 以内可能包含多个Transaction对象。虽然事务操做是可选的,可是全部的持久化操做都应该在事务管理下进行,即便是只读操做。
(6)链接提供者(ConnectionProvider):它是生成JDBC的链接的工厂,同时具有链接池的做用。他经过抽象将底层的DataSource和DriverManager隔离开。这个对象无需应用程序直接访问,仅在应用程序须要扩展时使用。
(7)事务工厂(TransactionFactory):他是生成Transaction对象实例的工厂。该对象也无需应用程序的直接访问。
Hibernate进行持久化操做离不开SessionFactory对象,这个对象是整个数据库映射关系通过编译后的内存镜像,该对象的 openSession()方法可打开Session对象。SessionFactory对想是由Configuration对象产生。
每一个Hibernate配置文件对应一个configuration对象。在极端状况下,不使用任何配置文件,也能够建立Configuration对象。
一. 建立Configuration对象
org.hibernate.cfg.Configuration实例表明一个应用程序到SQL数据库的映射配置,Configuration提供了一个buildSessionFactory()方法,该方法能够产生一个不可变的SessionFactory对象。
你能够直接实例化Configuration来获取一个实例,并为它指定一个Hibernate映射文件,若是映射文件在类加载路径中,则可使用addResource()方法来添加映射定义文件。那么如今的问题就是如何建立Configuration对象呢?
随着Hibernate 所使用的配置文件的不一样,建立Configuration对象的方式也不相同。一般有几种配置Hibernate的方式:
第一种是使用hibernate.properties文件做为配置文件。
第二种是使用hibernate.cfg.xml文件做为配置文件。
第三种是不使用任何的配置文件,以编码方式来建立Configuration对象。
请注意:Configuration对象的惟一做用就是建立SessionFactory实例,因此它才被设计成为启动期间对象,而一旦SessionFactory对象建立完成,它就被丢弃了。
1. 使用hibernateproperties做为配置文件
对于hibernate.properties做为配置文件的方式,比较适合于初学者。由于初学者每每很难记住该配置文件的格式,以及须要配置哪些属性。 在Hibernate发布包的etc路径下,提供了一个hibernate.properties文件,该文件列出了Hibernate 的全部属性。每一个配置段都给出了大体的注释,用户只要取消所需配置段的注释,就能够快速配置Hibernate和数据库的连接此处给出使用 hibernate.properties文件建立Configuration对象的方法。
//实例化configuration对象
Configuration cfg = new Configuration()
//屡次调用addResource()方法,添加映射文件
.addResource("Item.hbm.xml")
.addResource("Bid.hbm.xml");
查看hibernate.properties文件发现,该文件没有提供Hibernate映射文件的方式。所以使用 hibernate.properties文件来做为配置文件时,必须使用Configuration的.addResource()方法,使用该方法来 添加映射文件。
注意:正如 上面的代码所示,使用hibernate.properties文件配置Hibernate的属性当然简单,可是由于要手动添加映射文件,当映射文件极其 多时,这是一件很是催人泪下的事情。这也就是在实际开发中,不常使用hibernate.properties文件做为配置文件的缘由。
固然还有另外一种添加配置文件的策略,由于映射文件和持久化类是一一对应的,能够经过Configuration对象来添加持久化类,让Hibernate本身来搜索映射文件。
//实例化configuration对象
Configuration cfg = new Configuration)
//屡次调用addClass()方法,直接添加持久化类
.addClass(ppp.Item.class)
.addClass(ppp.BId.class);
2. 使用hibernate.cfg.xml做为配置文件
前面已经看到使用hibernate.properties做为配置文件的情形。由于hibernate.cfg.xml中已经添加了hibernate的映射文件,采用这种配置文件建立configuration对象实例由如下代码实现:
//实例化configuration对象
Configuration cfg = new Configuration()
//configure()方法将会负责加载hibernate.cfg.xml文件
.configure()
须要注意的是:在经过new关键字建立Configuration对象以后,不要忘记调用configure()方法。
二. hibernate.properties和hiberntae.cfg.xml文件
若是使用etc路径下的hibernate.properties文件做为配置文件的模板,修改此模板文件做为Hibernate配置文件,这种方式的确 是快速进入Hibernate开发的方法。可是对于实际开发,一般会使用hibernate.cfg.xml文件做为配置文件。
深刻对比hibernate.properties和hibernate.cfg.xml文件后看以下的hibernate.properties的一个配置属性:
//指定数据库的方言
hibernate.dialect org.hibernate.dialect.MySQLDialect
上面的一行代码是典型的Properties文件的的格式,前面的key为hibernate.dialect , 后面的value是为org.hibernate.dialect.MySQLDialect。
接下来咱们再来查看hibernate.cfg.xml文件中的相对应的配置代码:
<property name = "dialect">org.hibernate.dialect.MySQLDialect</property>
一样指定了Hibernate的Dialect 属性是org.hibernate.dialect.MySQLDialect 。对比两种格式的文件,能够发现虽然格式不一样但其实质彻底同样。