尚硅谷复习SSM

深圳尚硅谷SSM笔记

我任然在往河里撒沙子。

Spring

复习一下Spring
这里我主要复习了一下Spring的xml配置文件,AOP切面变成,IOC容器,我已经忘记底层是什么了,然后现在重学一遍有了很多新东西。

IOC

控制反转,形象的说就是我们去如果想要一套房,就需要建设房,会去搬砖、搭架子、挖地基这样就很麻烦负责了,我们只需要将这些交给专业的人,也就是说我们买一个毛坯房,只需要装修就好了,而这个毛坯房就是我们的框架结构。
ioc容器,首先我们需要在maven依赖中引入配置文件spring-context,然后再创建一个spring-config.xml的xml配置文件。
xml配置文件中,就是我们的配置项了,首先我们会使用标签开始对于我们需要的类,交给ioc容器管理,但是这里只是依赖注入使用中的里面有name和value来设置字段的值,注意这里的就是我们类方法中的set方法,它是调用setXxx来设置值的。
(ApplicationContext iocContainer = new ClassPathXmlApplicationContext(“spring-bean-04.xml”);)这就是不需要组件扫描的,直接注入到容器中
后面我们会发现这样配置很慢就有了注解的诞生,
@Controller
@Service
@Component
@Repository
@Bean(Bean注解多半是用使用再配置类中,第三方需要注入到ioc容器中的注解)
这个使用我们标记了注解没有被注入到ioc容器中,这里只是一个标记,表示这里的类需要交给容器管理,xml注解配置也是如此*(这里我有一个误区,我突然想到,补充一下,上面的依赖注入,不需要扫描组件,因为我们用的启动类,扫描了那个xml配置文件)*。需要将配置类扫描后才是真正的注入到容器中,当然这也分xml和注解方式
xml:<context:component-scan base-package=“com.atguigu”/>
注解:@ComponentScan(“com.atguigu”)
这样我们注解标注后就会被扫描到,加入到ioc容器。
这里先提一下,我们的配置类,需要使用@Configuration注解标记,表示这是要给配置类。
再一个我们后续会映入数据源对象,但是如果在配置类里面写死就是硬编码,所以使用配置类来书写

atguigu.url=jdbc:mysql://localhost:3306/studb
atguigu.driver=com.mysql.cj.jdbc.Driver
atguigu.username=root
atguigu.password=root
大概是这样吧,记不得了。
   <!-- 配置数据源 -->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${atguigu.url}"/>
        <property name="driverClassName" value="${atguigu.driver}"/>
        <property name="username" value="${atguigu.username}"/>
        <property name="password" value="${atguigu.password}"/>
    </bean>
<!-- 扫描外部配置 -->
<context:property-placeholder classpath:jdbc.properties>

将配置类扫描到其中。
还需要调用这些依赖,使用自动装配了,@Autowired,将需要的类,注入到需要使用这个类的地方就可以了。

AOP

面向切面编程无非就是4个通知,外加一个拥有四个特性的独特通知
当然首先我们要知道我们需要面向那个地方切入,所以就有了切点,也就是注解@Pointcut
然后后续写一个方法,裆通知需要使用,就调用这个方法,表示这个方法切入目标方法。
当然,我们还得要知道切入点公式(execution(* com.spring.service.impl.(…)))
前面一个 * 表示的是任意返回值类型,后面的*表示这里路径下的任意类,括号中的 … 表示类中的方法可以是任意参数。哈哈就是这样啦。
然后就是切面类需要一个注解表示这是一个切面类
@Aspect 然后 再写一个组件注解将他交给ioc容器 @Component
切面通知有
@Before 前置通知 在目标方法前执行
@AfterReturing 返回通知 目标方法不报错的情况下正确执行后执行
@AfterThrowing 异常通知,目标方法保存后执行,多在catch中
@After 后置通知 在finally中执行,是一定被执行的方法
这4个方法这里声明的目标参数方法是JoinPoint()

@Around 环绕通知 前面四个通知的结合体 一定要声明一个ProceedingJoinPoint参数,该参数就是目标方法,要执行目标方法就使用它调用proceed()方法 。这个通知一定会返回object类型,并将目标方法值返回出去

切面编程多用于日志文件 事务等。

声明式事务

声明式事务,我们需要险=先配置事务管理器
事务是防止数据库不该错误是发生错误后的一种解决方式。
使用xml配置事务:

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 导入外部属性文件 -->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!-- 配置数据源 -->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${atguigu.url}"/>
        <property name="driverClassName" value="${atguigu.driver}"/>
        <property name="username" value="${atguigu.username}"/>
        <property name="password" value="${atguigu.password}"/>
    </bean>

    <!-- 配置 JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- 装配数据源 -->
        <property name="dataSource" ref="druidDataSource"/>
    </bean
        
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       
        <!-- 事务管理器的bean只需要装配数据源,其他属性保持默认值即可 -->
        <property name="dataSource" ref="druidDataSource"/>
    </bean>  
    <!-- 开启基于注解的声明式事务功能 -->
    <!-- 使用transaction-manager属性指定当前使用是事务管理器的bean -->
    <!-- transaction-manager属性的默认值是transactionManager,如果事务管理器bean的id正好就是这个默认值,则可以省略这个属性 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
</beans>    

使用注解声明
@Transaction注解 在需要的类或方法上声明
@EnableTransactionManagement 在启动类上开启注解声明式事务

只读:@Transactional(readOnly = true)
超出时间:@Transaction(timeout = 3)
事务异常:发生什么异常就回滚==>rollbackFor = Exception.class
发生什么异常任然不回滚 ==>noRollbackFor = FileNotFoundExcetion.class

读未提交
脏读、幻读、不可重复读
读已提交
幻读、不可重复读
可重复读
不可重复读
串行化
最高隔离级别,可以避免以上所有问题。

@Transactional注解的propagation属性
	REQUIRED
		默认值:如果有事务就加入该事务,没有就自己创建一个事务,在新事务中运行
	REQUIRED_NEW
		当前方法必须工作在事务中                                 如果外侧存在事务就将事务挂起,自己创建一个新事务,新事务不影响外层事务。
	NESTED
		如果当前存在事务,则在该事务中嵌套一个新事务。如果没有,就和REQUIRED一样。
	SUPPORTS
		如果当前存在事务,则加入该事务,否则以非事务方式执行
	NOT_SUPPORTED
		以非事务方式执行,如果当前存在事务,挂起该事务
	MANDATORY
		必须在要给已有的事务中执行,否则抛出异常
	NEVER
		必须在没有事务的情况下执行,否则抛出异常

然后是SpringJunitConfig的整合单元测试,我感觉会用就好
使用xml注解的:==> 使用@SpringJunitConfig(location = “classpath:spring.xml”)
使用config配置类的: ===> 获取是使用注解配置类@SpringJunitConfig(classes = “AppConfig.class”)

日志框架就是网上自己C V ,然后改成自己的包就好了。

SpringMVC

请添加图片描述
这个图是我自己画的过滤器Filter外加DispatcherServlet也就是SpringMVC的流程。
首先我们先配置基于springmvc的配置类

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
     <!-- 扫描controller对应的包,将handler加入到ioc-->
    <context:component-scan base-package="com.atguigu.controller,com.atguigu.service" />

    <!--
       注意: 导入mvc命名空间!
       mvc:annotation-driven 是一个整合标签
                             他会导入handlerMapping和handlerAdapter
                             他会导入json数据格式转化器等等!
    -->
    <mvc:annotation-driven />
     <!-- viewResolver 不需要配置,因为我们不需要查找逻辑视图!!! -->

    <!-- 加入这个配置,SpringMVC 就会在遇到没有 @RequestMapping 的请求时放它过去 -->
    <!-- 所谓放它过去就是让这个请求去找它原本要访问的资源 -->
    <mvc:default-servlet-handler/>
</beans>

再配置DispatcherServlet的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0">
     <!-- 配置SpringMVC中负责处理请求的核心Servlet,也被称为SpringMVC的前端控制器 -->
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <!-- DispatcherServlet的全类名 -->
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 通过初始化参数指定SpringMVC配置文件位置 -->
    <init-param>
      <!-- 如果不记得contextConfigLocation配置项的名称,可以到DispatcherServlet的父类FrameworkServlet中查找 -->
      <param-name>contextConfigLocation</param-name>
      <!-- 使用classpath:说明这个路径从类路径的根目录开始才查找 -->
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <!-- 作为框架的核心组件,在启动过程中有大量的初始化操作要做,这些操作放在第一次请求时才执行非常不恰当 -->
    <!-- 我们应该将DispatcherServlet设置为随Web应用一起启动 -->
    <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <!-- 对DispatcherServlet来说,url-pattern有两种方式配置 -->
    <!-- 方式一:配置“/”,表示匹配整个Web应用范围内所有请求。这里有一个硬性规定:不能写成“/*”。
      只有这一个地方有这个特殊要求,以后我们再配置Filter还是可以正常写“/*”。 -->
    <!-- 方式二:配置“*.扩展名”,表示匹配整个Web应用范围内部分请求 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

然后还可以配置拦截器,在目标handler方法之后执行, 最后是一定执行 方法afterCompletion方法。, 记得看哦!, 首先类需要实现一个处理器拦截HandlerInterceptor这个接口。 然后里面就会有三个方法需要重写实在我们的handler调用方法之前preHandler。这个图也是springmvc中拦截器我们可以看开始我画的图,查看他的位置。

处理器


	分清各个注解功能
		@RequestParam(来源于spring)
		@Pathvariable(来源于springmvc的rful)
		@Param
	RESTFul风格注解
		@GetMapping
		@PostMapping
		@PutMapping
		@DeleteMapping
	请求和响应,JSON字符串
		@RequestBody
			请求体,参数为一个实体类,List,Map,或者为json字符串
		@ReponseBody
			响应体,返回以json字符格式返回。
统一异常处理

实体类的参数校验
引入hibernateValidator的依赖
在处理器方法获取请求参数的地方添加@Validate的注解
在实体类的属性上添加校验规则注解
没有学,感觉后面学也不难,所以觉得没必要

这里我需要对
@RequestParam(来源于spring)
@Pathvariable(来源于springmvc的rful)
@Param着重介绍一下

	@RequestParam(来源于spring)
	@RequestParam它的参数要和请求的url中携带的参数要一致,他和实体类还有数据库字段名没有关系,和url有直接关系,所以我们多用于get请求中,post的form表单提交中,多以键值对形式一一对应
	?name=fox&professtion=student
	@RequestParam("name" String username),@RequestParam("professtion",String pro);
	我们发现,这里@Request中和url请求的参数是一致的,post表单提交也是一样,form中也是一个value 对应 一个值


	@Pathvariable(来源于springmvc的rful)
	@Pathvariable注解它的参数使用我们写的路径如@RequestMapping(/get/{stuid})
	@Pathvariable("stuid") Integer studentId
	需要的是@Pathvariable的参数要和请求路径@RequestMapping中的一致,和后续参数可以不一致。


	@Param
	这个注解是Mybatis中的注解,它的作用就是数据库字段了,就是让数据库字段和我们方法参数一致的。
	LIst<User> getUserByNameAndAge(@Param("name") String username,@Param("age") Integer setAge)
	,记住他是对应的SQL字段,不是实体类字段,切记切记不要混淆

统一异常处理这个我想先鸽一下,主要是维哥教的那种和我前面学的不一样,我要理解理解。



跨域
使用注解CrossOrigin
或者使用xml文件配置

<mvc:cors>
  <mvc:mapping path="/**"
    allowed-origins="*"
    allowed-methods="GET, PUT"
    allowed-headers="header1, header2, header3"
    exposed-headers="header1, header2" 
    allow-credentials="true"
    />

  <mvc:mapping path="/**"
    allowed-origins="https://domain1.com" />

</mvc:cors>

ContextLoaderListter上下文配置文件监听
这个只是提了一下,没有学,但是我理解的意思就是,他会创建一个IOC容器,但是DispatcherServlet也会创建一个IOC容器,这样就会有俩个容器,Context创建的是父容器,Dis创建的是子容器,Con多以持久层配置注入其中,Dis是以Mvc的配置文件加载,子容器中优先使用自己的配置,没有也可使用父容器的配置。就是这样的。因为有大量的配置文件需要加载,就是用两个容器,不知道对不对,但是我感觉大部分对了。

请求转发和重定向
forward:/www.prince.com
转发值请求一次,不改变原有的路径,可以在请求域中共享数据,单次请求效率更快
redirect:/www.prince.com
需要请求两次,改变原有路径,不可以在请求域中共享数据,效率没有转发快。

MyBatis

长话单说咯!!!
映射配置文件
对应关系
一个接口
Mapper接口里是我们定义要增删改查的各个方法
一个对应的映射xml文件
使用namespace属性Mapper接口文件使用全限定类名对应,标签中的方法名和接口的方法名一一对应。
对应标签有
insert
select
update
delete

方法名和标签的id属性对应
参数对应
单个参数
简单类型(#{任意字符串})
实体类类型#{属性名}
多个参数
需要使用@Param注解,一定要使用,对应SQL表的字段名
简单类型#{名字}
实体类型#{实体类名 。属性名}
返回值类型对应
只有select查询语句才需要返回结果集
resultType自动映射
如果是简单数据类型,世界可以使用重命名的简单字段 如 org.lang包下的integer 直接使用int
如果是类类型,中只是简单的属性,那么可以使用类的全类名
如果是List,需要返回多行数据,但是类中也是基本数据类型,也是使用这个类的全类名
resultMap手动映射
属性
id属性
这个使用配应用的名字就是用这个
type属性
返回的结果集类型
子标签
主键
普通字段
assosiation标签
一对一映射
意思类似于Person.class中含有Student.class
collection标签
一对多映射
就是说Person.class中含有Llist
动态SQL







Spring整合Mybatis配置
数据源DataSouce
SqlSessionFactoryBean
作用:创建sqlsession对象执行SQL
关键配置
注入datasouce
注册别名包扫描
指定配置文件的路径
驼峰映射
分页插件配置
MapperScannerConfigurer
作用:扫描持久层接口,创建持久层的代理对象
关键配置:basePackage属性扫描的接口所处的包的包名
分页插件
注入依赖
添加配置
开启分页PageHelaper.start()
执行原本为分页的查询
创建PageInfo对象封装分页结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值