一、SSM和SSH的区别:

1、ssh(struts,spring,hibernate)SSH通常是struts做前端控制器,spring管理各层的组件,hibernate负责持久化层。

  1.1 Struts的原理:

    1.1.1 定义:

  是一个按MVC模式设计的Web层框架,相当于一个servlet。

    1.1.2 工作流程:

      ①客户端初始化一个指向Servlet容器(例如Tomcat)的请求。

      ②这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助)

      ③接着FilterDispatcher被调用,FilterDispatcher(过滤器分发器)询问ActionMapper(行为映射器)来决定这个请求是否需要调用某个Action。(FilterDispatcher是整个c的核心)

      ④如果ActionMapper决定需要调用某个Action,结果返回给FilterDispatcher,FilterDispatcher把请求的处理交给ActionProxy(行为代理器)。

      ⑤ActionProxy(行为代理器)通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。

      ⑥ActionProxy创建一个ActionInvocation(行为调用)的实例。

      ⑦ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

      ⑧一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是一个需要被表示的JSP或者FreeMarker的template(模版)。

      ⑨将处理结果返回给客户端

      

 

  1.2 hibernate的理解:

    1.2.1 定义:

  是一款免费开源的持久层框架,它对 JDBC 进行了轻量级的对象封装,将对象与数据库表建立了映射关系,使 Java 编程人员可以随心所欲地使用面向对象的编程思想操作数据库。

    1.2.2 原理:

①配置configuration对象:通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件

②创建sessionFactory、创建session对象;//config.buildSessionFactory();sessionFactory.openSession();

③启动事务;//session.beginTransaction()

④persistent operate持久化操作

⑤session.getTransaction().commit();//提交事务

⑥关闭session

⑦关闭事务

 ⑧sessionFactory

    1.2.3 hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别:

   update()和saveOrUpdate()的区别:

   ▶ update,很明显就是更新。.

    ▶   saveorupdate,从字眼上看,就是保存或更新,那hibernate如何判断究竟是执行保存呢,还是执行更新呢.其实很简单,就是判断实体的主键是否为null,如果为null,那么保存,否则更新.

  session的load()和get()的区别:

▶ 当记录不存在时候,get方法返回null,load方法产生异常; 

load方法可以返回实体的代理类,get方法则返回真是的实体类;  

load方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据,而get方法只在内部缓存中查找数据,当没有在缓存中找到合适的数据时候,则生成SQL查询数据库,返回相应的实体对象。


    1.2.4 session缓存(一级缓存):

       1.2.4.1 缓存定义:Session接口的实现中包含了一系列的集合,这些集合构成了session的缓存。

     1.2.4.2 session缓存: session缓存就是通过集合类实现的,持久化一个对象的时候,对象会被放到缓存中,即使程序中没有引用变量引用它,只要session缓存没有关闭,持久化对象仍然处于生命周期。   

     1.2.4.3 清理缓存:session能够在某些时间点上,按照缓存中对象的变化来执行相关的sql语句,来同步更新数据库,这一过程被称为清理缓存。

    1.2.4.4 作用:减少访问数据库的频率;保证数据库中相关的记录和缓存中的相应记录的同步,映射文件建立的是表和类之间的静态映射,而Session则建立表中的关系数据与运行时session缓存的对象的动态映射。

    1.2.5 二级缓存:因为session是线程不安全的,被多个线程共享时容易出现问题。所以二级缓存就是要为hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。二级缓存是独立于hibernate的软件部件,属于第三方产品,需要自己配置和启动。

      二级缓存又称为SessionFactory级的缓存。 SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。

 

2、ssm(springMVC,spring,mybatis):ssm通常是springMVC做前端控制器,spring管理各层组件,mybatis负责持久化层。

  2.1 对springMVC的理解:详情可跳转

  2.2 对spring的理解:

    2.2.1 定义:

  spring是一个开源框架(一个容器),实现了工厂模式的工厂类,这个类名为BeanFactory(接口),在程序中通常用他的子类ApplicationContext。一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架

    2.2.2 工厂模式(详情点击):

  工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,以达到提高灵活性。工厂模式分为三种。     

    简单工厂模式:创建几个产品抽象类,然后创建一个简单工厂类,最后调用。

    工厂方法模式:提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。

    抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。

    2.2.3 控制反转(IoC):

  所谓的控制反转,通俗地讲,就是把原本需要程序员自己创建和维护的一大堆bean统统交由Spring管理。专业地讲,传统的Java开发模式当中,当需要一个对象的时候,我们往往会自己创建一个对象,而在 Spring 开发模式当中,Spring 容器使用了工厂模式为我们创建了所需要的对象,我们直接调用 Spring 为我们提供的对象即可,这就是控制反转的思想。

  就是说,原本应该是我做的事情,我不做了让系统帮我做,比如我需要一个对象时要new出实例,但是现在用了IOC之后,我只需要提前配置好了xml配置,把自己需要的东西提前注入相应的容器之后,我就不用每次使用的时候都new了,只需要使用就行。

  举个例子,我每次吃饭都要买一双一次性筷子(new一个实例),‘我’对筷子的操作时“主动”去买的。这样就很麻烦。所以‘我’现在想出了一个便捷的方法。我买一双非一次性的筷子,然后把筷子放在了一个容器里面(IOC容器),我每次吃饭的时候,只需要跟这个容器发出我要筷子的请求,筷子就会自动的送到我的手里。我从一个控制者变成了一个请求者,IOC容器帮我执行了NEW的工作。

  ①Java Bean是基于Java的组件模型,由属性、方法和事件3部分组成。Bean的含义是可重复使用的Java组件。所谓组件就是一个由可以自行进行内部管理的一个或几个类所组成、外界不了解其内部信息和运行方式的群体。使用它的对象只能通过接口来操作。

    2.2.4 面向切面(AOP):

  所谓的面向切面编程,通俗地讲,它一般被用来解决一些系统交叉业务的织入,比如日志啦、事务啥的。专业地讲,AOP是面向切面编程,在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个对象。然而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事务管理,日志等公用的操作处理的过程就是面向切面编程的思想。

  如果说“对象”是一个圆柱体,其中封装的是属性和方法。那么“切面”就是将圆柱体刨开,以获得其内部信息,然后将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为“Aspect(切面)”。这个切面就是将那些于业务无关,却为业务模块所共同调用的逻辑和责任封装起来,以便减少系统的重复代码,降低模块间的耦合性,并有利于未来的可操作性和可维护性。

  AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

    2.2.5 依赖注入(DI): 

  Spring使用Javabean对象的set方法或者带参数的构造方法为我们在创建所需要的对象时,将其属性自动设置所需要的值的过程就是依赖注入。控制反转也叫依赖注入。

    2.2.6 Spring 支持哪几种 bean 的作用域:

   1)singleton:单例模式,在整个 Spring IoC 容器中,使用 singleton 定义的 Bean 将只有一个实例。

   2)prototype:原型模式,每次通过容器的 getBean 方法获取 prototype 定义的 Bean 时,都将产生一个新的 Bean 实例。

   3)request:对于每次 Http 请求,使用 request 定义的 Bean 都将产生一个新的实例,也就是说每次 Http 请求将会产生不同的 Bean 实例。只有在 Web 应用中使用 Spring 时,该作用域才有效。

   4)session:对于每次 Http Session,使用 session 定义的 Bean 都将产生一个新的实例,同样只有在 Web 应用中使用 Spring 时,该作用域才有效。

   5)globalsession:每个全局的 Http Session,使用 session 定义的 Bean 都将产生一个新的实例。通常情况下,仅在使用portlet context的时候才有效。同样地只有在Web应用中使用 Spring 时,该作用于才有效。

   但是常用的只有 singleton 和 prototype,如果没有指定 bean 的作用域,Spring 默认使用 singleton 作为作用域。

      

  2.3 mybatis和hibernate的区别:

     Hibernate:对数据库结构提供了完整的封装,实现了POJO(简单的Java类)对象与数据库表之间的映射(指两个集合之间元素相互对应的一种关系),能够自动生成并执行SQL语句。只要定义了POJO 到数据库表的映射关系,就可以通过Hibernate提供的方法完成数据库操作。掌握难度较大,书用于简单的增删改查。


 

    mybatis:通过映射配置文件,将SQL所需的参数和返回的结果字段映射到指定对象,mybatis不会自动生成sql,需要自己定义sql语句,不过更方便对sql语句进行优化。适合新手,适用于复杂的查询语句。


 

    区别:.hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。mybatis,简单、高效、灵活,但是需要自己维护sql;hibernate功能强大、全自动、适配不同数据库,但是非常复杂,灵活性稍差。

 

 3.总结

  SSH将配置文件开发用到极致。SSM将注解开发用到极致。

posted on 2020-05-24 15:43  小潘同学  阅读(170)  评论(0)    收藏  举报
-->