SSM
回顾:
【在视频中:】
JavaEE
-
Servlet+JSP:获取参数繁琐、返回数据麻烦、
-
DBUtil:不支持事务。
-
Dao层:负责的操作依旧很复杂
-
实体类:命名规范问题
-
JSP:杂乱
-
前端技术:HTML、CSS、JQuery、Ajax。
框架
简化以上所有的开发流程
SSM
- Spring
Spring 是一个非常强大的框架,包含20多个子模块,
Spring 底层有两个核心技术、解耦(松耦合):
1)IoC:依赖倒转
2)AOP:面向切面编程,不破坏原有代码基础上【无代码侵入】,对功能进行增强 - SpringMVC
是Spring的一个子模块。Spring Web MVC
基于MVC的web框架
核心:代替Servlet,简化Servlet的操作。 - MyBatils
持久层框架:轻量级的。
通过配置SQL语句,就可以实现数据库的访问
SpringMVC
添加SpringMVC依赖
运行过程
核心组件:
1)前端控制器:接受请求,组织剩下的三个组件完成对请求的处理,SpringMVC的大脑。
2)处理器映射器:用来维护url与处理器之间的映射关系。
3)处理器适配器:执行处理器。
4)视图解释器:渲染视图。
运行过程:
1)前端控制器,接受来自客户端的请求
2)前端控制器调用处理器映射器,根据UEL查询处理器
3)处理器映射器,返回拆寻拿到的处理器链
4)前端控制器将处理器链交给处理器适配器
5)处理器适配器准备好处理器需要的对象,执行处理器
6)处理器执行完成,返回ModeAndView
7)处理器适配器将ModeAndView返回给前端控制器
8)前端控制器将ModeAndView交给视图解析器
9)视图解析器将试图进行渲染
10)视图解析器将渲染好的视图返回给前端控制器
11)前端控制器使用Response对象,将试图返回给客户端
处理器
-
返回值
1)void2)String
返回值就是视图的名子,如果加了redirect:这是就是重定向
3)ModelAndView
数据和视图
4)对象
-
参数
1)自动注入来自客户端的参数,客户端的参数名要与服务器的参数保持一致。当两个参数的名字不一致时,可以使用注解:
注入集合
注入对象:注入对象时,需要参数名与属性名保持一致。
注入日期:
2) JavaEE对象
rquest
response
session
application
当使用response返回数据时,就不会再使用解析器了
3)SpringMVC对象
ModeAndView:将该类型放在参数中,就可以获取页面传来的数据
Mode:
重定向时,参数会拼接在路径后面
View:
注解:
1)@Controller
2)@RequestMapping
3)@RequestParam
4)@ResponseBody
Spring
Java上一代框架为SSH
Spring,Structs,Hibernate(SpringData JPA)
Spring的使用
- 添加依赖
IoC:控制反转
IoC:传统的对象,要使用new的方式进行创建,然后才能使用。
当需要使用对象时,找Spring容器要,这些对象在Spring容器创建时,由Spring通过反射、动态代理的方式进行创建。
DI:依赖注入
IoC:基于DI实现
属性的注入
1)set方法注入
注入属性时,通过调用Bean对象的set方法
2)构造方式注入
在创建对象时,调用它的有参构造
3)自动注入
使用aytowire属性,将注入方式可以设置为byType(根据类型),byName(根据名字)
4)注入不同类型的属性
1. 注入简单类型
直接设置值
2. 集合
1)数组
2)list
3)set
4)map
3. 类
1)自动注入
2)引用已经存在的Bean
3)直接创建一个Bean
Web项目中使用Spring
- 依赖
- 在Web.xml中配置
- 创建Spring配置文件
- 配置扫描的包
- 在需要放到Spring容器中的类上的注解
Spring中的问题
-
Bean对象的作用域:
-
Bean对象的生命周期
init-method:初始化方法
destory-method:销毁方法
-
循环依赖
一级缓存:存放完整的对象
二级缓存:存放不完整的对象
三级缓存:Bean工厂
三级缓存的工作过程->解决循环依赖的问题【再看看】
-
P标签
只是一种简洁的配置方式,调用set方法
AOP
AOP:面向切面编程
面向切面编程:是面向对象编程【OOP】的一种补充,可以实现在不修改原有代码情况下。对功能进行增强【无代码侵入】。
功能增强的方式有多种;
1)装饰者模式
对象的创建需要一个原始对象,原有的方法可以增强还可以扩展新的方法。
二十三种设计模式中的一种。
IO流:InputStream-字节输入流,Outputstream-输出字节流,ObjectInputStream-对象输入流,ObjectOutputStream-对象输出流
可以对原有功能进行增强,同时还可以扩展原始对象没有的功能。
2)代理模式——功能在及逆行增强时,不能修改原有功能,也不能扩展新的功能,只能增强原有功能
我们的操作都是针对代理对象,代理兑对象在调用原始对象。
静态代理:在静态代理的模式下,每一个需要增强的方法,都需要单独添加增强代码。【代理类要与原始类,实现统一同一接口】
动态代理:Java中的的动态代理有两种方式
(1)JDK的Proxy类,在代码执行的过程中,动态创建一个代理对象
(2)使用cglib库,在代码编译时,直接添加增强代码。
在动态代理之后,接口的对象,可以是一个代理对象。
动态代理的应用:
1) Mybatis:只需要写Mapper的接口,并没有编写他的实现类,Mybatis就是通过动态代理,创建Mapper接口的代理对象,
代理对象中也有调用处理器
在嗲用处理器中的invoke方法内,读取配置的SQL,执行
2)SpringAOP:
利用动态代理,完成切面的织入。
SpringAOP的概念
后置通知包括:结束通知、返回通知、异常通知。
Spring事务处理
@Transactional 可以修饰Service类,给当前类中所有的方法添加事务的支持,也可以修饰Service层的方法,只为方法添加事务的支持。
rollbackFor:抛出什么样的异常时,回滚事务。
isolation:事务的隔离级别,default(直接使用SqlSession默认的隔离界别),读未提交、读已提交、可重复读、串行化。
propagation:用来设置事务的传播机制。
底层实现还是AOP的,使用环绕通知来实现。
事务的传播机制
前三种,支持当前事务。中间三种都不支持当前事务。最后一种,是一种嵌套事务。
。。。
- 日志的打印
可以是前置,也可以是后置。
给Controller层添加打印出调用了哪个方法。 - 计算方法执行时间
- 参数验证
MyBatis
MyBitils是一个持久层的框架
使用
-
加入mybatis依赖
2. 构造配置文件
- 编写代码,通过配置文件来创建工厂
- 编写代码,通过配置文件来创建工厂
-
创建SqlSession对象
-
准备MyBatis的持久成
1)声明Mapper接口
2)配置Mapper的SQL
namespace:配置为对应的Mapper接口全名
为每一个方法配置SQL操作。 -
给SqlSeesion要Mapper层的对象
映射文件
-
mapper
namespace:对应Mapper层的接口,必须设置 -
sql配置
useGenerateKeys:true
keyColumn:设置数据表中的主键字段的名字
keyProperty:设置实体类的主键属性的名字,获取到自增主键的之会保存在这个属性中
设置查询SQL
resultType:查询结果集要映射成实体类的类型。也可以自动解析
无论方法返回的是单个的实体对象,还是一个集合,只能设置实体对象类型。也可以使用map来接受查询结果
id:
parameterType: -
#{} ${}
#{}:参数绑定 相当于?,不存在SQL注入,
只有一个见到那的参数 #{随便写}
${}:字符串的拼接,存在SQL注入
只有一个简单的类型的参数 ${value}
映射
查询结果集在默认情况下,会根据字段名字进行自动映射。
查询结果集,与实体类之间映射。
id:唯一标识,被select标签引用
type:要映射成的实体类的全名
:只用来配置主键字段的映射
:用来配置非主键字段的映射
column:查询结果集中的字段
property:被映射成的实体类的属性
高级映射
关系型数据库中,表与表之间可以存在三种关系:一对一、一对多、多对多
一对一的关系:解析成两个单项的一对一
一对多:解析成一个单项一对一,和一个单项的一对多
多对多:解析成两个单项的一对多
缓存
执行过的SQL语句,将结果保存起来,再次查询时不需要再访问数据库,直接取出上次的结果使用
检查对数据库的操作,提升效率。
-
一级缓存——作用范围为SQLsession,出了session便不会起作用
基于SqlSession的——默认是开启的。
当在一个session中执行SQL时,先查询缓存中是否有相映的数据,如果没有,这时才会调用数据库执行SQL,
如果有,这时,就会直接取缓存中的数据,不会再调用数据库了。 -
二级缓存
基于Mapper的缓存,默认时关闭的
不同的SqlSession访问同一个Mapper时,缓存都是有效的只需要在Mapper的映射文件中添加一个cache标签。
刷新算法:LRU、FIFO、SPFT【软引用】,WEAK【弱引用】。
flushInterval //刷新时间,单位为毫秒
readOnly=“true” //只读
核心配置中,可以开启和关闭缓存。
cacheEnabled
flushCache:用于增删改的操作上使用,若为true则修改时,缓存会刷新。
useCache,当为true时,缓存会被清空。
懒加载 延迟加载
在关联查询时,当使用association或者collection标签的select属性进行过关联查询时,懒加载可以将关联对象设置为延迟加载,如果用不到,则不加载,用到时,再加载。
懒加载存在的意义:为了减少对数据库的操作。
整合
方式一【JavaEE】
Spring 监听器 启动Spring容器
SpringMVC 前端控制器 先启动Spring容器,再启动SpringMVC
【整合包】 Mybatis-spring 2.0.6
MyBatis
SqlSessionFactory交给Spring容器管理。
(1)添加项目
(2)添加需要的各种包
(3)项目结构
(4)配置xml的web文件【Spring的前端控制器】
(5)配置SpringMVC+扫描controller+静态资源释放+...
(6)配置mapper.xml文件【配置连接池的相关属性+创建工厂+扫描mapper+要扫描的包的配置(service层+controller层)】
缺点:配置繁琐、包繁琐
方法二 【SpringBoot】
- 约定优于配置【解决配置繁琐的问题】
制定好约定,代替大量一样的配置,也可以单独配置 - Maven依赖
项目构造工具
构造方式
导包 依赖
编译方式
插件 - SpringBoot是一个可以快速创建基于Spring项目的工具
1)创建项目
2)添加所需依赖
3)修改配置文件
tomcat端口号:8080,http端口号:80,https端口号:443,mysql端口号3306.
上下文路径,默认为空。