三大框架整理笔记

社会个体14班笔记,建议坐公交、坐地铁、坐轻轨时看,程序员修炼法宝
maven 一个项目管理工具
好处

框架 半成品

ssh struts、spring、hibernate
ssm springmvc、spring、mybatis

mybatis 持久层框架 jdbc
传统jdbc弊端
硬编码 sql语句和java代码写在一起
遍历结果集,使用rs.getxxx()方法取出数据绑定到对象中

mybatis原理.png

mybatis的sql语句写进了映射文件,xxxmapper.xml
mybatis使用mapper.xml映射文件查询之后会自动把查询到的数据绑定到对象中

xml 可扩展标记语言

使用mybatis操作数据库
原生dao 只须一个mapper文件
mapper代理 需要一个接口、一个mapper文件,要求1、接口和mapper文件同名,2、接口的全限定名与mapper文件中mapper标签的namespace属性值相同,3、接口中存在一个方法与mapper文件中的增删改查的指令一一对应

当进行查询时,如果结果实体类的属性名、该属性类型与数据库字段名、该字段类型一致,mybatis才会把从数据库中查询出来的值映射到新生成的实体对象中

实体类属性名与数据库字段名不一致 起别名、map、resultmap

内置别名 java中所有自带的类型不用加全限定名,都有别名,就是类型名(首字母大小写都可以),如int、map、list

重载在mybatis中不允许的

特殊数据类型的使用
查询结果是集合的情况下,结果类型要使用泛型

查询员工编号、员工姓名,及其所在部门的部门编号、部门名称

一对一查询
1、创建包含所有属性的实体类,为了提高效率可以使用继承
2、使用resultmap

一对多查询

多对多查询

动态拼接sql
<where> 最后编译成sql中的where,会自动去掉其后第一个生效的if中的and
<if> 判断传进来的数据是否符合条件,符合就把它后的sql拼接上去,否则不拼接

sql片段
<sql>

循环

延迟加载
即程序启动不主动读取某些资源,而是启动后根据需求加载,这样做提高程序运行速率
mybatis默认关闭延迟加载
手动开启懒加载
1、查询中使用了association或者collection
2、查新结果分部写select
3、核心配置文件开启懒加载功能、关闭积极加载功能

一级缓存、二级缓存
缓存是为了提高查询效率
一级缓存 mybatis默认开启一级缓存,一级缓存范围是同一个sqlsession
如果想关闭,需要手动在mapper文件中加入flushcache=true

二级缓存 mybatis默认关闭,二级缓存范围是同一个mapper
如果想打开二级缓存,需要做如下操作
1、在核心配置文件中打开二级缓存的开关
2、需要在映射文件中加入允许缓存的开关
3、需要把查询的实体类变成可序列化
4、需要关闭sqlsession,以把查到的结果写入缓存中

注解

spring框架
优点
解耦(ioc 控制反转)
降低耦合性(注意,不是消除耦合)
耦合性 代码与代码之间的依赖关系(包括类和类之间的依赖关系、方法和方法之间的依赖关系)
依赖根据周期的不同,又分成编译期依赖和运行期依赖,解耦就是降低编译期的依赖关系,而运行的依赖谁都无法控制
实现的方式:需要有一个工厂类(在spring中,工厂类又叫核心容器,容器的作用就是管理了各种bean类)、有配置文件(记录了核心容器管理哪些bean类)
轻量级 spring需要的jar包很小
非侵入式 侵入式是指继承某个类或实现某个接口
面向切面(aop)

ioc和aop是思想,不是spring独有的,spring只是实现了这种思想

搭建spring环境

反射 根据字节码或者类名,获得类内部的信息 成员变量、方法
通过反射创建对象其核心也是调用了构造方法

new 构造方法

反射调用构造方法与new调用构造方法区别
new,编译期就把调用到的构造方法涉及到的类型信息加载到jvm中
反射,编译期不会把类型信息加载到jvm中,而是运行期

阅读软件 docx、txt、pdf

工厂模式
bean 可重用组件类

spring的作用域 scope
spring默认是单例的
singleton 单例
prototype 多例
session web相关会话
global-session 集群会话

getBean方法可以通过id名、类型信息这些方式去拿到对象

核心容器有两种组合
BeanFactory及其实现类XmlBeanFactory 容器启动不会创建对象,调用getBean才会创建
优点容器启动速率快,缺点运行需要创建对象因此运行效率慢
ApplicationContext及其实现类ClassPathXmlApplicationContext 容器一启动就创建对象
优点运行过程中由于所有对象都已经创建了只需获取,容器一启动就能发现被管理的bean的问题,缺点启动效率慢

spring生命周期
单例
创建及初始化 容器启动对象被创建及初始化
存在 容器存在对象就存在
消亡 容器消亡对象就消亡

多例
创建及初始化 容器启动对象不会被创建,调用getBean对象才被创建及初始化
存在 对象一直存在
消亡 容器销毁对象不会被销毁,由垃圾回收机制处理

依赖注入(di) 维护依赖的关系
依赖注入也不是spring独有的

依赖注入的数据类型
基本类型和String类型
bean类型
复杂类型也叫集合类型 list集合、数组、set集合通用 list、array、set标签内嵌多个value标签,value标签中写的文本就是向集合中注入的值,ref标签的bean属性可以指向要加入集合中bean对象
map集合,用map标签,entry表示一个个键值对,key属性注入键,value属性注入值、props标签也可以完成map属性注入

依赖注入的方式,spring只支持前两种
set
提供要注入的属性、提供注入属性的set方法、在核心配置文件的bean中加入property标签,这个标签中提供了name属性作为绑定注入值的标识、提供无参构造方法
构造方法
提供要注入的属性、提供注入属性的构造方法、在核心配置文件的bean中加入constructor-arg标签,这个标签中提供了name、index、type属性作为绑定注入值的标识,属性value可以注入基本类型和string类型,ref属性可以注入bean类型
接口注入

spring常用的注解
用来进行bean管理的注解
@component
@controller
@repository
@service
上述注解直接加在类上,表示把该类交给spring容器进行管理
容器不知道这些注解,所以必须对加了注解的包进行扫描
当用注解把类交给spring容器进行管理,每个bean对象都有默认的id,id是类名首字母小写和其余字母
可以在注解后(“新id名”)的方式制定bean的新id名

用来进行依赖注入的注解
@autowired 先根据类型自动注入数据,再根据修饰的属性名查找id名相同的bean对象
@qualifier 有这个注解必须配合autowired注解
@resource 不是spring中的注解,由jdk提供

用来进行生命周期管理的注解
@postdestroy
@postconstruct

用来进行作用范围管理的注解
@scope

类代替核心配置文件,作用扫描包

ssm spring整合mybatis 由spring管理mybatis中的sqlsessionfactory,spring中有一个类sqlsessionfactorybean,该类交由spring容器管理,能够代表mybatis中的sqlsessionfactory从而控制sqlsession
1、添加依赖 spring-jdbc,spring-mybatis
2、在spring的核心配置文件中管理sqlsessionfactorybean,需要再管理数据源(spring自带的数据源、c3p0数据源、dbcp数据源)、扫描mybatis核心配置文件

spring和mybatis整合后,dao层的接口映射对象交给了spring容器管理

aop 面向切面编程思想
开闭原则 针对修改关闭,针对扩展开放

有一个方法,在不想改变源代码的基础上,进行增强(扩展功能),用的是aop
代理模式
静态代理
被代理和代理都要继承或实现
动态代理
jdk自带动态代理 被代理的类至少实现一个接口 Proxy 不需要程序员写java文件,随用随创建(字节码)
第三方插件动态代理(cglib)

aop关键词
连接点 被代理对象中的所有方法
切点 判断条件
通知、增强 新增的、通用的功能
切面 切点+通知

aop中通知的类型
前置通知
后置通知
异常通知
最终通知
环绕通知

aop搭建
切点表达式依赖
核心配置文件中aop命名空间

切点表达式 execution([权限修饰符] 返回值类型 全限定名.方法名(参数类型))

addxxx add*

环绕通知 可以认为是前置通知和后置通知的组合,当加入环绕通知后,最终通知会在后置通知之前执行

配置文件中前置通知和环绕通知出现的顺序决定了他们被执行的顺序,谁在前谁就先执行

环绕通知所在的方法返回值类型需要设成Object,设置ProceedingJoinPoint参数,方法最后需要返回ProceedingJoinPoint的proceed方法,否则被切入的方法不会被执行

注解形式实现aop
被切入方法所在类和切面类都需要交给spring容器进行托管

aop事务处理
配置文件
1、设置spring的事务管理器
2、引入spring的事务管理切面
3、配置aop与spring的事务处理切面绑定

注解
1、设置spring的事务管理器
2、开启spring事务处理开关
3、在service中加注解@Transactional

springmvc
spring的一个模块,spring和springmvc整合不需要其它中间层

springmvc核心组件
前端控制器(中央控制器)、处理器映射器、处理器适配器、后端处理器、视图解析器

springmvc流程.png

springmvc运行流程
1、客户端发送请求到前端控制器
2、前端控制器让处理器映射器根据请求中的url查找对应的后端控制器(又叫处理器,程序员编写)
3、处理器映射器返回给前端控制器处理器执行链handlerexecutionchain,其中包括拦截器信息、处理器信息
4、前端控制器要求处理器适配器调用处理器
5、处理器中的核心代码执行,返回一个ModelAndView对象,其中包括数据和逻辑视图名
6、处理器适配器接收到ModelAndView对象并把它返回到前端控制器
7、前端控制器接收后继续把ModelAndView送到视图解析器中解析
8、视图解析器根据ModelAndView中的逻辑视图名生成物理视图,发送给前端控制器
9、前端控制器接收物理视图把它返回给客户端
10、客户端渲染视图

前端控制器是整个框架的核心,所有的请求响应都是通过前端控制器与其他组件发生的,这样做避免组件和组件之间私自沟通,便于管理,降低了耦合

前端控制器,核心,发布指令控制处理器映射器、处理器适配器、视图解析器做工作
处理器映射器,解析url找到处理器
处理器适配器,执行处理器
处理器,程序写的代码
视图解析器,根据逻辑视图名生成物理视图

ModelAndView
setViewName() 设置逻辑视图名
addObject() request数据共享
构造方法,参数设置逻辑视图名

处理器映射器
非注解
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

注解
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

处理器适配器
非注解
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

注解
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

不同种类的处理器映射器和处理器适配器可以同时配置

视图解析器
org.springframework.web.servlet.view.InternalResourceViewResolver

@requestmapping设置访问路径

视图解析器中逻辑视图名前缀和后缀配置

后端控制器中方法的返回值类型
modelandview
数据、视图

String
方法返回的值会认为是页面的逻辑视图名
转发 forward:路径名
重定向 redirect:路径名

void

controller方法可以写的参数
request
response
session
model/modelmap

int、String、Date、实体类型

自定义转换器配置步骤
1、把org.springframework.context.support.ConversionServiceFactoryBean交给spring容器管理,起id=csfb
2、csfb中配置属性converters,这个属性可以以集合的形式配置多个转换器
3、写自定义转换器类实现Converter接口,书写转换的核心代码,把这个自定义类交给上述csfb进行管理
4、mvc:annotation-driven中的适配器支持自定义转换器,因此配置csfb的id到此处的conversion-service的属性中

pojo 一个简单的java类
vo 从视图向controller提交数据用于接收数据实体类
po 跟数据库交互传递数据用的实体类

当controller中的方法有实体类作为参数时,执行该方法会传递一个实体类对象,也会把这个实体类对象存到request域中做数据共享,键名是该类首字母小写,其余字母不变

注解@modelattribute
1、可以修饰参数,为controller方法中传进来的实体类对象存到request中起键名
2、可以修饰方法,该方法不用带@requestmapping,当调用与该方法同在一个controller的带注解@requestmapping的方法时,会自动调用该方法,该方法的返回值就存到request中

自定义全局异常处理
1、自定义异常类
2、创建一个类实现HandlerExceptionResolver接口,重写resolveException方法
3、把该类交给spring容器管理

数据校验
1、hibernate 提供了数据校验的规则,需要依赖hibernate的jar包
2、springmvc提供了与第三方工具确定的规则相整合的工厂类,需要把这个工厂类交给spring容器管理
3、有些公用的验证结果文本可以提取,并交给上述工厂类管理

分组校验
创建分组接口,所谓的一组,就是一个接口,这个接口不需要做特殊处理

文件上传
1、粘贴依赖io.jar fileupload.jar
2、修改表单格式,表单提交方式
3、在spring容器中配置springmvc的文件解析器
4、文件名要求

'{"":1,"":""}'
@requestbody 根据json格式字符串生成java对象
@responsebody 根据java对象返回json格式的js对象

application/json

restful风格 表现层状态转化
1、参数写进地址中 xxx/123
2、操作同一个资源不用写多个方法,根据请求方式判断,get 查询,post 增加,put 修改,delete 删除

restful风格路径会对静态资源html、css、js、图片,需要配置<mvc:resources location="/js/" mapping="/js/**"/>

拦截器
程序运行记录、未登录拦截、授权

整合ssm框架
1、所有配置信息都写到springmvc.xml
pom文件
web.xml配置前端控制器,扫描整个项目的核心配置文件springmvc.xml
在springmvc.xml文件中配置映射器、适配器、视图解析器、扫描注解所在包、sqlsessionfactorybean这个Spring提供的sqlsessionfactory管理类、数据源、扫描mybatis核心配置文件、扫描映射文件

2、spring-mybatis.xml和springmvc.xml
spring-mybatis负责整合spring与mybatis,springmvc负责几个组件,web.xml需要读取它们

springboot
主启动类 内置服务器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343