SSM面试-阿里云开发者社区

开发者社区> 开发与运维> 正文

SSM面试

简介: Mybatis 简介 mybatis支持普通sql查询,存储过程和高级映射的优秀持久层框架,Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检查,Mybatis使用简单的xml或注解用于配置和原始映射,将接口和Java的...

Mybatis

  • 简介
  1. mybatis支持普通sql查询,存储过程和高级映射的优秀持久层框架,Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检查,Mybatis使用简单的xml或注解用于配置和原始映射,将接口和Java的POJO(plan old Java Object)普通的Java对象映射成数据库的记录
  2. 每个mybatis应用程序主要都是使用SqlSessionFaction实例的,一个sqlSessionFaction实例可以通过sqlSessionFactionBuilder获得,SqlSessionFactionBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得
  3. mybatis有一个实用类(Resources)它由很多方法,可以很方便地从类路径及其他位置加载资源
  • 流程
    • 加载配置并初始化
      • 触发条件:加载配置文件
      • 将sql的配置信息加载成为一个个mappedStatment对象,包括了传入参数映射
      • 配置执行的sql语句,结果集映射配置,存储在内存中
    • 接受调用请求
      • 触发条件:调用mybatis提供的API
      • 传入参数:为sql的id和传入参数对象
      • 处理过程:将请求传递给下层的请求处理层进行处理
    • 处理操作请求
      • 触发条件:API接口层传递请求过来
      • 传入参数:为sql的id和传入参数对象
      • 处理过程:
  1. 根据sql的id查找对应的MappedStatment对象
  2. 根据传入参数对象解析MappedStatment对象,得到最终要执行的sql和执行传入的参数
  3. 获取数据连接,根据得到最终的sql语句和执行传入参数到数据库执行,并得到执行结果
  4. 根据MappedStatment对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果
  5. 释放连接资源
  6. 返回处理结果将最终的处理结果返回
  • 功能架构(三层)
  1. API接口层:

提供给外部使用的接口API,开发人员通过本地API操作数据库,接口层接到调用请求,就会调用数据处理来完成具体的数据处理

  1. 数据处理层:

负责具体的sql查找、解析、执行和执行结果映射处理等,主要的目的是根据调用的请求完成一次数据库的操作

  1. 基础支持层

负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来做最基础的组件,为上层的数据处理层提供最基础的支撑

  • 框架结构
  1. 加载配置

配置来源于两个地方:
1).配置文件中
2).Java代码的注解,将sql的配置信息加载为一个MappedStatment对象(包括传入参数映射配置,执行sql语句,结果映射配置)存储在内存中

  1. sql解析

当API接口层接收到调用请求时,会接收到传入sql的id和传入对象(可以是map、JavaBean或基本类型),mybatis会根据sql的id找到对应的MappedStatment,然后传入参数对象的MappedStatment进行解析,解析后可以得到最终的要执行的sql语句和参数

  1. sql执行

将最终得到的sql和参数拿到数据库进行执行,得到操作数据库的结果

  1. 结果映射

将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本类型,并将最终结果返回

mybatis中#{}与${}的区别

  • ${}

properties文件中的占位符,可用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver

  • #{}

sql的参数占位符,Mybatis会将sql中的#{}替换为,在sql执行前会使用preparedStatement的参数设置方法,按序给sql占位符设置参数值,比如ps.setInt(0,ParameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于param.getItem().getName()

XML映射文件中,除了常见的selectinsertupdatedelete标签之外,还有哪些标签

<resultMap>返回值类型、<sql><include><selectKey>加上动态sql的9个标签(trimwheresetforeachifchoosewhenotherwisebind)其中<sql>sql片段标签,通过<include>标签引入sql片段,<selectKey>为不支持自增的主键生产策略标签

一个XML文件都会写一个Dao接口与之对应,工作原理

Dao接口,常说的mapper接口,接口的权限名就是映射文件中的namespace的值,接口的方法名,就是映射文件MappedStatmentid值,接口方法的参数就是传递给slq的参数,mapper接口是没有实现类的,当调用接口方法时,接口权限名+方法名拼接字符串作为key值,可唯一定位一个mappedStatment
Dao接口里的方法是不能重载的,因为是权限名+方法名的保存和寻找策略

Mybatis是如何分页的

mybatis是使用RowBounds对象进行分页的,针对ResultSet结果集进行的内存分页而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页的功能

springMVC

  • 是一个mvc框架,在web模型中,mvc是一种很流行的框架,通过把modelviewcontroller分离,把较为复杂的web应用分成逻辑清晰的几部分,是为了简化开发,减少出错,或是为了组内开发人员之间的配,总之就是一种分层工作的办法
  • 是spring的一个子框架,当然拥有spring的特性,如依赖注入,注解:RequestMapping,专门负责映射的url

spring是什么

spring是开源的轻量级的开发应用框架,目的是用于简化企业级应用程序开发

  • 原理

通过配置方式来创建对象,管理对象之间依赖关系,我们不需要通过工厂和生成器来创建及管理对象之间的依赖关系,这样我们是不是减少了许多工作,加速了开发

spring框架除了帮助我们管理对象及其依赖关系,还提供了日志记录、性能统计、安全控制、异常处理等面向切面的能力,还能帮我们管理最头疼的数据库事务,本身提供了一套简单的JDBC访问实现,提供与第三方数据访问框架集成(如Hibernate、JPA)与各种javaEE技术整合,提供一套自己的web层框架springMVC,而且还能非常简单的与第三方web框架集成

  • 作用

能帮助我们根据配置文件创建及组装对象之间的依赖关系(无需重新编译,只需要修改配置文件)
spring提供了与第三方数据访问框架无缝集成,而且自己提供了一套JDBC/springMVC框架,方便数据库/web层搭建(第三方web【如struts、JSF】)

为什么需要spring

  1. 应用程序

是能完成我们所需的功能的成品,比如:购物网站、OA系统

  1. 框架

是能够完成功能的半产品,框架规定了开发过程中的整体架构,提供了基础功能

  1. 非侵入式设计

从框架角度可以理解为,无需继承框架提供的类

  1. POJO(plan old java Object)简单的Java对象

它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其他java框架的类或接口

  1. 轻量级及重量级

轻量级是相对于重量级而言的,轻量级一般是非入侵性的,所依赖的东西非常少,资源占用非常少,部署简单,极易使用,重量级相反

  1. 容器

装对象的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期

  1. 控制反转

即Inversion of Control(IOC)/ 依赖注入(Dependency Injection),即由容器控制程序之间的关系,而非由程序直接操控

  1. Bean

一般指容器管理对象,在spring中指springIOC容器管理对象

为什么使用spring

能帮助我们简化应用程序开发,帮助我们创建和组装对象,为我们管理事务,简单的mvc框架,可以把spring看作是一个超级粘合平台,能够把很多技术整合在一起,形成一个整体,使系统结构更出众,更优秀,从而加速我们程序开发

Spring的BeanFactory和ApplicationContext的区别

spring使用BeanFactory来实例化配置和管理对象,但是它只是一个接口,里面有一个getBean()方法,我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的beannew对象,将new好的对象放进一个Map中,键就是我们beanid,值就是new的对象
BeanFactoryspring中比较原始的Factory,如XMLBeanFactory就是一种典型的BeanFactory,原始的BeanFactory无法支持spring的许多插件,例如:AOP、web应用等
ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能

容器是spring的核心

  • BeanFactory

spring中比较原始的Factory,如XMLBeanFactory就是一种典型的BeanFactory,原始的BeanFactory无法支持spring的许多插件,例如:AOP、web应用等

  • ApplicationContext

三个实现类

  1. classPathXMLApplication:把上下文文件当成类路径资源
  2. FileSystemXMLApplication:从文件系统中的XML文件载入上下文定义信息
  3. XMLWebApplicationContext:从web系统中的XML文件载入上下文定义信息
  • 作用

BeanFactory负责读取Bean配置文档,管理Bean的加载,实例化,维护Bean之间的依赖关系,负责Bean的生命周期
ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能
a. 国际化支持
b. 资源访问
c. 时间传递(通过实现ApplicationContextAware接口)

常用的获取ApplicationContext的方法

  • FileSystemXMLApplicationConrext

从文件系统或者url指定的xml配置文件创建参数为配置文件名或文件名数组。

  • classPathXMLApplicationContext

从classPath的xml配置文件创建,可以从jar包中读取配置文件

版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章