05 java框架

一、MyBatis

1.1Mybatis和ORM概念

  • MyBatis:持久层框架,Mybatis可以使用xml文件和注解的方式配置和映射原生类型,接口和java对象为数据库中记录
  • ORM:对象关系映射,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中

1.2Mybatis如何解决JDBC问题

  • 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能;解决:在mybatis-config.xml中配置数据链接池,使用连接池管理数据库连接。
  • Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。解决:将Sql语句配置在xml文件中与java代码分离。
  • 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应;解决: Mybatis自动将java对象映射至sql语句。

1.3Mybatis编程步骤

  • 创建SqlSessionFactory
  • 通过SqlSessionFactory创建SqlSession
  • 通过sqlsession执行数据库操作
  • 调用session.commit()提交事务
  • 调用session.close()关闭会话

1.4Mybatis工作原理

​ 1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。

​ 2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。

​ 3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。

​ 4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。

​ 5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。

​ 6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。

​ 7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。

​ 8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

1.5映射器

1、#{}和${}区别

  • #{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。
  • #{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值。
  • 是 原 值 传 入 , 就 是 把 {}是原值传入,就是把 {}替换成变量的值,相当于JDBC中的Statement编译
  • #{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL 注入

2、映射器传递多个参数的方法

Java Bean传参法,#{}里面的名称对应的是User类里面的成员属性。

public User selectUser(User user);
<select id="selectUser" parameterType="com.jourwon.pojo.User" resultMap="UserResultMap">
    select * from user
    where user_name = #{userName} and dept_id = #{deptId}
</select>

1.6接口绑定

  • 接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。
  • 实现方式:
    • 通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;
    • 通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。

1.7Mybatis的一级和二级缓存

1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

二、Spring

2.1 Spring基础

  • 概念:Spring是一个轻量级Java开发框架,目的是解决企业级应用开发的业务逻辑层和其他各层的耦合问题。

  • 优缺点:

    • 方便解耦;AOP编程开发;声明式事务支持;方便集成各种框架;
    • 依赖反射,影响性能
  • 核心:IoC容器和AOP模块。通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。

  • 组成部分:

    • spring core:提供了框架的基本组成部分,包括控制反转(IOC)和依赖注入(DI)功能。
    • spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
    • spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
    • spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。
    • spring jdbc
    • spring Web
    • spring test

2.2 spring用到的设计模式

  • 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
  • 单例模式:Bean默认为单例模式。
  • 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
  • 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
  • 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。

2.3 IOC容器

1、基础
  • 概念:把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。
  • 作用:管理对象的创建和依赖关系的维护;解耦
  • 实现原理:工厂模式+反射机制
  • 支持功能:依赖注入;依赖检查;自动装配;支持集合
2、BeanFactory和ApplicationContext
  • 区别:BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
    • 加载方式:BeanFactory采用的是延迟加载来注入bean,只有在用到某个bean时才进行加载实例化;ApplicationContext在容器启动时一次性创建了所有bean
    • 创建方式:BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。
  • 关系:
    • BeanFactory可以看成低级容器,“低级容器”, 只负载加载 Bean,获取 Bean。
    • ApplicationContext可以看成是高级容器,包含了低级容器的功能,同时其作为高级容器,包含了太多的功能。他不仅仅是 IoC。支持不同信息源头,支持 BeanFactory 工具类,支持层级容器,支持访问文件资源,支持事件发布通知,支持接口回调等。
3、依赖注入
  • 控制反转IoC可以用不同的方式来实现。其主要实现方式有两种:依赖注入和依赖查找。
  • 概念:即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的setter)或者是构造器传递给需要的对象。
  • 实现方式:
    • 构造器依赖注入:通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。适用于设置很多属性
    • Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。适用于设置少量属性

2.4 Spring bean

  • 概念:Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。

  • 定义类的作用域:当定义一个 在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean 定义中的scope属性来定义。(五种作用域)

    • singleton : bean在每个Spring ioc 容器中只有一个实例。默认缺省是singleton
    • prototype:一个bean的定义可以有多个实例。
    • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
    • session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
    • global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • Spring如何处理线程并发问题

    ​ 在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。

  • bean的自动装配:在配置文件中设定bean的依赖关系是一个很好的机制,Spring 容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。一般使用@Autowired注解自动装配

  • spring自动装配bean的方式:

    • no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
    • byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。
    • byType:通过参数的数据类型进行自动装配。
    • constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
    • autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。

2.5注解

  • 开启注解:配置 context:annotation-config 元素。
  • 各种注解:
    • @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
    • @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。
    • @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。
    • @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。
    • @RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。

2.6spring事务管理

  • 支持事务类型

    编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。

    声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

2.7面向切面编程

  • 概念:用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块(切面),减少系统中的重复代码,降低了模块间的耦合度。可用于权限认证、日志、事务处理等。

  • Spring Aop实现:Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

  • 名词解释:

    • 切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现。
    • 通知(Advice):在AOP术语中,切面的工作被称为通知。
    • 切入点(Pointcut):切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用明确的类和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。
    • 织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程。在目标对象的生命周期里有多少个点可以进行织入:
  • spring切面用到的五种类型的通知

    • 前置通知(Before):在目标方法被调用之前调用通知功能;
    • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
    • 返回通知(After-returning ):在目标方法成功执行之后调用通知;
    • 异常通知(After-throwing):在目标方法抛出异常后调用通知;
    • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

三、Spring MVC

3.1基础

  • 概念:基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发

  • 工作流程:

    img

3.2常用注解

  • @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。value: 指定请求的实际地址,method: 指定请求的method类型, GET、POST、PUT、DELETE等;

  • @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

  • @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。

3.3其他

  • 转发和重定向

    (1)转发:在返回值前面加"forward:"

    (2)重定向:在返回值前面加"redirect:"

  • Spring MVC中函数的返回值是什么?

    返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。

  • Spring MVC用什么对象从后台向前台传递数据的?

    通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到。

  • 怎样在方法里面得到Request,或者Session?

    直接在方法的形参中声明request,Spring MVC就自动把request对象传入

  • 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置

据都合并的一起的,但一般用String比较好。

  • Spring MVC用什么对象从后台向前台传递数据的?

    通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到。

  • 怎样在方法里面得到Request,或者Session?

    直接在方法的形参中声明request,Spring MVC就自动把request对象传入

  • 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置

    可以在@RequestMapping注解里面加上method=RequestMethod.GET。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值