Java框架
jerry
2021-03-24
Java框架学习
Maven(黑马)
MyBatis(黑马)
Spring(尚硅谷)
SpringMVC
Maven介绍
Maven是一个项目管理工具
内容
POM(Project Object Model), 项目对象模型
标准集合
Project Lifecycle, 项目生命周期
Dependency Management System, 依赖管理系统, 用来运行定义在生命周期阶
段(phase)中插件(plugin)目标(goal)的逻辑
作用
引用各种jar包
执行文件内所有单元测试
将代码即时编译
打包项目
优势
打包出来的项目较传统工程占用空间小
依赖管理
Maven工程对jar包的管理工程
Maven一键构建
指的是从编译, 测试, 运行, 打包, 安装 , 部署整个过程都交给maven管理, 这个过程
称为构建
Maven规范化构建流程
清理→编译→测试→报告→打包→部署
可在cmd里项目目录下执行 mvn tomcat:run 直接运行
Maven安装
下载
配置环境变量
仓库种类以及其之间各种关系
maven通过 jar包坐标查找
本地仓库
, 没有再联网查找
中央仓库
, 找不到则报错
公司开发中为了方便会创建自己的一个仓库, 即
远程仓库
(私服), 本地仓库在一个局
域网内可直接下载远程仓库的jar包, 若没有远程仓库会从中央仓库下载jar包
Maven标准目录结构
指定本地仓库位置
settings.xml里添加
<localRepository>[目录]</localRepository>
src/main/java
核心代码部分
src/main/resources
配置文件部分
src/test/java
测试代码部分
src/test/resources
测试配置文件
src/main/webapp
页面资源, js, css, 图片等等
maven常用命令
mvn compile
编译
mvn clean
删除编译好的文件
mvn package
打包项目
mvn install
编译并打包, 把打包的项目安装到本地仓库
maven生命周期
清除项目编译信息(clean)
编译(compile)
测试(test)
打包(package)
安装(install)
发布(deploy)
默认生命周期
清理生命周期
站点生命周期
用得不多
maven概念模型
项目对象模型(POM)
依赖管理模型(Dependency)
pom.xml
项目自身信息
Build lifecycle & phases
项目运行所依赖的jar信息
项目运行环境信息
b2b
local 仓库
<modelVersion>
<artifactId>
<version>
<dependencies><dependency>
jdk, tomcat信息
jar包信息
<groupId>
<artifactId>
<version>
<scope>
IDEA集成maven插件
settings→Maven→
Maven home directory:
User settings file:
Local repository:
本地安装maven目录
maven的conf/settings路径
本地jar仓库目录
IDEA创建maven工程
使用骨架创建maven工程
maven→maven-archetype-quickstart
不使用骨架创建
创建配置文件目录resources
右键→Make derectory as → ...
需要手动补齐一些目录
不勾选Create from archetype
一般不使用骨架创建
使用骨架创建maven web工程
maven-archetype-webapp
mabatis入门
mybatis概述
mybatis环境搭建
mybatis入门案例
自定义mybatis框架
mabatis基本使用
mybatis的单表crud操作
mybatis中编写dao实现类的使用方式
mybatis主配置文件 几个标签的使用
mybatis的深入和多表
mybatis的连接池(了解,会用)
mybatis的事务控制及设计的方法(会用)
mybatis的多表关联查询
一对多
多对一
mybatis的缓存
mybatis中的加载时机(查询时机)
mybatis的缓存
mybatis的注解开发
单表CRUD
多表查询
框架概述
什么是框架
框架(Framework)是整个或部分系统的可重用设计, 是我们开发中的一套解决方案,
不同的框架解决的是不同的问题,
使用框架的好处
框架封装了很多细节, 使开发者可以使用极简的方式实现功能, 大大提高开发效率
三层架构
表现层
用于展示数据的
业务层
处理业务需求
持久层
和数据库交互的
例 : SpringMVC:MVC框架 接口: Service(业务逻辑处理)
Servlet: 控制器, 封装数据→
域对象→ JSP, 视图 → IE
JavaBean: 数据模型
例 : Mybatis 接口 : Dao
DAO: 数据访问层 DataAccess Object
解决方案
JDBC技术
Connection, PreparedStatement, ResultSet
Spring的JdbcTemplate: Spring中对jdbc的简单封装
Apache的DBUtils : 也是对jdbc的简单封装
JdbcTemplate和DBUtils都是工具类, 不是框架
mybatis是个基于java的持久层框架, 内部封装了jdbc
封装了jdbc操作的很多细节, 使开发者只需要关注sql语句本身, 使用了ORM思想实
现了结果集的封装
ORM(Object Relational Mapping)对象关系映射
维基百科 : Object-relational mapping (ORM, O/RM, and O/R mapping tool)
in computer science is a programming technique for converting data
between incompatible(不相容) type systems using object-oriented
programming languages
mybatis的jar包
mysql驱动依赖
log4j依赖(如果要日志功能)
依赖 pom.xml
配置约束
resources创建SqlMapConfig.xml 约束并配置
1.创建maven工程并导入jar包
2.创建实体类和dao的接口(User.java, IUserMapper.java)
3.创建mybatis的主配置文件SqlMapConfig.xml
4.创建映射配置文件IUserMapper.xml
创建步骤
例(目录结构) :
/src
/java
/resources
/com.example
/dao
ILearnMapper.java
ILearnMapper.xml
/pojo
Learn.java
SqlMapConfig.xml
注意(遵从则无需写dao实现类)
3.映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
4.映射配置文件的操作配置(select), id属性的取值必须使到接口的方法名
2.映射配置文件位置必须和dao接口的包结构相同
步骤
1.读取配置文件
1.创建SqlSessionFactory工厂
2.使用工厂生成SqlSession对象
2.使用SqlSession创建Dao接口的代理对象
4.执行dao中的方法
5.释放资源
resource="/"
引入的xml文件位置可以位于不同的文件夹下, 名字可以不一样
class="."
引入的xml必须与必应的接口路径, 文件名一致
/main
/Test/Test.java
例 : Spring : IoC(控制反转)和AOP(面向切面编程)
1.持久层的操作接口名称和映射文件也叫做: Mapper
3.创建Dao接口的代理对象
注解入门案例
Dao接口(不需要xml配置了)
ILearnMapper.java
设计模式分析
创建工厂mybatis使用构建者模式
生成SqlSession使用了工厂模式
构建者模式 : 把对象的细节隐藏, 是使用者直接调用方法即可拿到对象
优势 : 解耦
创建Dao接口实现类使用代理模式
优势 : 不修改源码对原有方法进行扩展
看不懂, 还没看
关于注解的自定义再解析
增, 改操作要执行SqlSession.commit()
IUserMapper(注解)
IUserMapperTest
增删查改
模糊查询
IUserMapper
测试
查询返回一行一列
IUserMapper
<properties>
用resource属性引入properties配置文件
url属性
用file协议写properties路径: file:///......
<typeAliases>
用于配置别名
<typeAlias>
type属性
指定实体类全限定类名
alias属性
指定别名(不区分大小写)
<package>
name属性
指定的包, 包下的所有类配置别名为类名
<mappers>
<
package
>
指定接口所在的包, 不再需要一个个配置了
POOOLED
UNPOOLED
JNDI
采用传统的javax.sql.DataSource规范中的连接池, mybatis有针对规范的实现
也实现javax.sql.DataSource接口, 但没有使用连接池思想
采用服务器提供的JNDI技术, 来获取DataSource对象, 不同服务器获取的
DataSource对象不一样(如果不是web或maven的war工程, 是不能使用的)
主配置文件的<dataSource>标签
type属性取值
使用unpooled配置连接池原理
看源码UnpooledDataSource类, 是直接getConnection()获取一个连接
使用pooled配置连接池原理
看源码PooledDataSource类
有一个空闲池和一个活动池, 先判断空闲池有没有连接, 没有则拿活动池里最先进来
的连接
factory.openSession(true)
创建SqlSession时设置自动提交, 就可以不用写commit()操作
一般不这么用
动态sql语句
if标签
where标签
foreach标签
多对多
注解说明
@Select
@Insert
@Update
@Delete
什么是缓存
存在与内存中的临时数据
作用
减少和数据库的交互次数, 提高执行效率
适用于缓存的数据
经常查询且不经常改变的
数据正确与否对最终结果影响不大的
不适用缓存的
经常改变的数据
数据的正确与否对最终结果影响很大(库存, 股市等)
一级缓存
二级缓存
指Mybatis中SqlSession对象的缓存. 执行查询后,查询的结果会同时存入到
SqlSession提供一块区域中。该区域的结构是一个Map。当再次查询同样的数据,
mybatis会先去sqlsession中查询是否有该数据,有的话直接拿出来用。
当SqlSession对象消失时,mybatis的一级缓存也就消失了。l
SqlSession.clearCache()
触发清空一级缓存
当调用SqlSession的修改, 添加, 删除, commit(), close()等方法时, 就会清空一级缓
冲
IUserMapper.xml
<mapper>的name属性
Dao接口全限定类名
属性
id : 方法名
resultType : 要保存的返回值类类型
测试类
SqlMapConfig.xml
IUserMapper.xml
paramType : 参数的类型
IUserMapper.java
Mybatis中参数深入
使用实体类的包装对象作为查询条件
OGNL表达式
Object-Graph Navigation Language(对象 图 导航 语言)
写法上把get省略了
类中的写法: user.getUsername()
OGNL表达式写法: user.usrname
例
Mybatis中返回值深入
调整实体类属性名后报错
原因 : java属性名与表列名不一致
增和改方法
改正"xxx=#{属性名}"里的属性名即可
查
方法一: 要select的属性起别名
方法二: 配置查询的列名和实体类的对应关系
<resultMap>
执行效率慢点, 但开发效率高
还没看, 应该是讲的实现原理
mybatis映射文件的sql深入
根据实体类的不同取值, 使用不同的查询条件
例
避免在查询后加一个永远为真的语句, 是sql语句看起来更整洁
例
例
遍历集合元素, 设置元素间的分隔符和首位字符串
<resultMap>
<collection>
<id>
<result>
property属性
ofType属性
集合映射, collection里添加元素 的<id>, <result>
指定集合里的元素名(别名)
java里的属性名(集合名)
说明
用于实现一对多, 多对多的关系
mybatis实现延迟加载
一对一
一对多
补充
JNDI概述和原理
JNDI(Java Naming and Directory Interface,Java命名和目录接口), SUN公司推出
的一套规范, 属于javaEE技术之一. 目的是模仿windows系统中的注册表, 在服务器
中注册数据源
JNDI搭建maven的war工程
JNDI数据源的使用
延迟加载与立即加载
延迟加载
在真正使用数据时才发起查询, 不用的时候不查询
立即加载
不管用不用, 一调用方法, 马上发起查询
问题
在查询用户时,用户下的账户信息应该是,什么时候使用,就什么时候查询的。
在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来。
主配置文件SqlMapConfig.xml设置
指Mybatis中SqlSessionFactory对象的缓存, 同一个SqlSessionFactory创建的
SqlSession共享其缓存
使用步骤
1.让Mybatis框架支持二级缓存(SqlMapConfig.xml中配置)
2.让当前的映射文件支持二级缓存(IUserMapper.xml中配置)
3.让当前的操作支持二级缓存(<select>标签中配置)
什么是二级缓存
什么是一级缓存
实现新增
更新
查询
删除
@Result
实现结果集封装
@Results
可以和@Result一起使用, 封装多个结果集
@One
实现一对一结果集封装
@Many
实现一对多结果集封装
@SelectProvider
实现动态SQL映射
用注解建立实体类属性与数据表列名对应关系
例
@Result属性
column: 数据库表的列名
property: 实体类属性
@Results属性
id: 提供唯一标志, 让别的方法可以直接引用
value: 设置所有@Result
引用:
@ResultMap
(value = {"userMap"})
注解开发一对一查询配置
例
注解开发一对多查询配置
例
注解开发开启二级缓存
@
CacheNamespace
(blocking = false)
maven使用常见问题
Servlet工程jar包冲突
原因 : maven自带了Tomcat, jsp等jar包, 与用户pom.xml导入的jar包冲突
解决 : 在pom.xml里给jar包设置作用域
<scope>
provided
</scope>
导入的jar包只在编译,测试时起作用(使用插件中自带的jar包)
<scope>
test
</scope>
让该jar包只在测试时起作用
运行环境修改
<scope>
compile
</scope>
默认选项, 该jar一直其作用
<scope>
runtime
</scope>
只在测试, 运行时其作用
例: JDBC驱动包
例: Junit
例: servlet-api
maven高级应用
maven工程拆分与聚合的思想
私服(远程仓库)(了解)
同时导入不同版本的相同jar包(pom.xml)
解决1 : 声明优先原则. 谁先声明, 就可以优先进入到项目
解决2 : 路径近者优先原则。直接依赖路径比传递依赖路径近,那么最终项目进入的
jar包会是路径近的直接依赖
解决3(推荐) : 直接排除法. 当我们要排除某个jar包下依赖包,在配置exclusions标
签的时候,内部可以不写版本号。因为此时依赖包使用的版本和默认和本jar包一
样。
其他
不要老是自己写依赖, 把一些常用的框架依赖保存起来(Idea可以放live template设
置项里)
注意: 导入不同版本jar包时(该包底下可能有很多jar包依赖于它), 项目可能会出问题
pom文件内标签
复制要锁定的jar包依赖放在
<dependencyManagement>
标签里
maven工程是可以分父子依赖关系的。凡是依赖别的项目后,拿到的别的项目的依
赖包,都属于传递依赖。
锁住jar包版本坐标
maven的拆分思想
maven把一个完整的项目,分成不同的独立模块,这些模块都有各自独立的坐标。
哪个地方需要其中某个模块,就直接引用该模块的坐标即可。
maven的聚合思想
把拆分零散的模块聚合到一起编写一个完整的项目
maven父子工程的创建
父工程: 只需要有一个pom.xml就可以了
子工程: 父工程下New一个Module, pom文件会有<parent>标签, 父工程pom会
多一个<modules>标签
工程和模块区别
工程和模块都不等于完整的项目, 一个完整的项目看的是代码, 代码完整, 就可以说
是一个完整的额项目
工程只能使用自己内部资源, 可以和其他工程和模块建立关联关系
模块不是独立的, 模块属于子工程, 所有父工程的资源都可以使用
子模块之间原本没有关系, 可以通过<dependency>标签相互引用(平级直接的引用
叫依赖)
父子工程的三种启动方式
maven父子工程
传递依赖下的包能否使用
实际开发中, 不能用就再导入就好
<scope>作用域
使用maven的Tomcat插件
使用本地Tomcat
Maven→工程/模块 Plugins→tomcatx:run
Eidt Configuration→Tomcat Service→......
安装
进入nexus的bin目录执行: nexus.bat install
遇到的问题
start失败
在nexus的lib目录下添加:
javax.activation-1.2.0.jar
jaxb-api-2.3.0.jar
jaxb-core-2.3.0.jar
jaxb-impl-2.3.0.jar
启动
nexus.bat start
访问
http://http://localhost:8081/nexus
默认登录名密码: admin, admin123
私服的应用
1.配置 maven 环境,并修改 settings.xml
安装和启动
2.配置项目 pom.xml
上传步骤
3.上传jar包 tomcat:deploy
jar包会发布到snapshots仓库, deploy是tomcat生命周期的最后一站, 所有本地仓
库也会有
下载jar包配置
settings.xml
安装第三方jar包
安装第三方jar包到本地仓库
安装第三方jar包到私服
Spring概述
Spring是什么
Spring的两大核心
IOC容器
Aop
JdbcTemplate
事务操作
Spring5新特性
Spring是开源的轻量级JavaEE框架
Spring可以解决企业应用开发的复杂性
IOC
Aop
Inversion of Control
, 控制反转, 把创建对象过程交给Spring进行管理
Aspect Oriented Programming
, 面向切面编程, 不修改源代码进行功能增强
Spring特点
1.方便解耦, 简化开发
2.Aop变成支持
3.方便程序测试
4.方便和其他框架整合
5.降低API使用难度
6.方便进行事务操作
Spring入门案例
下载
Artifacts→Release→org.springframwork.spring
导入Spring5相关jar包(Core核心)
Beans
Core
Context
Expression
创建Spring配置文件, 配置创建对象
xxx.xml
测试(后面不会这么用)
IOC容器底层原理
什么是IOC
IOC接口(BeanFactory)
IOC操作Bean管理(基于xml)
IOC操作Bean管理(基于注解)
把创建对象和对象之间的调用过程交给Spring进行管理
使用IOC目的
降低耦合度
xml解析
工厂模式
反射
用工厂类创建对象, 目的: 把耦合度降低到最低限度
1.xml配置文件, 配置创建的对象
2.有service类和dao类, 创建工厂类
ioC过程
耦合度进一步降低, 例: 如果Dao路径变了, 只需该xml配置文件
用到
ioC思想基于ioC容器完成, ioC容器底层就是对象工厂
Spring提供ioC容器实现两种方式(两个接口)
BeanFactory
ioC容器基本实现, 是Spring内部的使用接口, 不提供开发人员进行使用
ApplicationContext
BeanFactory接口的子接口, 提供强大的功能, 一般有开发人员进行使用
加载配置文件时不会创建对象, 获取对象时才会创建对象
加载配置文件时就会把在配置文件中的对象创建
实现类
什么是Bean管理
Bean管理指的是两个操作: Spring创建对象, Spring注入属性
创建对象
<
bean
id="user" class="com.atguigu.spring.User"></
bean
>
*id属性
唯一标识
*class属性
类全路径(包类路径)
<bean标签属性>
创建对象时, 默认是执行无参构造方法完成对象创建
基于xml方式注入属性
DI: <dependency injectiion>依赖注入, 就是注入属性
1.使用set方法进行注入
2.有参构造注入
注入方式
2.在spring配置文件配置对象创建, 配置属性注入
1.创建类, 对应的setter方法
1.创建类, 对应有参数构造方法
2.在spring配置文件中配置
p空间注入(了解)
使用p名称空间注入, 可以简化基于xml配置方式
步骤
1.添加p名称空间在配置文件中
2.进行属性注入, 在bean标签里面进行操作
注入空值和特殊符号
用<null/>标签设置属性空值
特殊符号
用<>进行转义,带特殊符号内容写到CDATA
注入外部bean属性
1.创建service和dao对象
2.在配置文件中完成外部bean注入
注入内部bean和级联赋值
在实体类中表示一对多关系
注入集合类型属性
注入数组类型属性
注入List集合类型属性
注入Map集合类型属性
注入Set集合类型属性
在集合里设置对象类型值
注入集合分类
把集合注入部分提取出来
例
例
要引入名称空间util
例
bean管理
工厂bean
bean的作用域
bean的生命周期
Spring有两种类型bean
普通bean: 在配置文件中定义bean类型就是返回类型
工厂bean(FactoryBean): 在配置文件中定义bean类型可以和返回类型不一样
创建工厂bean
1.创建一个类作为工厂bean, 实现接口FactoryBean
2.实现接口方法, 在实现的方法中定义返回的bean类型
什么是bean的作用域
在Spring里, 设置在创建的对象是单实例或多实例
默认bean是单实例
设置单实例还是多实例
scope属性值
singleton(默认值), 单实例
prototype多实例
singleton和prototype区别
singleton, 加载spring配置文件时就会创建对象
prototype, 调用getBean方法时才会创建多实例对象
其他: request, session, 把对象放到这两个域中(基本不用)
生命周期: 从对象创建到对象销毁的过程
1.通过构造器
创建bean实例
(无参数构造)
2.
设置属性值
(调用setter方法)
4.
调用初始化方法
(需要进行配置)
7.容器关闭时,
调用bean的销毁方法
(需要配置销毁方法)
步骤
init-method="初始化方法名()", <bean>的属性值, 初始化方法写在bean类里
context.close(), 手动销毁bean实例, 销毁方法才会调用,
destroy-method="销毁方法名"
6.获取创建bean实例对象
bean的后置处理器(生命周期)
3.把bean实例传递给bean后置处理器的方法 postProcessBeforeInitialization
5.把bean实例传递给bean后置处理器的方法 postProcessAfterInitialization
配置后置处理器(会自动为当前文件下的bean对象添加后置处理器)
创建后置处理器类, 实现BeanPostProcessor接口的方法
bean管理xml方式
xml自动装配
什么是xml自动装配
根据指定装配规则(属性名称或属性类型), Spring自动将匹配的属性值进行注入
自动装配过程
autowire
属性(bean标签)
byName: 根据属性名称注入, 注入值bean的id值和属性名称一样
byType: 根据属性类型注入
外部属性文件
直接配置数据库信息
配置Driud连接池
引入Driud连接池依赖jar包
引入外部属性文件配置数据库连接池
什么是注解
1.注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)
3.使用注解目的:简化 xml配置。
2.注解作用在类上面, 方法上面, 属性上面
创建对象注解
@Component
@Service
@Controller
@Repository
四个注解功能是一样的, 习惯不同注解放到不同层中
基于注解实现对象创建
步骤
1.引入aop依赖
2.开启组件扫描
3.创建类, 在类上面添加注解
组件扫描
属性
use-default-filters
false(默认): 不适用默认filter, 自己配置filter
true: 使用默认filter
<context:include-filter>
例
设置扫描那些内容(要能看懂)
<context:exclude-filter>
设置不扫描那些内容
基于注解方式注入属性
@AutoWired
@Qualifier
@Resource
根据属性类型进行自动装配
根据属性名称进行注入
可以根据类型注入, 可以根据名称注入
@Value
注入普通类型属性
在service和dao添加创建对象注解
在service注入对象, 在service类添加dao属性, 在属性上面使用注解
使用
例
使用
和@AutoWired一起使用
例
完全注解实现(了解)
创建配置类, 替代xml配置文件
编写测试类
说明: 实际开发一般用Springboot实现
概念
什么是AOP
Aspect Oriented Programming,
面向切面编程, 利用 AOP可以对业务逻辑的各
个部分进行隔离,从而使业务逻辑各部分之间的
耦合度降低
,提高程序的可重用
性,同时提高了开发的效率。
通俗描述: 不用修改源代码, 扩展新的功能
Aop底层原理
Aop操作
Aop操作术语
Aop底层使用动态代理
有接口的情况, 使用JDK动态代理
没有接口的情况, 使用CGLIB动态代理
创建子类的代理对象, 增强类的方法
创建接口实现类的代理对象, 增强类的方法
JDK动态代理
调用newProxyInstance方法
方法的三个参数
类加载器
增强方法所在的类, 这个类实现的接口, 支持多个接口
实现接口InvocationHandler, 创建代理对象, 写增强方法
例
连接点
切入点
通知(增强)
切面
在一个类里哪些方法可以被增强, 这些方法称为连接点
实际真正被增强的方法, 称为切入点
实际增强的逻辑部分称为通知
通知有多种类型
前置通知
后置通知
环绕通知
异常通知
最终通知
是动作, 把通知应用到切入点过程
准备工作
AspectJ注解
AspectJ配置文件(了解)
Spring框架一般都是基于AspectJ实现AOP操作
什么是AspectJ
Aspect不是Spring组成部分,独立 AOP框架,一般把AspectJ和Spring框架一起
使用,进行AOP操作
基于AspectJ实现AOP操作
基于xml配置文件实现
基于注解方式实现(使用)
引入AOP相关依赖
切入点表达式
作用: 知道要对哪个类里面的哪个方法进行增强
语法结构
execution
([权限修饰符] [返回类型] [类全路径] [方法名])
例
步骤
1.创建类, 在类里定义方法
2.创建增强类, 创建方法, 让不同的方法定义不同的通知类型
3.进行通知的配置
1.在spring配置文件(或配置类)中 开启注解扫描
2.使用注解创建User和UserProxy对象
3.在增强类上添加注解@Aspect
4.在spring配置文件中开启生成代理对象
4.配置不同类型通知
在增强类里配置不同通知注解
相同切入点抽取
设置增强类优先级
有多个增强类对同一个方法进行增强, 在增强类上面添加注解
@Order(数字类型
值)
,数字类型值越小优先级越高
步骤
创建两个类,增强类和被增强类,创建方法
在spring配置文件中创建两个类对象
在spring配置文件中配置切入点
完全注解开发(了解)
概念和准备
什么是JdbcTemplate
Spring框架对JDBC进行封装, 使用JdbcTemplate方便对数据库操作
准备工作
1.引入相关jar包
2.在 spring 配置文件配置数据库连接池
3.配置 JdbcTemplate 对象,注入 DataSource
4.创建 service 类,创建 dao 类,在 dao 注入 jdbcTemplate 对象
JdbcTemplate操作数据库
添加功能
修改删除功能
查询功能
批量操作
3.测试类
调用 JdbcTemplate 对象里面
update 方法
实现添加操作
1.对应数据库创建实体类
2.编写 service 和 dao
在 dao 进行数据库添加操作
例
查询返回某个值
查询返回对象
查询返回集合
jdbcTemplate
.update()
jdbcTemplate.
queryForObject()
jdbcTemplate.
queryForObject()
jdbcTemplate.
query
()
batchUpdate
(String sql, List<Object[]> batchArgs)
批量添加, 例
批量修改, 例(操作和批量添加一样)
批量删除(操作和批量添加一样)
什么是事务
事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所
有操作都失败
事务概念
事务四大特性(ACID)
原子性
一致性
隔离性
持久性
Spring事务管理介绍
事务添加到 Service 层(业务逻辑层)
在 Spring 进行事务管理操作
编程式事务管理(一般不用)
声明式事务管理(使用)
在 Spring 进行
声明式事务管理, 底层使用AOP
基于注解方式(使用)
基于xml配置文件方式
Spring 事务管理 API
PlatformTransactionManager接口, 代表事务管理器,这个接口针对不同的框架提
供不同的实现类
注解声明式事务管理
1.在 spring 配置文件
配置事务管理器
2.在 spring 配置文件,
开启事务注解
在 spring 配置文件引入名称空间 tx
开启事务注解
3.在 service 类上面
添加事务注解
@Transactional
,这个注解添加到类上面,也可以添加方法上面
配置
@Transactional参数配置
propagation(传播行为)
事务传播行为有7种
isolation(事务隔离级别)
timeout(超时时间)
readOnly(是否只读)
rollbackFor(回滚)
noRollbackFor(不回滚)
例 : @Transactional(propagation = Propagation.REQUIRED)
事务传播行为 : 多事务方法直接进行调用,这个过程中事务 是如何进行管理的
三个读问题
脏读: 一个未提交事务读取到另一个未提交事务的数据
不可重复度: 一个未提交事务读取到另一提交事务修改数据
幻读: 一个未提交事务读取到另一提交事务添加数据
解决:通过设置事务隔离级别,解决读问题
例 : @Transactional(isolation = Isolation.REPEATABLE_READ)
四个隔离级别
mysql默认REPEATABLE READ
事务需要在一定时间内进行提交,如果不提交进行回滚
默认值是 -1 ,设置时间以秒单位进行计算
读:查询操作,写:添加修改删除操作
默认值 false: 表示可以查询,可以添加修改删除操作
true: 只能查询
设置出现哪些异常进行事务回滚
设置出现哪些异常不进行事务回滚
XML声明式事务管理
步骤
1.配置事务管理器
2.配置通知
3.配置切入点和切面
完全注解声明式事务管理
创建配置类,使用配置类替代 xml 配置文件
Spring5框架新功能
1.整个 Spring5 框架的代码基于 Java8,运行时兼容 JDK9,许多不建议使用的类和
方法在代码库中删除
2.Spring 5.0 框架自带了通用的日志封装
Spring5 已经移除 Log4jConfigListener,官方建议使用 Log4j2
Spring5 框架整合 Log4j2
1.引入 jar 包
2.创建log4j2.xml(名字是固定的)配置文件
使用
3.Spring5 框架核心容器支持@Nullable 注解
@Nullable 注解可以使用在方法上面,属性上面,参数上面,表示方法返回可以为
空,属性值可以为空,参数值可以为空
4.Spring5 核心容器支持函数式风格 GenericApplicationContext(了解)
函数式风格创建对象
5.Spring5 支持整合 JUnit5
整合 JUnit4
1.引入 Spring 相关针对测试依赖
2.创建测试类,使用注解方式完成
整合 JUnit5
引入 JUnit5 的 jar 包
创建测试类,使用注解完成
使用一个复合注解替代上面两个注解完成整合
Webflux
SpringWebflux 介绍
是 Spring5 添加新的模块,用于 web 开发的,功能和 SpringMVC 类似的,
Webflux 使用当前一种比较流程响应式编程出现的框架。
为了更好地理解Webflux, 先去看SpringMVC, SpringBoot, Maven, Java8新特性
再看这个
三层架构和 MVC
三层架构
表现层(SpringMVC)
业务层(spring)
持久层(MyBatis)
MVC模型
Model(模型)
View(视图)
Cotroller(控制器)
JavaBean
JSP
Servlet
SpringMVC 是什么
SpringMVC 概述
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级
Web 框架,
SpringMVC 已经成为目前最主流的 MVC 框架之一
通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接
口。同时它还支持RESTful 编程风格的请求
SpringMVC优势
清晰的角色划分
前端控制器(DispatcherServlet)
请求到处理器映射(HandlerMapping)
处理器适配器(HandlerAdapter)
视图解析器(ViewResolver)
处理器或页面控制器(Controller)
验证器( Validator)
命令对象(Command 请求参数绑定到的对象就叫命令对象)
表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。
SpringMVC 和 Struts2 的优略分析
共同点
它们都是表现层框架,都是基于 MVC 模型编写的。
它们的底层都离不开原始 ServletAPI。
它们处理请求的机制都是一个核心控制器。
区别
Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创
建一个动作类。所以 Spring MVC 会稍微比 Struts2 快些。
Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便
Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率
并没有比 JSTL 提升,尤其是 struts2 的表单标签,远没有 html 执行效率高。
SpringMVC入门案例
1.创建Web工程, 引入开发的jar包
pom.xml
2.
配置核心的控制器(配置
DispatcherServlet
)
1.web.xml
2.编写springmvc.xml的配置文件
3.部署Tomcat服务器
搭建开发环境
代码编写
编写index.jsp和HelloController控制器类
HelloController
流程
流程总结
遇到的问题
index.jsp
在WEB-INF目录下创建pages文件夹,编写success.jsp的成功页面
success.jsp
启动Tomcat服务器,进行测试
涉及的组件
作用:
用于建立请求 URL 和处理请求方法之间的对应关系。
RequestMapping 注解
出现位置
类上
请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需
要以/开头。
目的是为了使我们的 URL 可以按照模块化管理:
方法上
请求 URL 的第二级访问目录。
属性
value
指定请求的URL, 和path属性作用一样
method
指定请求的方式
params
指定限制请求参数的条件
它支持简单的表达式。要求请求参数的 key 和 value 必须和
配置的一模一样
headers
于指定限制请求消息头的条件
使用实例
控制器代码
jsp代码
在 jsp 中第二种写法时,不要在访问 URL 前面加/,否则无法找到资源。
使用: method=RequestMethod.POST
例
请求参数的绑定
path
指定请求路径的url
请求参数的绑定说明
绑定机制
表单提交的数据都是k=v格式的 username=haha&password=123
SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进
行绑定
要求
支持的数据类型
基本数据类型和字符串类型
实体类型(JavaBean)
集合数据类型(List、map集合等)
提交表单的name和JavaBean中的属性名称需要一致
如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:
对象.属性 例如:address.name
JSP页面编写方式:list[0].属性
提交表单的name和参数的名称是相同的(区分大小写)
请求参数绑定实体类型
例
控制器类
jsp页面
pojo类中包含集合类型参数
jsp代码
请求参数乱码问题
解决: 在 web.xml 中配置一个过滤器
遇到的问题: 还是乱码
自定义类型转换器
1.定义一个类,实现 Converter 接口,该接口有两个泛型。
使用步骤
2.在 spring 配置文件中配置类型转换器
3.在 annotation-driven 标签中引用配置的类型转换服务
在控制器中使用原生的ServletAPI对象
只需要在控制器的方法参数定义
HttpServletRequest
和
HttpServletResponse
对
象
特殊情况
常用注解
RequestParam
RequestBody
PathVariable
RequestHeader
CookieValue
ModelAttribute
SessionAttribute
作用
属性
把请求中指定名称的参数给控制器中的形参赋值
value
required
url请求参数中的名称
请求参数中是否必须提供此参数. 默认值: true, 表示必须提供,如果不提供将报错。
作用
用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。
get 请求方式不适用。
属性
required
是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果
取值为 false,get 请求得到是 null。
示例
控制器
jsp代码
作用
属性
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位
符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL
的一个重要标志。
value
required
用于指定 url 中占位符名称
是否必须提供占位符
例
jsp代码
控制器程序
其他
restful风格
请求路径一样,可以根据不同的请求方式去执行后台的不同方法
作用
获取指定请求头的值
属性
value
请求头的名称
实际开发中一般不怎么用
作用
用于把指定 cookie 名称的值传入控制器方法参数。
属性
value
required
指定 cookie 的名称。
是否必须有此 cookie。
例
作用
属性
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没
有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
value
用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的
key。
应用场景
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对
象原来的数据。
带返回值例
控制器类
jsp代码
不带返回值例
作用
属性
用于多次执行控制器方法间的参数共享。
value
type
用于指定存入的属性名称
用于指定存入的数据类型。
例
控制器代码
jsp代码
相应结果和结果视图
返回值分类
转发和重定向
ResponseBody响应json数据
字符串
void
ModelAndView
forward转发
Redirect重定向
Servlet 原始 API(request和response) 可以作为控制器中方法的参数
ModelAndView 是 SpringMVC 提供的一个对象,该对象也可以用作控制器方法
的返回值。
例
控制器代码
jsp代码
两个方法
addObject()
setViewName()
设置的对象可以用EL表达式获取: ${requestScope.attributeName}
设置逻辑视图名称, 视图解析器会根据名称前往指定视图
例
注意
使用
forward
, 路径必须写成实际视图 url,不能写逻辑视图
相当于“request.getRequestDispatcher("
url
").forward(request,response)”。
使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
在controller方法String返回值里使用 forward:
在controller方法String返回值里使用 redirect:
例
相当于“response.sendRedirect(url)”。注意,如果是重定向到 jsp 页面,则
jsp 页面不能写在 WEB-INF 目录中,否则无法找到
过滤静态资源
DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、
css、js)也会被拦截到,从而不能被使用
解决: 要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置
mvc:resources
标签配置不过滤
location元素表示webapp目录下的包下的所有文件
mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b
遇到的问题 : 没能取消拦截
发送ajax请求
响应json格式数据
SpringMVC 实现文件上传
SpringMVC传统方式文件上传
1.导入文件上传的jar包
3.编写文件上传的JSP页面
4.编写文件上传的Controller控制器
解决: 又时没导好包...put into WEB-INF
2.配置文件解析器对象
SpringMVC跨服务器方式文件上传
1.导入开发需要的jar包
遇到的问题
1.修改jmx port后访问不了tomcat了, 改回来也不行
2.编写 jsp 页面
3.编写控制器
异常处理思路
SpringMVC的异常处理
Controller调用service,service调用dao,异常都是向上抛出的,最终有
DispatcherServlet找异常处理器进行异常的处理
SpringMVC的异常处理
自定义异常类
自定义异常处理器
配置异常处理器
解决: web目录需要在Project Structure→Facets 里设置
2.上传文件抛UniformInterfaceException,
解决: 还没解决, 感觉是路径的问题
jsp页面
SpringMVC 中的拦截器
拦截器与过滤器区别
拦截器的概述
1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
2. 拦截器是SpringMVC框架独有的。
3. 过滤器配置了/*,可以拦截任何资源。
4. 拦截器只会对控制器中的方法进行拦截。
拦截器也是AOP思想的一种实现方式
想要自定义拦截器,需要实现
HandlerInterceptor接口
SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。
可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被
拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
自定义拦截器步骤
1.创建类,实现HandlerInterceptor接口,重写需要的方法
2.在springmvc.xml中配置拦截器类
HandlerInterceptor接口中的方法
preHandle
方法是controller方法执行前拦截的方法
1. 可以使用request或者response跳转到指定的页面
2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方
法。
3. return false不放行,不会执行controller中的方法。
postHandle
是controller方法执行后执行的方法,在JSP视图执行前。
1. 可以使用request或者response跳转到指定的页面
2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
afterCompletion
方法是在JSP执行后执行
request或者response不能再跳转页面了
什么是mybatis
官网英文原文 : MyBatis is a first class persistence(坚持不懈) framework with
support for custom SQL, stored procedures and advanced mappings.
MyBatis eliminates almost all of the JDBC code and manual setting of
parameters and retrieval of results. MyBatis can use simple XML or
Annotations for configuration and map primitives, Map interfaces and Java
POJOs (Plain Old Java Objects) to database records.
ssm整合
一, 搭建整合环境
1.整合说明
2.整合的思路
1. 先搭建整合的环境
2. 先把Spring的配置搭建完成
3. 再使用Spring整合SpringMVC框架
4. 最后使用Spring整合MyBatis框架
SSM整合可以使用多种方式,这里选择XML + 注解的方式
3.创建数据库和表结构
4.创建maven的工程
1. 创建ssm_parent父工程(打包方式选择pom,必须的)
2. 创建ssm_web子模块(打包方式是war包)
3. 创建ssm_service子模块(打包方式是jar包)
4. 创建ssm_dao子模块(打包方式是jar包)
5. 创建ssm_domain子模块(打包方式是jar包)
6. web依赖于service,service依赖于dao,dao依赖于domain
7. 在ssm_parent的pom.xml文件中引入坐标依赖
二, Spring框架代码的编写
1.搭建和测试SpringMVC的开发环境
8. 部署ssm_web的项目,只要把ssm_web项目加入到tomcat服务器中即可
5.编写实体类,在ssm_domain项目中编写
6.编写dao接口
7.编写service接口和实现类
在ssm_web项目中
创建applicationContext.xml的配置文件
在ssm_web项目中编写测试方法,进行测试
1.搭建和测试Spring的开发环境
1.在web.xml中配置DispatcherServlet前端控制器
注意
作用域是provided、test的依赖,继承下来都是无效的,需要在子模块的pom.xml
中重新导入
@ResultMapping的设置请求路径的属性是path, 不是value
3.创建springmvc.xml的配置文件,编写配置文件
三, Spring整合SpringMVC的框架
2.Spring整合SpringMVC的框架
4.测试SpringMVC的框架搭建是否成功
2.在web.xml中配置DispatcherServlet过滤器解决中文乱码
目的:在controller中能成功的调用service对象中的方法。
在web.xml中配置ContextLoaderListener监听器, 在项目启动的时候,就去加载
applicationContext.xml的配置文件
在controller中注入service对象,调用service对象的方法进行测试
四, Spring整合MyBatis框架
1.搭建和测试MyBatis的环境
在web项目中编写SqlMapConfig.xml的配置文件,编写核心配置文件
在AccountDao接口的方法上添加注解,编写SQL语句
编写测试的方法
目的:把SqlMapConfig.xml配置文件中的内容配置到applicationContext.xml配
置文件中
2.Spring整合MyBatis框架
在AccountDao接口中添加@Repository注解
在service中注入dao对象,进行测试
配置Spring的声明式事务管理
Spring 接管 MyBatis 的 Session 工厂
测试整合结果
SpringBoot
Spring Boot入门
Spring Boot配置
Spring Boot与Web开发
Spring Boot与数据访问
Spring Boot启动配置原理
Spring Boot自定义starters
Spring Boot与缓存
会用到Redis
Spring Boot与消息
Spring Boot与检索
Spring Boot与安全
Spring Boot与分布式
Spring Boot与开发热部署
Spring Boot与监控管理
运维方面的工作
入门案例
1.maven导入依赖
pom.xml
2.编写主程序
HelloApplication.java
3.编写Controller测试
HelloCotroller.java
4.打包成jar包(maven package)
cmd 执行 java -jar xx.jar
场景启动器
spring-boot-starter-web
spring boot将功能场景抽取出来, 做成一个个starter, 在项目里引入相关场景所有
依赖都会导入进来
spring-boot-starter-test
例如
官方列出来的starter(启动器)
IDEA可以使用Spring Initializer快速创建Spring Boot项目
resources目录
static
: 保存所有静态资源
template
: 保存所有模板页面(Spring Boot默人jar包使用嵌入式的Tomcat, 默认
不支持JSP页面); 可以使用模板引擎(freemarker, thymeleaf)
application.properties
: 应用默认配置文件
遇到的问题
主程序好像要和controller包在同一个包路径才能正常使用web模块
配置文件
application.properties
或
application.yaml
(名称是固定的)
YAML以数据为中心比json, xml更适合做配置文件
@ConfigurationProperties
(
prefix
= "person")
告诉Spring Boot将本类的属性和配置文件中相关配置进行绑定
配置文件appilcation.yaml
JavaBean
配置文件依赖
@Value(${person.last-name})
配置文件注入属性
@ConfigurationProperties和@Value的使用
@Value(#{18*2})
如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果专门编写了一个javaBean来和配置文件进行映射,就直接使用
@ConfigurationProperties;
@ConfigurationProperties和@Value获取值区别
配置文件占位符
随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
占位符获取之前配置的值,如果没有可以是用:指定默认值
Profile
多Profile文件
主配置文件名可以是: application-{profile}.properties/yaml
默认使用application.properties
激活指定profile
在配置文件中指定(application-dev.properties)
spring.prop.active=dev
yaml支持多文档块
用三个横杆"---"分割不同文档块
application.yaml
命令行方式
--spring.profiles.active=dev
配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文
件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
优先级由高到底
,
高优先级的配置会覆盖低优先级的配置
SpringBoot会从这四个位置全部加载主配置文件;
互补配置
可以通过spring.config.location来改变默认的配置文件位置
外部配置文件加载优先级
参考官方文档
自动配置
原理
SpringBoot启动的时候加载主配置类,开启了自动配置功能
@EnableAutoConfiguration
@EnableAutoConfiguration
作用: 利用AutoConfigurationImportSelector.class给容器中导入一些组件
扫描所有jar包类路径下 META‐INF/spring.factories把扫描到的这些文件的内容包
装成properties对象,从properties中获取到EnableAutoConfiguration.class类
(类名)对应的值,然后把他们添加在容器中, 用他们来做自动配置
精髓
1.SpringBoot启动会加载大量的自动配置类
2.看我们需要的功能有没有SpringBoot默认写好的自动配置类;
3.再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就
不需要再来配置了)
4.给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就
可以在配置文件中指定这些属性的值;
@Conditional派生注解
@Conditional作用
必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有
内容才生效
作用
可以通过在application.properties启用
debug=true
属性;来让控制台打印自动
配置报告
Spring Boot与日志
在系统中使用SLF4j
遗留问题
SpringBoot日志关系
前言
还没感受到要使用日志的场景, 视频里没说为什么要用日志, 不是很懂在说什么, 没
兴趣, 先跳过。 按以前的经验是项目实际运行时过程会出现bug需要回头翻看输出,
所以才需要日志
Spring Initializer快速创建需要手动设置根目录, 资源路径(或者选择加入
springmvc模块), 加入maven框架(即使已经有pom.xml文件)
2.SpringBoot对静态资源的映射规则
引入thymeleaf
视频是里把web资源放在resource里了, 没有引入springmvc的Web文件夹
SpringBoot推荐的Thymeleaf;
语法更简单,功能更强大
3.Thymeleaf模板引擎
模板引擎: JSP、Velocity、Freemarker、Thymeleaf
maven依赖
Thymeleaf使用
把HTML页面放在classpath:/templates/,thymeleaf就能自动渲染
导入thymeleaf的名称空间
<html lang="en"
xmlns:th="http://www.thymeleaf.org"
>
使用thymeleaf语法
success.html
java代码
语法规则
属性优先级
官方文档
表达式语法
${...}
变量表达式
获取变量值; OGNL;
1, 获取对象属性, 调用方法
2, 使用内置的基本对象
Established locale country:
<
span
th:text
="
${#locale.country}
"
>US</
span
>.
3, 内置的一些工具对象
*{...}
选择表达式
#{...}
获取国际化内容
@{...}
定义url
eg.
4.SpringMVC配置
没看懂
全面接管SpringMVC
没看懂
实践
静态资源文件放在resources/static/asserts/里(Thymeleaf)
默认访问resources/public/index.html, 通过配置Controller让其访问resources/
templates/index.html (Thymeleaf模板引擎才是这样的)
@RequestMapping("/", "/index.html")
也可通过WebMvcConfigurerAdapter配置类实现
国际化
2.编写国际化配置文件,抽取页面需要显示的国际化消息
3.SpringBoot自动配置好了管理国际化资源文件的组件
4.去页面获取国际化的值
1.在配置文件 application.properties 填写国际化文件的相对路径,表示读取
LocaleConfig.java
5.点击链接切换国际化
html
登录
开发期间模板引擎页面修改以后,要实时生效
禁用模板引擎的缓存
既保留了所有的自动配置,也能用我们扩展的配置;
编写一个配置类(
@Configuration
),继承
WebMvcConfigurerAdapter
类;
不能标注@EnableWebMvc
在配置类中添加@EnableWebMvc即可
自动配置
6.RestfulCRUD
默认访问首页
拦截器登录检查
拦截器LoginHandlerInterceptor.java
注册拦截器
登录Controller
Resful风格员工增删查改
7.SpringBoot错误处理机制
返回一个默认的错误页面
浏览器
其他客户端
响应一个json数据
原理
定制错误响应
给容器中添加了以下组件
可以参照ErrorMvcAutoConfiguration, 错误处理的自动配置
DefaultErrorAttributes
BasicErrorController
ErrorPageCustomizer
DefaultErrorViewResolver
还沒看
沒看懂, 好像视频里的和最新版本有点不一样
8.配置嵌入式Servlet容器
方式一 : 修改Servlet容器的相关配置
修改和server有关的配置(ServerProperties类)
方式二
Spring Boot 1.x : 实现EmbeddedServletContainerCustomizer接口:嵌入式的
Servlet容器的定制器;来修改Servlet容器的配置
Spring Boot 2.x : 实现WebServerFactoryCustomizer接口
1.简介
5.修改SpringBoot的默认配置
1.SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的
(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果
有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;
2.在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
3.在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置
在配置类里编写xxxCustomizer, 重写里面的方法
9.使用外置的Servlet容器
定制Servlet相关配置
注册Servlet三大组件【Servlet、Filter、Listener】
ServletRegistrationBean
FilterRegistrationBean
ServletListenerRegistrationBea
SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的
web应用,没有web.xml文件
SpringBoot自动注册SpringMVC的前端控制器,
在DispatcherServletAutoConfiguration中
切换其他嵌入式Servlet容器
Jetty(适合长时间连接)
Undertow(不支持jsp)
Tomcat(默认)
pom.xml
pom.xml
嵌入式Servlet容器自动配置原理
嵌入式Servlet容器启动原理
还没看
还没看
还没看
Docker
简介
Docker常用命令操作
核心概念
安装Docker
安装linux虚拟机(不需要, 我有服务器)
在linux上安装docker
镜像操作
容器操作
安装MySQL示例
检查内核版本,必须是3.10及以上
uname ‐r
安装docker
yum install docker
启动docker
systemctl start docker
docker ‐v
开机启动docker
systemctl enable docker
停止docker
systemctl stop docker
查看docker版本
检索 : docker search 关键字
拉取 : docker pull 镜像名:tag
:tag是可选的,tag表示标签,多为软件的版本,默认是latest
可以去docker hub上检索镜像的详细信息
列表 : docker images
查看所有本地镜像
删除 : docker rmi image-id
删除指定的本地镜像
搜索镜像
docker search tomcat
拉取镜像
docker pull tomcat
根据镜像启动容器
docker run ‐‐name mytomcat ‐d tomcat:latest
docker ps
查看容器
停止运行中的容器
docker stop 容器的id
docker ps ‐a
运行中的容器
所有的容器
启动容器
docker start 容器id
删除一个容器
docker rm 容器id
启动一个做了端口映射的tomcat
docker run ‐d ‐p 8888:8080 tomcat
‐d:后台运行
‐p: 将主机的端口映射到容器的一个端口 主机端口:容器内部的端口
其他
关闭linux的防火墙
service firewalld status ;查看防火墙状态
service firewalld stop:关闭防火墙
查看容器的日志
docker logs container‐name/container‐id
更多命令
--name : 自定义容器名, 可以不写
-d : 后台运行
参考不同镜像的启动文档
遇到的问题
报"docker: invalid reference format" : 复制过来的"_"或"-"格式不对
服务器端口映射设置报错
JDBC
整合Druid数据源
整合MyBatis
整合SpringData JPA
pom.xml
遇到的问题
pom导包报红, 又是复制过来的"-"格式的问题
引入starter
– spring-boot-starter-jdbc
配置application.yml
高级配置:使用druid数据源
– 引入druid
– 配置属性
配置druid数据源监控
引入mybatis-starter
– mybatis-spring-boot-starter
注解模式
配置文件模式
测试
@Mapper
在每个Mapper接口上添加
@MapperScan("包路径")
扫描包下的所有Mapper, 在主类上添加(建议使用)
遇到的问题
mapper接口用@Autowried是null
maven用阿里云仓库有些新的依赖没有
yml文件定义的password要加单引号!!!被这个问题卡了两天, 单引号会转义特殊字
符, 但连接mysql没有特殊字符也要用单引号
遇到的问题
实体类@Table(name="表名"), 表名报红, 要添加DataBase, 然后Assign Data
Sources
实体类doGet参数名是java里定义的属性名, 不是@Column的name属性
编写一个实体类(bean)和数据表进行映射
@Entity
//告诉JPA这是一个实体类(和数据表映射的类)
@Table
(name =
"users"
)
//@Table来指定和哪个数据表对
应;如果省略默认表名就是user;
@Id
//这是一个主键
@GeneratedValue
(strategy =
GenerationType.
IDENTITY
)
//自增主键
@Column
(name =
"username"
)
//这是和数据表对应的一个
列
编写一个Dao接口来操作实体类对应的数据表(Repository)
基本的配置JpaProperties
//继承JpaRepository来完成对数据库的操作
@Repository
public interface
UserRepository
extends
JpaRepository<User
,
Integer> {
}
执行xxxReposity.getOne(id)报错
com.fasterxml.jackson.databind.exc.InvalidDefinitionException
解决 : 在实体类添加
@JsonIgnoreProperties
({
"hibernateLazyInitializer"
,
"handler"
})
原因:Json把懒加载也作为POJO进行序列化了。
启动原理
运行流程
自动配置原理
原因 : new出来的对象中无法使用@autowired进行对象bean注入, Spring不会对
任意一个new出来的对象进行自动装配,只有这个对象也是—个在Spring中注册过
的Bean,才会获得自动装配的功能。
解决 : 不要new对象, 使用@Autowired注入对象
Created With
MindMaster