Spring+Springmvc+Mybatis知识点合集

1、Spring的两大特性及其含义


IOC:即控制反转,另外一种说法叫DI(依赖注入),就是创建对象的控制权被反转到了Spring框架上,我们需要某个对象的时候,不需要我们自己去new出来,而是直接从Spring容器里面获取。
IOC和DI就是从不同的角度上描述了同一件事情,依赖注入是从应用程序的角度描述,即应用程序依赖IOC容器创建并且注入它想要的资源。而控制反转是从IOC 容器的角度描述,即IOC容器控制应用程序,由IoC容器反向的向应用程序注入应用程序所要的外部资源。

AOP:面向切面编程,主张将程序中相同的业务逻辑进行横向隔离,并将重复的业务逻辑抽离到一个独立的模块中,以达到提高程序可重用性和开发效率的目的。即把编程把一些功能横切进原有的程序里面而不改变底层代码。如访问控制,事物管理、性能监控、日记记录等功能

2、Spring的自动装配机制


在Spring中,使用@autowired来配置自动装载模式,对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互写作的对象引用赋予各个对象。
(1)在Spirng框架xml配置中共有5中自动装配:
①no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean
②byName:通过bean的名称进行自动装配,如果一个bean的property与另一个bean的name相同,就进行自动装配
③byType:通过参数的数据类型进行自动装配
④constructor:利用构造函数进行装配,并且构造函数的参数通过biType进行装配
⑤autodetect:自动探测,如果有构造方法,通过construct的方式自动装配,否则使用byType的方式自动装配

(2)基于注解的自动装配方式
使用@Autowired、@Resouce注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置。在启动Spring ioc时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowirded、@Resource或@Inject注解时,就会在Ioc容器自动查找需要的bean,并装配给该对象的属性。
在使用@Autowired时,首先在容器中查询对应的类型的bean:
如果查询结果刚好是一个,就将该bean装配给@Autowire指定的数据
如果查询结果刚好不止一个,那么@Autowired会根据名称来查找
如果上述查找的结果为空,那么会抛出异常,解决方法时候,使用required=false

@Autowired可用于:构造函数、成员变量、Setter方法
注:@Autowired和@Resource之间的区别:
(1)@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在
(2)@Resouce默认是按照名称来装配注入的,只有当找不到名称匹配的bean才会按照类型和来装配注入。

3、Spring的核心容器层组成


Spring IoC容器中有大量的bean,因此提供了大量的API接口来管理bean,两大重要的核心接口BeanFactory 和 ApplicationContext接口。
BeanFactory接口:是Spring容器中最基本的接口,它的实现机制采用的是Java的工厂模式,在创建Bean实例时,通过加载xml文件信息获取相应的bean实例。
BeanFactory beanfactory = new XmlBeanFactory(new FileSystemResource(“D:/bean.xml”));
该接口包含了大量的Api方法,用于管理Bean ,如getBean();

ApplicationContext接口:是BeanFactory接口的子接口,继承了原有的API功能外,还增加了国际化、资源访问、事件传播等功能。
ClassPathXmlApplicationContext :从类路径加载配置文件,实例化ApplicationContext接口
FileSystemXmlApplicationContext: 从文件系统加载配置文件,实例化ApplicationContext接口

ApplicationContext applicationcontext = new ClassPathXmlApplicationContext("classpath:bean1.xml");
ApplicationContext applicationcontext = new FileSystemXmlApplicationContext("C:\\Users\\1786\\applicationContext.xml");

4、Spring Bean的作用域


1、singleton 单例模式。在单例模式下,Spring容器只会存在一个共享的Bean实例,所有对Bean的请求,只要请求的id(或name)与Bean的定义相匹配,就会返回Bean的同一个实例。
2、prototype 原型模式。每次从容器中请求Bean时,都会产生一个新的实例
3、request 每一个HTTP请求都会有自己的Bean实例,该作用域只能在基于Web的Spring ApplicationContext中使用。
4、session 每一个HttpSession请求都会有自己的Bean实例,该实例只能在基于Web的Spring ApplicationContext中使用。
5、global session 限定一个Bean的作用域为Web应用(HttpSession)的生命周期,只有在web应用中使用Spring时,该作用域才有效。

5、SpringMVC执行原理


1、用户通过浏览器向服务器发送请求,被DispatcherServlet前端控制器拦截请求
2、前端控制器调用处理器映射器,根据URL找到相应的处理器Handler,生成handler对象一并返回给前端控制器
3、前端控制器通过返回信息选择合适的处理器适配器。
4、处理器适配器调用并执行Handler,并且返回Model和view视图至前端控制器
5、前端控制器再调用视图解析器根据解析规则解析画面,传回给前端控制器视图view对象
6、前端控制器将页面渲染展示给用户,响应结果

6、SpringMVC三大组件


前端总控制器 DispatcherServlet:请求与任务分派->框架已提供,需要手动配置
请求处理器Handler:处理具体的请求任务->根据项目需求,程序员自行开发
处理器映射器HandlerMapping:完成用户请求的URL找到Handler(处理器)
处理器适配器HandlerAdapter: 根据找到的处理器并它并返回执行结果
视图解析器viewResovler:根据条件解析出最终显示数据的视图

处理映射器 HandlerMapping、处理器适配器 HandlerAdapter、视图解析器viewResovler,称为SpringMVC的三大组件。

7、SpringMVC框架的组合注解


DispatcherServlet 是SpringMVC的流程控制中心,也称为SpringMvc的前端控制器,它可以拦截客户端的请求。拦截客户端请求之后,DispatcherServlet会根据具体规则将请求交给其他组件处理。所有请求都要经过DispatcherServlet进行转发处理,这样就降低了SpringMvc组件之间的耦合性。

@Controller注解:将该类标注为一个Controller类处理器类,等到加载的时候被扫描出来注册为Controller的bean存放在Spring容器中。
@RequestMapping注解:
(1)标注在方法上,就是子路径
(2)标注在类上,就是父路径
属性:
name: 用于为映射地址指定别名
value:用于指定请求的URL
method:用于指定该方法可以处理那种类型的请求方式,包括(GET,POST,HEAD,OPTIONS,PUT……)
Params: 用于指定客户端请求中参数的值必须包含哪些参数的值,才可以通过其标注的方法处理。
headers:用于指定客户端请求中必须包含安歇header的值时,才可以通过其标注的方法处理
consumes:用于指定处理请求的提交内容类型。
produces:用于只当返回的内容类型,仅当request请求头中的类型中包含指定类型才返回。

8、SpringMvc的页面跳转类型


页面跳转:
①viod类型
跳转默认页面,默认路径为方法映射路径和视图解析器的前缀、后缀拼接而成 即“前缀+方法映射路径+后缀”
②String类型:控制器方法执行后,会根据方法的返回值跳转到对应的资源
③ModelAndView类型
兼顾视图和数据的对象ModelAndView,该对象含有设置视图的setViewName()方法 ,也有设置数据的addObject()方法

9、Mybatis的核心对象


Mybatsi框架将用户从原始的JDBC解放出来,用户无需关心底层,只要关心写SQL语句
三大核心对象: SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession
SqlSessionFactoryBuilder: 构建SqlSessionFactory对象,提供了多种重载的build()方法
例如:

build(InputStream inputStream,String environment, Properties properties);
build(Reader reader,String environment, Properties properties);

SqlSessionFactory:Mybatis的应用中心对象,调用openSession()方法创建SqlSession对象,有多个重载的openSession()方法

SqlSession: 应用程序与持久层之间执行交互操作的对象,包含了大量执行SQL的方法,底层封装好了JDBC连接。
如:selectOne(String statement) :查询方法。参数statement是在配置文件中定义的元素的id,该方法返回SQL语句查询结果的一个泛型对象。
Insert(String statement) :插入方法,参数statement实在配置文件中定义的元素的id。该方法会返回执行SQL语句所影的行数。

10、Mybatis的映射文件


Mybatis的映射配置可以最大限度的进行SQL调优,以保证性能,让开发人员专注于SQL语句。
映射文件的根元素,只有一个namespace属性:用于区分不同的mapper,全局唯一;绑定DAO接口,即面向接口编程,

<cache>   配置给命名空间的缓存
<cache -ref>   从其他命名空间引用缓存配置
select、insert、update、delete即增删改查
<sql>   可以重用SQL块,也可以被其他语句使用。
<resultMap>    描述数据库结果集和对象的对应关系

<resultMap>   元素表示结果映射集,是Mybais中最重要也是功能最强大的元素。
<resultMap type="student" id="studentmap">
	<id property="id" column="sid"/>
	<result property="name" column="sname"/>
	<result property="age" column="sage"/>
</resultmap>

11、动态SQL元素

<if>   判断语句,用于单条件判断
<choose><when><otherwise>  相当于java中的switch…case..default语句,用于多条件判断
<where>  简化SQL语句中where的条件判断
<trim>  可以灵活的去除多余的关键字
<set>   用于SQL语句的动态更新
<foreach>  循环语句,常用于in语句等列举条件中
举例:<if>标签的使用
<select id="findjobs" parameterType="pojo" resultType="pojo">
	Select * from t_student where 1=1
	<if test ="username !=null and username !=' '">
		and username like concat ('%',#{username},'%')
	</if>
	<if test="jobs !=null and jobs !=' '">
		and jobs =#{jobs}
	</if> 
</select>
<choose>、<when>、<otherwise>  标签的使用
<select id = "findtest" parameterType="pojo" resultType="pojo">
	Select * from t_student where 1=1
	<choose>
		<when test ="username !=null and username !=' '">
			and username like contat('%',#{username},'%')
		</when>
		<when test ="jobs !=null and jobs !=' '">
			and jobs =#{jobs}
		</when>
		<otherwise>
		        and phone is not null
		</otherwise>
	</choose>
</select>
使用<choose>元素拼接SQL,当第一个<when>元素中的条件为真时,只动态组装第一个<when>元素内的SQL片段并执行,否则就继续向下判断第二个<when>元素中条件是否为真,以此类推。当所有when条件不为真时,则动态组装<otherwise>中的SQL执行。
<set>和<if>元素结合起来做更新操作,更新对象的部分字段而非全部。

12、Mybatis常用注解


Mybatis支持通过注解实现POJO对象和数据表之间的关联映射。此方式相对于xml映射,相对简单且不会增加系统开销
@Select、@Insert、@Update、@Delete 、@Param等用于CRUD以及传递参数。
注解直接用在接口上就行了
如:

@Delete("delete from tb_worker where id =#{id}")
@Update("update tb_worker set name = #{name},age =#{age} where id =#{id}")

@Param注解是指定SQL语句中的参数,当传入参数过多不能自动映射时,通过该注解指定参数一一对应。
在这里插入图片描述

当需要传入多参数时 无需对parameterType 进行配置但是要加@Param注释
①用mybatis的注解@Param(“studentid”)进行注明参数
②采用map映射

13、Mybatis的关联映射和缓存机制


一对一:就是再本类中定义与之关联的类的对象作为属性
一对多:就是在本类中定义与之关联类的对象的集合作为属性。
多对多:则是相互定位对方的集合为自己的属性

<association>  元素通常处理一对一关联属性(嵌套查询和嵌套结果)
<collection>  元素处理一对多或者多对一的关系属性

两元素的ofType属性和javaType属性:指用于指定实体类对象中集合类属性所包含的元素的类型(泛型)

缓存机制:
一级缓存(本地缓存):Mybatis的一级缓存是SqlSession级别的缓存,如果同一个SqlSession对象多次执行相同的SQL语句,第一次执行完成后,把查询结果写入一级缓存中,如果没有插入、更新、删除等操作,此后再执行相同的Sql查询语句时就会直接从缓存中读取数据,增加了数据库的查询效率。
二级缓存:Mybatis的二级缓存是Mapper级别的缓存,相同的Mapper类不同的SqlSession对象执行相同的SQL语句,会先直接从二级缓存里面读取。范围更大,二级缓存需要手动开启

tips:
1、select语句会被缓存
2、 insert、update、delete语句会刷新缓存
3、缓存会被赢LRU算法回收(最少使用算法)
4、没有刷新间隔,不会以任何时间来刷新缓存
5、缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
6、这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

缓存顺序
1、先看二级缓存中有没有
2、再看一级缓存中有没有
3、最后查数据库
4、查询到结果存入一级缓存,再存二级

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值