【Mybatis进阶】-- mybatis架构
来源:互联网 发布:棉花数据 编辑:程序博客网 时间:2024/05/01 19:52
1.什么是mybatis
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而
不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的
过程代码,通过mybatis提供的映射方式,自由灵活的生成满足需要的sql语句。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)
配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将
结果映射成java对象并返回。
2.mybatis架构图
3.架构解析
1、SqlMapConfig.xml
mybatis的全局配置文件,名称不固定,开发者可自定义。SqlMapConfig.xml中配置了数据源、事务等mybatis运行
环境、配置映射文件(配置sql语句)。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、SqlSessionFactory
会话工厂,根据SqlMapConfig.xml配置文件创建。跟spring整合后,通过单例模式管理,即会话工厂一旦创建,
只使用一个实例。 作用即创建SqlSession
3、SqlSession
会话,是一个面向开发者的接口。在sqlsession内部提供了很多操作数据库的方法,如返回单个对象的selectOne
返回多个对象的selectList。
需要注意的是,sqlsession不是线程安全的,不能共享使用。最佳应用场合为方法体内,定义成局部变量使用。
每个线程应该有它自己的sqlsession实例,打开一个会话使用完毕后立即关闭。
4、Executor
执行器,也是一个接口,包含两个实现,一个是基本执行器、一个是缓存执行器
作用:SqlSession内部通过执行器操作数据库
5、mapped statement
底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped
Statement对象,mapper.xml中sql的id即是Mapped statement的id。
作用:对操作数据库存储封装,包括 sql语句,输入参数、输出结果类型
6、输入参数映射
输入参数映射就是jdbc编程中对preparedStatement设置参数。Mapped Statement对sql执行输入参数进行定义,
包括HashMap、基本类型、pojo。Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中。
7、输出结果映射
输出结果映射过程相当于jdbc编程中对结果的解析处理过程。Mapped Statement对sql执行输出结果进行定义,包
括HashMap、基本类型、pojo。Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中。
4.与hibernate的异同
1)hibernate
hibernate是一个标准ORM框架,入门门槛高,sql语句自动生成,不需要程序员自己手动编写。也正是由于
hibernate对sql语句的封装,使得对sql语句的优化和修改比较困难。
适用场景:需求变化小的中小型项目。例如后台管理系统OA、ERP、ORM。。。
2)mybatis
支持原生sql,程序员只需专注编写sql语句,对sql修改和优化比较方便。mybatis是一个半自动化的ORM框架,程
序员可自己写sql,也可利用mybatis映射机制自动生成。
适用场景:需求变化较多的项目。例如互联网项目。
本篇博文对mybatis的框架和内部实现机制做了详细介绍,接下来会通过一个入门程序对本篇内容做一个简单
实践,欢迎继续关注。
- 【Mybatis进阶】-- mybatis架构
- MyBatis进阶
- mybatis进阶
- MyBatis架构
- MyBatis架构
- mybatis架构
- Mybatis架构
- mybatis-架构
- mybatis架构
- Mybatis架构
- 【Mybatis进阶】--mybatis 入门程序
- (三)Mybatis进阶
- 二、mybatis进阶
- mybatis进阶之旅
- Mybatis进阶用法详解
- mybatis架构介绍
- 【Mybatis架构】 延迟加载
- Mybatis教程,SSM架构
- 获取进程名的两种方法
- 硬链接的创建及删除
- meanjs中的服务
- django 项目中使用多数据库 multiple databases - 真实的活
- 从leetcode—Generate Parentheses看卡特兰数
- 【Mybatis进阶】-- mybatis架构
- Java Runtime.exec()的使用
- Swift - 使用CoreLocation实现定位(经纬度、海拔、速度、距离等)
- SPEC2000 测试
- 科研数据集
- swift表格(UITableView)介绍与基础实现
- python 获取网络时间及修改本地时间
- set
- 阿里云CentOS使用vsftpd搭建FTP服务器