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注入对象