MyBatis
# MyBatis

mybatis 是一个支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。ORM(Object Relational Mapping)对象关系映射
# 源码分析
- SqlSessionFactoryBuilder().build(inputStream),解析配置文件,创建SqlSessionFactory,封装到configuration中
- XMLConfigBuilder().parse()
- xml解析
- 数据库环境配置
- 类型处理器
- 别名处理器
- 插件
- XmlMapperBuilder().parse()
- 解析mapper.xml
- CRUD
- resultMap
- XMLConfigBuilder().parse()
- 数据源
- 解析proterties文件
- 解析config.xml
- xml映射到JavaBean
- 创建数据源dataSource
- 执行语句
- mappers,有多种获取方式,优先级从上到下
- package
- resources
- url
- mapper interface classes
- 封装成MappedStatement
- mappers,有多种获取方式,优先级从上到下
- 操作数据库
- 执行器Eexcutor
- 执行器类型
- SIMPLE:默认
- REUSE:复用
- BATCH:批量
- 一级缓存开启所在源码
- BaseExecutor
- SqlSession级别的
- 开启二级缓存
- CachingExecutor,包装BaseExecutor
- 灵活性不高,一般不使用
- 执行器类型
- 执行过程
- configuration.getMappedStatement()
- 语法引擎,改写sql
- 缓存一致性
- 执行器Eexcutor
- 插件(责任链模式)
- 增强四大核心对象,动态代理
- Eexcutor
- StaementHandler
- ParamterHandler
- ResultSetHandler
- 插件举例
- 分页插件
- 读写分离插件
- 增强四大核心对象,动态代理
# 常见问题
# MyBatis优缺点
# 优点
- 基于SQL变成,编写SQL与程序解耦,便于管理
- 封装了JDBC一套,减少代码量,减少连接维护
- 很好的与多种数据库兼容,只要支持JDBC,MyBatis就能支持
- 很好的与Spring集成
# 缺点
- 提供映射标签,对开发人员编写SQL有一定要求
# MyBatis中的${}和#{}的区别
- #{}是预编译处理,是占位符;${}是字符串替换,是拼接符
- MyBatis在处理#{}时,会将sql中的#{}替换成?号,调用PreparedStatement的set方法来赋值
- MyBatis在处理${}时,就是把${}替换成变量的值,用Statement来赋值
- 使用#{}可以有效的防止SQL注入,提高系统安全性
# MyBatis和Hiberate的区别
# 开发速度
- MyBatis上手容易,较快,敏捷开发
- HiBerate上手较慢,较难,封装度高
# 开发工作量
- MyBatis需要大量XML配置文件,开发工作量大
- HiBerate需要编写实体类,开发工作量小,有良好的映射机制
# SQL优化
- MyBatis可以精致优化
- Hibernate会查出所有字段
# 对象管理
- MyBatis没有对象状态管理
- Hibernate有对象状态管理
# 缓存机制
- MyBatis需要在每个表-对象映射中配置
- Hibernate在SessionFactory中配置
# MyBatis插件的原理
- 使用JDK动态代理
- 只针对ParameterHandler,ResultSetHandler,StatementHandler,Executor四个接口进行增强,当执行这四个接口,就会进入拦截方法interceptor()
编辑 (opens new window)
上次更新: 2024/06/01, 23:33:02