MyBatis本质
就是代理模式体现;MyBatis作者思想认为JDBC开发流程中所有的步骤都是次要业务,认为SQL编写主要任务。开发人员专注于SQL编写应该忽略JDBC开发流程,轻度体现ORM思想。
MyBatis与Hibernate比较
- Hibernate:杜绝开发人员亲自使用JDBC,杜绝亲自编写用sql命令,Hibernate无法SQL优化,Hiberante缓存依赖程度过大,一级缓存如何同步二级缓存
- MyBatis:杜绝开发人员亲自使用JDBC,认为开发人员专注于sql优化,MyBatis对于缓存依赖轻
MyBatis架构图
mybatis大体上分为三层:
- 第一层接口层,提供给开发人员用于操作的接口,要求mybatis操作数据库。(接口层不是真正实现的地方,只是用来与程序员做交互的)。
- 第二层 数据处理层:其中共有四个模块
1)参数映射:怎么将参数映射到相应的sql占位符上
2)sql解析:怎么将配置文件中的sql命令与当前的接口做关联
3)sql执行:判断是何种sql,完成sql调用
4)结果映射:利用反射机制将查询结果将某个实例做个相关的关联 - 支撑层:连接管理,事务,缓存等管理,配置信息的加载
大体执行流程
代码如下
public class Main {
public static void main(String[] args) throws IOException {
SqlSession session;
InputStream is = Resources.getResourceAsStream("myBatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
session = factory.openSession();
DeptDao dao = session.getMapper(DeptDao.class);
Dept dept = dao.findByDeptNo(10);
System.out.println(dept.getDname());
}
}
层次结构图
- 开发人员首先拿到的是一个SqlSession的对象,SqlSession是个代理对象,其自身是没能力实现相应服务的。则会请求与Executor
- Executor,负责JDBC运行时这个Connect是怎么来的,是从连接池中来,还是创建一个。并且决定数据库操作对象Statement和PreparedStatement的管理方式。
1)Statement或者PreparedStatement干完活就干掉,用过一次就销毁。
2)建一个map集合,key是sql语句,value是PreparedStatement,当再得到一个相同的sql命令时就会从里面获得
3)将多个PreparedStatement放到一个PreparedStatement做批处理 - StatementHandler,决定当前PreparedStatement走executeQuery,executeUpdate等。其工作时需要借助其他两个模块
1)ParameterHandle:Sql中有占位符号,将参数通过setInt,setString赋值,生成sql语句。
2)ResultSetHandle:将结果集中的内容,通过反射机制,将结果集与相应的bean进行关联。其中需要借助TypeHandler
1)mysql中的类型跟java中的类型进行配对。
StatementHandler拿到ParameterHandle生成好的sql语句推送到数据库执行会得到一个结果
MyBatis框架使用方式
- 基于XML配置文件: SQL命令声明在XML配置文件中
- 基于注解方式:SQL命令声明在注解中
来源:CSDN
作者:wsdfym
链接:https://blog.csdn.net/wsdfym/article/details/103907099