Mybatis
- 简介
mybatis
支持普通sql查询,存储过程和高级映射的优秀持久层框架,Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检查,Mybatis使用简单的xml或注解用于配置和原始映射,将接口和Java的POJO(plan old Java Object)
普通的Java对象映射成数据库的记录- 每个mybatis应用程序主要都是使用SqlSessionFaction实例的,一个sqlSessionFaction实例可以通过sqlSessionFactionBuilder获得,SqlSessionFactionBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得
- mybatis有一个实用类(Resources)它由很多方法,可以很方便地从类路径及其他位置加载资源
- 流程
- 加载配置并初始化
- 触发条件:加载配置文件
- 将sql的配置信息加载成为一个个mappedStatment对象,包括了传入参数映射
- 配置执行的sql语句,结果集映射配置,存储在内存中
- 接受调用请求
- 触发条件:调用mybatis提供的API
- 传入参数:为sql的id和传入参数对象
- 处理过程:将请求传递给下层的请求处理层进行处理
- 处理操作请求
- 触发条件:API接口层传递请求过来
- 传入参数:为sql的id和传入参数对象
- 处理过程:
- 根据sql的id查找对应的MappedStatment对象
- 根据传入参数对象解析MappedStatment对象,得到最终要执行的sql和执行传入的参数
- 获取数据连接,根据得到最终的sql语句和执行传入参数到数据库执行,并得到执行结果
- 根据MappedStatment对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果
- 释放连接资源
- 返回处理结果将最终的处理结果返回
- 功能架构(三层)
- API接口层:
提供给外部使用的接口API,开发人员通过本地API操作数据库,接口层接到调用请求,就会调用数据处理来完成具体的数据处理
- 数据处理层:
负责具体的sql查找、解析、执行和执行结果映射处理等,主要的目的是根据调用的请求完成一次数据库的操作
- 基础支持层
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来做最基础的组件,为上层的数据处理层提供最基础的支撑
- 框架结构
- 加载配置
配置来源于两个地方:
1).配置文件中
2).Java代码的注解,将sql的配置信息加载为一个MappedStatment对象(包括传入参数映射配置,执行sql语句,结果映射配置)存储在内存中
- sql解析
当API接口层接收到调用请求时,会接收到传入sql的id和传入对象(可以是map、JavaBean或基本类型),mybatis会根据sql的id找到对应的MappedStatment,然后传入参数对象的MappedStatment进行解析,解析后可以得到最终的要执行的sql语句和参数
- sql执行
将最终得到的sql和参数拿到数据库进行执行,得到操作数据库的结果
- 结果映射
将操作数据库的结果按照映射的配置进行转换,可以转换成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映射文件中,除了常见的select
、insert
、update
、delete
标签之外,还有哪些标签
<resultMap>
返回值类型、<sql>
、<include>
、<selectKey>
加上动态sql的9个标签(trim
、where
、set
、foreach
、if
、choose
、when
、otherwise
、bind
)其中<sql>
为sql
片段标签,通过<include>
标签引入sql
片段,<selectKey>
为不支持自增的主键生产策略标签
一个XML文件都会写一个Dao
接口与之对应,工作原理
Dao
接口,常说的mapper
接口,接口的权限名就是映射文件中的namespace
的值,接口的方法名,就是映射文件MappedStatment
的id
值,接口方法的参数就是传递给slq
的参数,mapper
接口是没有实现类的,当调用接口方法时,接口权限名+方法名拼接字符串作为key
值,可唯一定位一个mappedStatment
Dao
接口里的方法是不能重载的,因为是权限名+方法名的保存和寻找策略
Mybatis是如何分页的
mybatis
是使用RowBounds
对象进行分页的,针对ResultSet
结果集进行的内存分页而非物理分页,可以在sql
内直接书写带有物理分页的参数来完成物理分页的功能
springMVC
- 是一个mvc框架,在web模型中,mvc是一种很流行的框架,通过把
model
、view
、controller
分离,把较为复杂的web应用分成逻辑清晰的几部分,是为了简化开发,减少出错,或是为了组内开发人员之间的配,总之就是一种分层工作的办法 - 是spring的一个子框架,当然拥有spring的特性,如依赖注入,注解:RequestMapping,专门负责映射的url
spring是什么
spring是开源的轻量级的开发应用框架,目的是用于简化企业级应用程序开发
- 原理
通过配置方式来创建对象,管理对象之间依赖关系,我们不需要通过工厂和生成器来创建及管理对象之间的依赖关系,这样我们是不是减少了许多工作,加速了开发
spring框架除了帮助我们管理对象及其依赖关系,还提供了日志记录、性能统计、安全控制、异常处理等面向切面的能力,还能帮我们管理最头疼的数据库事务,本身提供了一套简单的JDBC访问实现,提供与第三方数据访问框架集成(如Hibernate、JPA)与各种javaEE技术整合,提供一套自己的web层框架springMVC,而且还能非常简单的与第三方web框架集成
- 作用
能帮助我们根据配置文件创建及组装对象之间的依赖关系(无需重新编译,只需要修改配置文件)
spring提供了与第三方数据访问框架无缝集成,而且自己提供了一套JDBC/springMVC框架,方便数据库/web层搭建(第三方web【如struts、JSF】)
为什么需要spring
- 应用程序
是能完成我们所需的功能的成品,比如:购物网站、OA系统
- 框架
是能够完成功能的半产品,框架规定了开发过程中的整体架构,提供了基础功能
- 非侵入式设计
从框架角度可以理解为,无需继承框架提供的类
- POJO(plan old java Object)简单的Java对象
它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其他java框架的类或接口
- 轻量级及重量级
轻量级是相对于重量级而言的,轻量级一般是非入侵性的,所依赖的东西非常少,资源占用非常少,部署简单,极易使用,重量级相反
- 容器
装对象的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期
- 控制反转
即Inversion of Control(IOC)/ 依赖注入(Dependency Injection),即由容器控制程序之间的关系,而非由程序直接操控
- Bean
一般指容器管理对象,在spring中指springIOC容器管理对象
为什么使用spring
能帮助我们简化应用程序开发,帮助我们创建和组装对象,为我们管理事务,简单的mvc框架,可以把spring看作是一个超级粘合平台,能够把很多技术整合在一起,形成一个整体,使系统结构更出众,更优秀,从而加速我们程序开发
Spring的BeanFactory和ApplicationContext的区别
spring
使用BeanFactory
来实例化配置和管理对象,但是它只是一个接口,里面有一个getBean()
方法,我们一般都不直接用BeanFactory
,而是用它的实现类ApplicationContext
,这个类会自动解析我们配置的applicationContext.xml
,然后根据我们配置的bean
来new
对象,将new
好的对象放进一个Map
中,键就是我们bean
的id
,值就是new
的对象BeanFactory
是spring
中比较原始的Factory
,如XMLBeanFactory
就是一种典型的BeanFactory
,原始的BeanFactory
无法支持spring
的许多插件,例如:AOP、web应用等ApplicationContext
接口,它由BeanFactory
接口派生而来,因而提供BeanFactory
所有的功能
容器是spring的核心
BeanFactory
是
spring
中比较原始的Factory
,如XMLBeanFactory
就是一种典型的BeanFactory
,原始的BeanFactory
无法支持spring
的许多插件,例如:AOP、web应用等
ApplicationContext
三个实现类
classPathXMLApplication
:把上下文文件当成类路径资源FileSystemXMLApplication
:从文件系统中的XML文件载入上下文定义信息XMLWebApplicationContext
:从web系统中的XML文件载入上下文定义信息
- 作用
BeanFactory负责读取Bean配置文档,管理Bean的加载,实例化,维护Bean之间的依赖关系,负责Bean的生命周期
ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能
a. 国际化支持
b. 资源访问
c. 时间传递(通过实现ApplicationContextAware接口)
常用的获取ApplicationContext的方法
- FileSystemXMLApplicationConrext
从文件系统或者url指定的xml配置文件创建参数为配置文件名或文件名数组。
- classPathXMLApplicationContext
从classPath的xml配置文件创建,可以从jar包中读取配置文件