企业级框架技术与应用重点
1.SSM框架
Spring的优点:
①低侵入式设计,代码污染极低。
②IOC将对象之间的依赖关系交由框架处理,降低组件的耦合性。
③AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。
2.Spring的基础理念
1)IOC控制反转
控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(DI),还有一种方式叫“依赖查找”。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
①切换作用域
Ⅰsingleton:在spring IOC容器中默认方式(单例模式)。
Ⅱprototype:每次从容器中取出bean的时候都返回一个新的实例。
Ⅲsession:同一个Http Session共享一个Bean,不同的session使用不同的bean,该作用域仅仅适用于WebAppplicationContext环境。
Ⅳrequest:每次Http请求都会创建一个新的Bean,该作用域仅仅适用于WebAppplicationContext环境。
②依赖注入的实现方式
Ⅰsetter注入:指的就是在接受注入的类中定义一个Set方法,并在参数中定义需要注入的元素。
Ⅱ构造器注入:构造注入指的就是接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。
Ⅲ接口注入:指的就是在接口中定义要注入的信息,并通过接口完成注入。
③自动装配
Ⅰ@Autowired自动装配在Spring中定义好的对象。
Ⅱ遇到一个接口多个实现类的时候,如果要区分装载接口……
Ⅲ@Primary注解在实现类中,告知Spring框架当前类是默认实现类,如果没有特殊注解,那么就装配当前类。
Ⅳ@Qualifier(name) 注解添加在自动装配的变量上,告知Spring,需要装配的是名称为name的实现类。
2)AOP面向切面编程(Aspect Orient Programming)
AOP是一种编程思想,是OOP的一种补充。
①面向切面编程术语
切面:Aspect 通知:Adice 引入:Introduction 切点:Pointcut 连接点:join point 织入:Weaving
②Spring实现AOP拦截功能的方式
Ⅰ使用XML配置AOP。
Ⅱ使用@AspectJ注解驱动切面。
Ⅲ使用AspectJ注入切面。
Ⅳ使用ProxyFactoryBean和对应的接口实现。
3.SpringMVC
MVC:
ⅠModel:@Service注解的类
ⅡView:.jsp、.html、.htm…
ⅢController:@Controller注解的类
①核心入口文件: DispatcherServlet
②获取请求参数的方式
Ⅰ通过形参列表直接获取。
Ⅱ使用@RequestParam注解获取。
Ⅲ使用@PathVariable 获取url地址参数。
Ⅳ使用@RequestBody获取JSON。
③可以直接在形参中实例化的对象:HttpServletRequest、HttpServletResponse、HttpSession、Model、ModelMap、ModelAndView
@ResponseBody将Controller返回对象转换为Json字符串,不再返回视图,只返回Json字符串。
④SpringMVC的工作流程
ⅠDispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
ⅡHandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
ⅢHandlerExecution表示具体的Handler,其主要作用是根据url查找控制器。
ⅣHandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
ⅤHandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
ⅥHandler让具体的Controller执行。
ⅦController将具体的执行信息返回给HandlerAdapter,如ModelAndView。
ⅧHandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
ⅨDispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
Ⅹ视图解析器将解析的逻辑视图名传给DispatcherServlet。
ⅪDispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
Ⅻ最终视图呈现给用户。
4.MyBatis
MyBatis和Hibernate的优缺点:
①Hibernate的优点:
Ⅰhibernate是全自动,hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。
Ⅱ功能强大,数据库无关性好,O/R映射能力强,需要写的代码很少,开发速度很快。
Ⅲ有更好的二级缓存机制,可以使用第三方缓存。
Ⅳ数据库移植性良好。
Ⅴhibernate拥有完整的日志系统,hibernate日志系统非常健全,涉及广泛,包括sql记录、关系异常、优化警告、缓存提示、脏数据警告等。
②Hibernate的缺点:
Ⅰ学习门槛高,精通门槛更高,程序员如何设计O/R映射,在性能和对象模型之间如何取得平衡,以及怎样用好Hibernate方面需要的经验和能力都很强才行。
Ⅱhibernate的sql很多都是自动生成的,无法直接维护sql;虽然有hql查询,但功能还是不及sql强大,见到报表等变态需求时,hql查询要虚,也就是说hql查询是有局限的;hibernate虽然也支持原生sql查询,但开发模式上却与orm不同,需要转换思维,因此使用上有些不方便。总之写sql的灵活度上hibernate不及mybatis。
③Mybatis的优点:
Ⅰ易于上手和掌握,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
Ⅱsql写在xml里,便于统一管理和优化, 解除sql与程序代码的耦合。
Ⅲ提供映射标签,支持对象与数据库的orm字段关系映射。
Ⅳ 提供对象关系映射标签,支持对象关系组建维护。
Ⅴ提供xml标签,支持编写动态sql。
Ⅵ速度相对于Hibernate的速度较快。
④Mybatis的缺点:
Ⅰ关联表多时,字段多的时候,sql工作量很大。
Ⅱsql依赖于数据库,导致数据库移植性差。
Ⅲ由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
Ⅳ对象关系映射标签和字段映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。
ⅤDAO层过于简单,对象组装的工作量较大。
Ⅵ不支持级联更新、级联删除。
ⅦMybatis的日志除了基本记录功能外,其它功能薄弱很多。
Ⅷ编写动态sql时,不方便调试,尤其逻辑复杂时。
Ⅸ提供的写动态sql的xml标签功能简单,编写动态sql仍然受限,且可读性低。
MyBatis的前身是IBatis。
MyBatis关键内容:
①核心组件:SqlSessionFactoryBuilder、SqlSessionFactory(作为二级缓存的缓存对象,可以通过XML构建,可以通过代码构建)、SqlSession(获取Mapper接口,发送Sql给数据库,作为一级缓存的缓存对象,控制数据库的事务)、Sql-Mapper(可以消除SqlSession带来的功能性代码,提高代码可读性)
②映射器.xml
Ⅰ功能列表:描述映射规则、提供SQL语句、配置缓存、提供动态SQL
Ⅱcache:使用了缓存,在缓存中有需要的数据,不用从数据库中获取转而从缓存中获取,大大提高了系统性能。
ⅢresultMap:可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。
Ⅲsql:提供了动态SQL,也就是可以根据用户提供的参数,动态决定查询语句依赖的查询条件或SQL语句的内容。
Ⅳinclude:通过include标签使SQL片段达到代码复用的目的。
下方的操作是DML和DQL:insert、delete、update、select(增删改查)
③动态SQL标签:if、foreach、trim、choose when otherwise、bind、where、set
④标签属性
Ⅰtype:在resultMap定义类的完整路径。
ⅡparameterType:请求参数的数据类型。
ⅢresultType:指定返回结果的匹配类型,自动将结果转换为目标对象。
ⅣresultMap:使用结果集的方式来将结果转换为目标对象。(以上二选一)
Ⅴid:同一个文件内id不能重复,id和Mapper的命名空间(namespace)结合起来是唯一的。
⑤配置文件的配置元素
<configuration>
<!-- 使用方式:property子元素,properties文件,代码传递 -->
<properties/>
<settings/>
<typeAliases/>
<typeHandlers/>
<objectFactory/>
<plugins/>
<environments>
<environment>
<transactionManager/>
<dataSource/>
</environment>
</environments>
</configuration>
5.编程题详解
1)定义UserMapper接口
package com.ping.dao;
import com.ping.pojo.User;
public interface UserMapper {
//插入用户数据
int add(User user);
}
2)在全局配置文件mappers.xml文件中加载UserMapper接口
<mappers>
<mapper class="com.ping.dao.UserMapper"/>
</mappers>
3)编写UserMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ping.dao.UserMapper">
<insert id="add" parameterType="user">
insert into mybatis.user (id, name, gender, age, birth, address) values (#{id}, #{name}, #{gender}, #{age}, #{birth}, #{address});
</insert>
</mapper>