java 开发之 SSM 开发框架
1、什么是 SSM 开发框架
要明白什么是 SSM 开发框架?需要先弄清楚开发框架的概念。开发框架就是一套规则和写好的框架代码,它帮助我们实现了很多基础性的功能,节java培训省了程序员大量的编码工作,让程序员可以把更多精力放到系统业务逻辑处理上。例如 Spring 框架可以简化 Java 程序对数据库的访问,使用 Spring 框架访问数据库即提高了数据库的访问效率和稳健性,程序员也无需编写大量访问数据库的基础代码,只需要把访问数据库的 SQL 语句写好就可以了。
开发框架还可以提高程序的规范性和代码的重用性。例如 Spring MVC 制定了一种适用于 Web 应用程序的设计模式,这种设计模式就是 MVC。M 是 Model(中文名称是数据模型),一般是实体类,可以被多个视图共用;V 是 View(中文名称是视图),可以是 JSP、ASP 等动态页面;C 是 Controller(中文名称是控制器),用于接收视图发起的请求或返回已处理的内容到视图。程序员要使用 MVC 开发 Web 应用程序,就必须遵守 MVC 规定的设计模式。下图显示了 Spring MVC 的视图、模型、控制器交互过程。
上图中视图就是 JSP 页面,JSP 页面发送请求到 Controll 类,也就是 MVC 的控制器,Controll 类收到视图发出的请求后,会对请求进行分发,并调用相关的业务类对请求进行处理;POJO 类(实体类,也就是 MVC 的数据模型)是业务类要处理的数据对象,处理的数据对象可以由控制器返回到视图。
开发框架还可以提高程序的可扩展性和可维护性。例如我们编写的 Web 应用程序一般都需要支持数据库的开发,在 Web 应用程序中编写数据库的 SQL 访问代码,并支持 MySQL 数据库。当客户提出要支持 Oracle 数据库时,我们就需要重新编写所有访问数据库的代码,这显然不是我们想要的结果,也可以说这个 Web 应用程序的可扩展性和可维护性都很差。
如果在 Web 应用程序中使用 Mybatis 数据库开发框架,就会避免这样的情况发生。只需通过工具自动生成 Mybatis 的数据库访问类文件和映射文件就可以了。当然在实际编程中,可能没有这么简单方便,如果自己扩展了 Mybatis 的映射文件和数据库访问类文件,那么扩展的这部分可能还得需要自己编写或修改 SQL 语句。
现在我们已经知道了什么是开发框架,也知道了使用开发框架可以减少程序员的编码工作量,并极大提高了程序的规范性、可扩展性和可维护性,也间接提高了程序的质量。下面我们再来说说什么是 SSM。
SSM 是三个开发框架的集成,第一个字母 S 是指 Spring 开发框架,第二个字母 S 是指 Spring MVC 开发框架,第三个字母 M 是指 Mybatis 数据库开发框架。实际上 Spring MVC 是 Spring 框架的扩展,是属于 Spring 框架的一部分,因此应该是两个开发框架的集成。SSM 现在已经成为主流的 Web 应用程序开发框架,人脉项目也将使用 SSM 开发框架来架构系统。
2、Sping 框架
说起 Spring 框架,就不得不说 J2EE 的 EJB。年龄稍大一些的 Java 程序员对 J2EE 的 EJB 还是记忆犹新的,当时使用 EJB 开发大型应用系统非常时髦,Java 程序员无不以掌握 EJB 开发技术为自豪,程序员引以为豪的原因是 EJB 的技术太复杂了,以至于一般的 Java 程序员很难掌握这么复杂的技术。
EJB 的学习成本很高,开发效率却不高,需要编写很多重复的代码,这些问题阻止了 EJB 的继续发展。就在 EJB 技术止步不前的时候,Spring 框架在合适的时机出现了,Spring 框架和 EJB 不同,Spring 框架的学习成本非常低,它是一个轻量级的开发框架,更多强调面向对象的设计,而不是让现有的技术变得更复杂,它使用 JavaBean 替代了复杂的 EJB,并且为 JavaBean 提供了简单易用的应用配置框架。
一个 JavaBean 就是一个公共类,它可以被其它 JavaBean 类作为组件来使用,并且 JavaBea 之间的组配不需要在代码级实现,完全可以在配置层和注解层实现,Spring 会自动选择相适配的 JavaBean 来组配运行。这种自动适配机制避免了 JavaBean 与使用类之间的代码耦合,提高了程序的可扩展性和维护性。
例如类 A 要使用类 B,类 B 是类 A 的属性,如果直接在类 A 中创建类 B,当类 B 因业务需要修改时,也需要修改类 A 的代码,这种写法就是代码耦合,也可以说类 A 和类 B 属于代码耦合。
假如我们把类 B 的创建交给 Spring,Spring 通过配置文件或者通过 Java 注解来创建类 B,然后再由 Spring 把创建的类 B 实例和类 A 的实例组配起来,这样就避免了类 A 与类 B 的代码耦合。这种机制就是 Spring 框架的控制反转思想,相当于类 A 把创建类 B 权利交给了 Spring,由 Spring 来控制类 B 的创建。
Spring 框架还有一个比较重要的功能,那就是 AOP 机制。Spring 框架的 AOP 机制可以把系统中的一些通用功能抽取出来,作为 JavaBean 来使用,与此同时在系统的业务流程代码中设置调用这些 JavaBean 功能的切入点,当系统业务流程执行到切入点时,Spring 会自动把需要调用的 JavaBean 横向切入到业务流程指定的位置,AOP 的这种技术也称为“横切”技术。
例如,在一个业务系统中,当用户要进入需要操作权限的页面时,系统会先进入登录页,要求用户登录系统后再进入该页面。这样的操作权限页面会有多个,如果为每个页面都写登录业务逻辑处理代码,显然是会造成代码冗余,维护起来也非常麻烦。比较好的做法是把用户登录业务处理作为一个独立的 JavaBean,这个 JavaBean 也称为 AOP 的“切面”。然后在需要用户操作权限的业务流程页面设置“切入点”,并通过注解或配置文件将“切面”和“切入点”连接起来。当业务流程执行到“切入点”时,Spring 框架会自动把与切入点关联的“切面”切入到业务流程“切入点”所在的位置,开始执行“切面”代码,直至切面代码执行完毕,然后根据“切面”返回的结果确定是否执行后面的流程。如图是用户登录功能切入到业务流程的示意图。
Spring 框架还有一个最大的特征就是和现有的开发框架不是竞争关系,而是采用融合的方式将其它框架集成进来,充分利用其它框架的技术,为系统实现提供最优解决方案。SSM 就是 Spring 框架融合了 MVC 框架技术和 MyBatis 数据库框架技术。
Spring MVC 是 Spring 框架的一部分,Spring 框架成为 Java EE 开发主流框架后,Spring 开发小组又在 Spring 框架的基础上推出了 MVC 架构,主要用于支持 WEB 应用程序的开发。
MVC 是 Model(模型,也称为数据模型)、View(视图)、Controll(控制器)三个英文单词首字母的缩写。从 MVC 组合的三个单词也可以看出,MVC 是一种设计模型,它使用控制器将数据模型和视图进行分离,也就是将视图和数据解耦。这样的好处是后端处理的数据模型和前端视图显示的数据格式无关,实现一个数据模型可以对应多个视图以不同的方式来展现数据,当数据模型或视图发生变化时,相互之间的影响也会降低到最低。
MVC 中最重要的核心就是控制器,控制器与视图和模型相对独立,它起到一个负责分发请求和返回处理结果的作用,对请求和数据模型的处理一般由 JavaBean 负责。
MVC 虽然需要程序员多写一些额外的代码,但它强制性地将视图和数据分开所带给我们的好处是毋庸置疑的。可以设想一下,在早期的 JSP 网页中,处理数据的代码和 HTML 展现的代码是混合在一起的,它们被完全耦合到一个文件中,程序逻辑也非常混乱,对后期程序的维护和扩展都是很大的问题。
MVC 开发架构见第 4 篇:设计系统的逻辑架构、开发架构和物理架构
3、Mybatis 数据库开发框架
SSM 开发框架的 M 就是 Mybatis,Mybatis 可以帮助开发人员更加方便地操作数据库,减少开发人员在数据库操作方面的编码工作量。如图是集成到 Spring 框架的 Mybatis 技术架构图。
架构图分为两部分:虚线框外的是 Spring 框架的业务逻辑处理类,它调用 Mybatis 的 DAO 接口发起对数据库的增删改查请求;虚线框内的是 Mybatis 框架部分,这部分包括 DAO 接口、DAO 接口实现类 Mapper、POJO 实体类、SQL 执行 Executor 类、SqlSession 类。
一个用户登录业务访问数据库流程如下:用户通过 JSP 填写登录账号和密码后,JSP 会发送登录请求到指定的 Controller 类,Controller 类收到请求后,会调用登录业务类(Service 类),登录业务类调用 DAO 类的登录接口,因为该接口被 Mapper 类实现,因此 Mapper 类的登录 SQL 代码会被执行,真正执行 SQL 代码的是 Executor 类,它创建 SqlSession 对象,由 SqlSession 对象访问数据库的用户表,并将访问结果返回给 Mapper,Mapper 类会根据接口的返回类型返回数据到登录业务类。
DAO 接口声明了访问数据库的具体操作方法,在不对外暴露数据库访问细节的前提下提供数据库的增删改查方法,它不负责增删改查方法的具体实现,方法的具体实现由 Mapper 负责。这样做的好处时当数据库访问细节发生变化时,不会影响到业务逻辑类的改动。例如,当数据库访问细节发生变化时,只需修改 Mapper 代码就可以了,而 Mapper 代码是 XML 文件,因此无需重新编译整个系统。假如实现细节放在 DAO 类中,就需要修改 DAO 类的代码,修改 DAO 类的代码显然会影响到 Service 类的代码,即使没有影响,也需要重新编译整个系统。DAO 接口由 MyBaits 自动生成,无需手动编写 DAO 接口代码。
Mapper 是 DAO 的实现类,Mapper 不是 Java 类,而是一个 XML 文件,访问数据库的 SQL 语句都是在 Mapper 中实现的,这些 Mapper 代码不需要你手动编写,完全由 MyBaits 自动生成。
POJO 是实体类,主要是需要数据传递和序列化的类。例如与数据库表对应的 Java 类。POJO 类也不需要手动编写代码,POJO 类完全由 MyBaits 自动生成。
Exectuor 类是执行 SQL 语句的类,Mapper 所有的 SQL 语句都通过 Exectuor 类来执行,Exectuor 类会创建一个 SqlSession 完成对数据库的操作。
Mybatis 简单体现在开发人员建立数据库后,可以使用 Mybatis 自身提供的插件自动生成上图虚线框中的 DAO 接口类、Mapper 实现类、POJO 实体类的代码,开发人员不需要手动编写这些代码。只有在特殊 SQL 查询需求的情况下,才会扩展这些代码。下图是 Mybatis 代码自动生成原理图。
Mybatis 代码自动生成插件需要从配置文件中读取数据库的访问地址、登录账号和密码,还需要从配置文件中读取数据库的哪些表需要生成 POJO 类、DAO 接口类和 Mapper 实现类,以及这些类存储到什么位置。
原创作者:郎宏林
评论