SSM

Mybatis

 

一、初始MyBatis

  MyBatis是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。

  MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

  MyBatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

  框架是一个提供了可重用的公共结构的半成品。它为构建新的应用提供了极大便利。

  数据库持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

  ORM即对象/关系数据映射,也可以理解为一种数据持久化技术。

  MyBatis的基本要素包括核心对象、核心配置文件、SQL映射文件。

 

MyBatis框架的优点:

  (1)与JDBC相比,减少了50%以上的代码量

  (2)MyBatis是最简单的持久化框架,小巧并且简单易学

  (3)MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。

  (4)提供XML标签,支持编写动态SQL语句

  (5)提供映射标签,支持对象与数据库的ORM字段关系映射

 

MyBatis框架的优缺点:

  (1)SQL语句的编写工作量较大,对开发人员编写SQL语句的功底有一定要求

  (2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

 

MyBatis框架适用场合:

  MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。对性能的要求很高,或者需求变化较多的项目。

 

二、SQL映射文件

  MyBatis的SQL映射文件提供select、insert、update、delete等元素来实现SQL语句的映射。

  SQL映射文件的根节点是mapper元素,需要指定namespace来区别于其他的mapper,保证全局唯一,并且其名称必须要跟接口同名,作用是绑定DAO接口,即面向接口编程。

  resultType:

  resultType直接表示 返回 类型 ,包括基础类型和复杂数据类型


  resultMap:

  resultMap则是对外部resultMap的引用,对应resultMap的id 表示返回结果映射到 哪一个resultMap。

  他的应用场景是:数据库字段信息与对象属性不一致或者需要做复杂的联合查询以便自由控制映射结果 。


  resultType与resultMap两者的区别:

  在 MyBatis的select元素中,resultType和resultMap本质上是一样的,都是Map数据结构。但是 二者不能同时 存在。


  resultMap的自动映射级别

   MyBatis中分为三个映射级别:

    NONE:禁止自动匹配

    PARTIAL:(默认):自动匹配所有属性有内部嵌套(association,collection)的除外

    FULL:自动匹配所有  


  MyBatis的SQL语句参数入参:

  对于基础数据类型的参数数据,使用@param注解实现参数入参;复杂数据类型的参数直接入参即可。


  resultMap的association 和 collection 可以实现高级结果映射。

  association属性有:

   javaType:完整Java类名或者别名。若映射到一个JavaBean,则MyBatis通常会自行检测到其类型;

   若映射到一个HashMap,则应该明确指定JavaType,来确保所需行为。  

   property:映射数据库列的实体对象的属性。


  collection的属性有:

  ofType:完整Java类名或者别名,及集合所包含的类型。  

  property:映射数据库列的实体对象的属性。 

 

MyBatis缓存

  一级缓存:是基于PerpetualCache(MyBatis自带)的HashMap本地缓存,作用范围为session域内,但session flush 或者 close 之后,该session中所有的cache就会被清空。

  二级缓存:就是global caching,它超出session 范围之外,可以被所有SqlSession 共享,开启它只需要在MyBatis的核心配置文件(mybatis-config.xml)settings中设置即可

  一级缓存缓存的是SQL语句,二级缓存缓存的是结果对象。


三、动态SQL


  MyBatis在SQL映射文件中可以使用灵活、智能的动态SQL来实现SQL映射。

  mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:
    1. if 语句 (简单的条件判断)
    2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
    3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
    4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
    5. set (主要用于更新时)
    6. foreach (在实现 mybatis in 语句查询时特别有用)
      foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。

      ?item表示集合中每一个元素进行迭代时的别名,

      index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,

      open表示该语句以什么开始,

      separator表示在每次进行迭代之间以什么符号作为分隔符,

      close表示以什么结束,

  在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

    如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

    如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

    如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

 

Spring

?

五、Spring核心概念

  Spring是一个轻量级的企业级框架,提供了IoC容器、AOP实现、DAO/ORM支持、Web集成等功能,目标是使现有的Java EE技术更易用,并促进良好的编程习惯。

  Spring IoC就是控制反转,也被称为依赖注入(Dependency Injection, DI),是面向对象编程中的一种设计理念,用来降低程序代码之间的耦合度。

  依赖注入就是将Bean的创建以及为属性赋值的工作交给Spring容器来做,从而避免组件之间以硬编码的方式耦合在一起。

  Spring AOP就是面向切面编程(Aspect Oriented Programming, AOP),是软件编程思想发展到一定阶段的产物,是面向对象编程(Object Oriented Programming, OOP)的有益补充。

  面向切面编程,简单的说就是在不改变原程序的基础上为代码段增加新的功能,对代码段进行增强处理。它的设计思想来源于代理设计模式。

  AOP一般适用于具有横切逻辑的场合,例如访问控制、事务管理、性能检测等。

  AOP的目的是从系统中分离出切面,独立于业务逻辑实现,在程序执行时织入程序中运行。

 

  Spring AOP基本概念:

      1.切面(Aspect):一个模块化的横切逻辑(或横切关注点),可能会横切多个对象。

      2.连接点(Join Point):程序执行中的某个具体的执行点。

      3.增强处理(Advice):切面在某个特定连接点上执行的代码逻辑。

      4.切入点(Pointcut):对连接点的特征进行描述,可以使用正则表达式。增强处理和一个切入点表达式关联,并在与这个切入点匹配的某个连接点上运行。

      5.目标对象(Target object):被一个或多个切面增强的对象。

      6.AOP代理(AOP proxy):由AOP框架所创建的对象,实现执行增强处理方法等功能。

      7.织入(Weaving):将增强处理连接到应用程序中的类型或对象上的过程。

      8.增强处理类型:有前置增强、后置增强、环绕增强、异常抛出增强、最终增强等等。这些增强处理实现方式都差不多。


六、IoC和AOP使用扩展

  Spring提供了设值注入,构造注入(时效性好,灵活性差)等依赖注入方式。

  使用p命令空间可以简化属性注入的配置。

  注入不同数据类型:

    1.注入直接量(基本数据类型、字符串 )

      对于基本数据类型及其包装类、字符串,除了可以用value属性,还可以通过<value>子元素进行注入。

      如果属性值中包含了XML中的特殊字符(&、<、>、"、'),则注入时需要进行处理,通常可以采用两种方法:

      使用<![CDATA[]]>标记或把特殊字符替换为实体引用;

      XML中有5个预定义的实体引用;

     2.引用其他Bean组件

      Spring中定义的Bean可以相互引用,从而建立依赖关系,除了使用ref属性,还可以通过<ref>子元素实现。

     3.使用内部Bean

      如果一个Bean组件仅在一处需要使用,可以把它定义为内部Bean。

     4.注入集合类型的属性

      对于List或数组类型的属性,可以使用<list>标签注入。<list>标签中间可以使用<value>、<ref>等标签注入集合元素,甚至是另一个<list>标签。

      对于Set类型的属性,可以使用<set>标签注入。<set>标签中间也可以使用<value>、<ref>等标签注入集合元素。

     5.注入null和空字符串值

      可以使用<value></value>注入空字符串值,使用<numm/>注入null值。


  Spring提供的增强处理类型包括前置增强,异常抛出增强,环绕增强,最终增强等。

   异常抛出增强的特点是在目标方法抛出异常时织入增强处理。使用异常抛出增强,可以为各功能模块提供统一的、可拔插的异常处理方案。

   最终增强的特点是无论方法抛出异常还是正常退出,该增强都会得到执行,类似于异常处理机制中finally块的作用,一般用于释放资源。使用最终增强,就可以为各功能模块提供统一的、可拔插的处理方案。

   环绕增强在目标方法的前后都可以织入增强处理。环绕增强是功能最强大的增强处理,Spring把目标方法的控制权全部交给了它。

   在环绕增强处理中,可以获取或修改目标方法的参数、返回值,可以对它进行异常处理,甚至可以决定目标方法是否被执行。


  通过Schema形式将POJO的方法配置成切面,所用标签包括<aop:aspect> ,<aop:before>,<aop:returning>,<aop:around>,<aop:after-throwing>,<aop:after>等。

  用来定义Bean组件的注解包括@Component,@Qualifier以及@Resource实现。

  在Spring配置文件中使用<context:componen-scan>元素扫描包括注解的类,完成初始化。

  使用注解方式定义切面可以简化配置工作,常用注解有@Aspect,@Before,@AfterReturning,@Around,@After Throwing,@After等。

  通过在配置文件中添加<aop:aspectj-autoprxy>元素,就可以启用对于@AspectJ注解的支持。


七、MyBatis与Spring整合

MyBatis-Spring提供了SqlSessionTemplate模板类操作数据库,常用的方法有selectList()、insert()、update()等,使用getMapper(Class<T>Type)可以直接访问接口实例,能够减少错误的发生,另外可以不用写DAO的实现类。

使用MapperFactoryBean能够以配置的方式得到映射器实现,简化DAO开发。前提条件是,保证映射命名空间名和接口的名称相同,以及映射元素的id和接口方法相同。

使用MapperScannerConfigurer可以递归扫描basePackage所指定的包下的所有接口类,在Service中可以使用@Autowired或@Resource注解注入这些映射接口的Bean.


事务的四个关键属性(ACID):

 

  原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。

  一致性(consistency):“一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,其中某一个或某几个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚。

  隔离性(isolation):在应用程序实际运行过程中,事务往往是并发执行的,所以很有可能有许多事务同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程中不会互相干扰。

  持久性(durability):持久性原则要求事务执行完成后,对数据的修改永久的保存下来,不会因各种系统错误或其他意外情况而受到影响。通常情况下,事务对数据的修改应该被写入到持久化存储器中。

 

 

一个事务与其他事务隔离的程度称为隔离级别。SQL标准中规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

①读未提交:READ UNCOMMITTED

 

允许Transaction01读取Transaction02未提交的修改。

 

②读已提交:READ COMMITTED

 

要求Transaction01只能读取Transaction02已提交的修改。

 

③可重复读:REPEATABLE READ

 

确保Transaction01可以多次从一个字段中读取到相同的值,即Transaction01执行期间禁止其它事务对这个字段进行更新。

 

④串行化:SERIALIZABLE

 

确保Transaction01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。

 

 

   声明式事务的配置:

    (1)导入tx和aop命名空间。

    (2)定义事务管理器Bean,并为其注入数据源Bean。

    (3)通过<tx:advice>配置事务增强,绑定事务管理器并针对不同方法定义事务规则。

    (4)配置切面,将事务增强与方法切入点组合

  使用注解实现声明式事务处理

 

  @Transactional 注解

  1.rollbackFor属性:指定遇到时必须进行回滚的异常类型,可以为多个

  2.noRollbackFor属性:指定遇到时不回滚的异常类型,可以为多个

 

八、Spring配置补充

使用PropertyPlaceholderConfigurer可以加载属性文件,实现更灵活的配置

如果应用配置在高性能的应用服务器(如WebLogic或WebShpere等)上,更希望使用应用服务器本身提供的数据源。应用服务器的数据源使用JNDI开放调用者使用,spring专门为此提供引用JNDI资源的JndiObjectFactoryBean类。

Spring中配置Bean组件时,可以指定singleton、prototype、request、session、global session几种不同的作用域,其中singleton是默认采用的作用域类型。

Spring提供了四种自动装配类型:

  1:ByName 采用这种方式时给属性自动注入值时,会根据Bean里的setXXX中的XXX去搜寻有没有id=XXX的Bean,有的话,将其自动注入,没有的话,就表示setXXX里要装入属性没有装配值。

 

  2:ByType 采用这种方式给属性自动注入值时,会根据Bean里的setXXX中的参数类型来搜寻配置文件中的Bean定义,如果发现了一个,就自动将其注入,否则如果有0个这个属性没有被装配,如果有多个,则会抛出异常。

 

  3:constructor 这种方式的注入与ByType其实没什么区别,无非是将ByType移入到了构造函数中,这种方式下,构造函数是自动注入的,在构造对象时,会自动根据构造函数的参数类型搜寻Bean,如果有一个合适的,则成功,一个没有,则失败,有多个,则会抛出异常。

 

  4:autodetect 自动检测方式,会采用如下流程,先按照constructor方式,再按照ByType方式。

拆分Spring配置文件的拆分策略:

 

 

如果一个开发人员负责一个模块,我们采用公用配置(包含数据源、事务等)+每个系统模块一个单独配置文件(包含Dao、Service、及Web控制器)的形式。

 如果开发是按照分层进行的分工,我们采用公用配置(包含数据源、事务等)+DAO Bean配置+业务逻辑 Bean配置+Web控制器配置的形式。

拆分Spring配置文件,不仅可以分散配置文件,降低修改配置文件的难度和冲突的风险,而且更符合“分而治之”的软件工程原理。

 

九、Spring MVC体系结构和处理请求控制器

 

分层设计:

  数据访问接口:DAO层

  处理业务逻辑:Service层

  数据实体:POJO

  负责前端请求的接受并处理:Servlet

  负责前端页面展示:JSP

这种架构模式就是MVC设计模式,它是软件工程中的一种软件架构模式 。它强制性地使软件系统的输入、处理和输出分开,把软件系统分为三个基本部分:模型(Model)、视图(View)、控制器(Controller)。

JSP Model1

  当业务流程较为简单时,可以把控制器的功能交给视图来完成,这种模式称为JSP Model1。故Model1模式只有视图和模型,没有控制器(即JSP+JavaBean)。

 JSP Model2

  相比于JSP Model1,当业务流程复杂的时候,就需要把业务流程控制交给控制器来实现,JSP专注于视图的展现即可。这种模式就是JSP Model2(即JSP+Servlet+JavaBean)

区别:

1、Model1适合小型项目开发,结构简单,开发迅速。但是JSP页面相对复杂,不利于维护。

2、Model1适合大型项目开发,职责明确,而且适应变动的需求。

3、从模型上和时序图上很容易看出,Model2是在Model1的基础上,分离了控制,将业务逻辑处理分离出来。这样Model2相对来说便于维护。

 

MVC整体的处理过程:

(1)首先视图提供系统与用户交互的界面,并发送用户输入给控制器。

(2)控制器接收用户的请求,并决定应该调用哪个模型来进行处理。

(3)模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据)。

(4)控制器根据返回的处理结果,调用相应的视图格式化模型返回的数据,并通过试图呈现给用户结果。

 

MVC优缺点:

  优点:

    多视图共享一个模型,大大提高代码的可重用性。

    MVC三个模块相互独立,松耦合架构。

    控制器提高了应用程序的灵活性和可配置性。

    有利于软件工程化管理。

  缺点:

    原理复杂。

    增加了系统结构和实现的复杂性。

    视图对模型数据的低效率访问。

    不适合小型甚至中型规模的项目。

 

Spring MVC环境搭建的步骤:

(1)引入jar文件

(2)Spring MVC配置

    在web.xml中配置Servlet,定义DispatcherServlet.

    创建Spring MVC的配置文件

(3)创建Controller(处理请求的控制器)

(4)创建View

(5)部署运行

 

Spring MVC处理流程

5从接受请求到返回响应,Spring MVC框架的众多组件通力配合、各司其职,有条不紊地完成份内的工作。在整个框架中,DispatcherServlet处于核心的位置,它负责协调和组织不同组件以完成请求处理并返回响应的

工作。和大多数Web MVC框架一样,SpringMVC通过一个前端Servlet接收所有的请求,并将具体工作委托给其他组件进行处理,DispatcherServlet就是Spring MVC的前端Servlet。


1.整个过程始于客户端发出一个HTTP请求,Web应用服务器接收到这个请求,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),Web容器将该请求转交给DispatcherServlet处理。

2.DispatcherServlet接收到这个请求后,将根据请求的信息(包括URL、HTTP方法、请求报文头、请求参数、Cookie等)及HandlerMapping的配置找到处理请求的处理器( Handler)。可将HandlerMapping看成路由控制

器,将Handler看成目标主机。值得注意的是:Spring MVC中并没有定义一个Handler接口,实际上任何一个Object都可以成为请求处理器。

3.当DispatcherServlet根据HandlerMapping得到对应当前请求的Handler后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。 HandlerAdapter是Spring MVC的框架级接口,顾名思

义,HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用。

4.处理器完成业务逻辑的处理后将运回一个ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名和模型数据信息。

5.ModelAndView中包含的是“逻辑视图名”而非真正的视图对象,DispatcherServlet借由ViewResolver完成逻辑视图名到真实视图对象的解析工作。

6.当得到真实的视图对象View后,DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行视图渲染。

7.最终客户端得到的响应消息,可能是一个普通的HTML页而,也可能是一个XML或JSON串,甚至是一张图片或一个PDF文档等不同的媒体形式。


Spring MVC框架的特点:

(1)清晰的角色划分。Spring MVC在Model、View和Controller方面提供了一个非常清晰的角色划分,这三个方面真正是各司其职、各负其责。

(2)灵活的配置功能。因为Spring的核心是IoC,同样在实现MVC上,也可以把各种类当作Bean来通过XML进行配置。

(3)提供了大量的控制器接口和实现类。开发者可以使用Spring提供的控制器实现类,也可以自己实现控制器接口。

(4)真正做到与View层的实现无关。它不会强制开发者使用JSP,也可以根据项目需求使用Velocity、XSLT等技术,使用起来更加灵活。

(5)国际化支持。

(6)面向接口编程。

(7)Spring提供了Web应用开发的一整套流程,不仅仅是MVC,它们之间可以很方便地结合一起。


Spring MVC通过视图解析器来完成视图解析工作,把控制器的处理方法返回的逻辑视图名解析成一个真正的视图对象。


十、单例模式

单例模式就是系统运行期间,有且仅有一个实例。

单例模式使类在程序生命周期的任何时刻都只有一个实例,

然后,单例的构造函数是私有的,外部程序如果想要访问这个单例类的话,必须通过 GetInstance()来请求(注意是请求)得到这个单例类的实例。

它有三个必须满足的关键点:(1)一个类只有一个实例。

             (2)它必须自行创建这个实例。

             (3)它必须自行向整个系统提供这个实例。

懒汉模式:即在类加载时不创建实例,采用延迟加载的方式,在运行调用时创建实例。

饿汉模式:即在类加载的时候就完成了初始化操作,故类加载较慢,但是获取对象的速度很快。

搭建Spring MVC+Speing+JDBC的框架,需要在web.xml中装载Springde 相关配置文件,并需要配置 ContextLoaderListener。

在Spring MVC中,Servlet API可以作为处理方法的入参使用,非常简单方便。

Spring MVC需要通过<mvc:resources/>标签来实现静态资源的访问。

Spring MVC通过HandlerExceptionResolver处理程序异常,分为局部异常处理和全局异常处理。


十一、

  Spring MVC提供了对REST风格的良好支持,通过@PathVariable注解,可以将URL中的{xxx}占位符参数绑定到控制器处理方法的入参中。

  在Spring MVC中,可以使用JSP 303实现服务器端的数据验证。

  对于Spring表单标签<fm:form>,通过该标签的modelAttribute,来指定绑定的模型属性。

  在Spring MVC中,Servle API的类可以作为处理方法的入参使用,非常简单方便。

  在Spring MVC中要实现文件上传,可使用MultipartResolver来处理上传请求,通过CommonsMultipartResolver配置MultipartResolver解析器。


十二、Spring MVC扩展和SSM框架整合

@ResponseBody注解:作用是将标注该注解的处理方法的返回直接写入HTTP ResponseBody中。

解决JSON数据传递的中文乱码问题:

(1)在控制器处理方法上的@RequestMapping注解中配置produces。

(2)装配消息转换器StringHttpMessageConverter,设置字符编码为UTF-8。

解决JSON数据传递的日期格式问题:

(1)注解方式:@JSONField(format=“yyyy-MM-dd”)

(2)配置FastJson的消息转换器---FastJsonHttpMessageConverter

配置多视图解析器----ContentNegotiatingViewResolver

ContentNegotiatingViewResolver可以根据请求所要求的MIME类型决定由哪个视图解析器负责处理,即它允许以同样的内容数据来呈现不同的View。

编写自定义转换器或者使用@InitBinder装配自定义编辑器来解决数据转换和格式化问题。

 

posted @ 2017-10-10 03:52  一汀烟雨杏花寒  阅读(297)  评论(0编辑  收藏  举报