社会个体14班笔记,建议坐公交、坐地铁、坐轻轨时看,程序员修炼法宝
maven 一个项目管理工具
好处
框架 半成品
ssh struts、spring、hibernate
ssm springmvc、spring、mybatis
mybatis 持久层框架 jdbc
传统jdbc弊端
硬编码 sql语句和java代码写在一起
遍历结果集,使用rs.getxxx()方法取出数据绑定到对象中
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运行流程
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
主启动类 内置服务器