Mybatis实现数据库交互的原理
- 一、JDBC
- 二、反射+jdk动态代理
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
一、JDBC
Java语言访问数据库的一种规范,是一套API。JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。JDBC规范采用接口和实现分离的思想设计了Java数据库编程的框架。接口包含在java.sql及javax.sql包中,其中java.sql属于JavaSE,javax.sql属于JavaEE。为了使客户端程序独立于特定的数据库驱动程序,JDBC规范建议开发者使用基于接口的编程方式,即尽量使应用仅依赖java.sql及javax.sql中的接口和类。
JAVA使用JDBC访问数据库的步骤:
1.得到数据库驱动程序
2.创建数据库连接
3.执行SQL语句
4.得到结果集
5.对结果集做相应的处理(增,删,改,查)
6.关闭资源:这里释放的是DB中的资源
二、反射+jdk动态代理
我们在使用传统的JDBC做数据库交互的时候,要想对返回的结果进行处理,需要通过反射和结果集的游标进行层层解析,是不是觉得很麻烦,确实尤其当我们需要查询的结果变成我们自定义的对象的时候发现比较难做,这是因为jdbc查出来的结果并没有做orm的映射转化,需要我们手动进行封装,所以mybatis的使用,可以让框架帮我们解决这个事情,但mybatis的具体实现原理是什么?从注解或者xml到查询,最后是怎么实现orm的映射呢?
数据处理层可以说是MyBatis的核心,从大的方面上讲,它要完成两个功能:
1.封装JDBC操作
2.利用反射打通Java类与SQL语句之间的相互转换,SQL语句的执行以及封装查询结果集成List;
MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。
1.MyBatis 所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类
2.SqlSession作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能 Executor
3.MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护 StatementHandler 封装了JDBC
4.Statement操作,负责对JDBC statement 的操作,如设置参数等 ParameterHandler
5.负责对用户传递的参数转换成JDBC Statement 所对应的数据类型 ResultSetHandler
6.负责将JDBC返回的ResultSet结果集对象转换成List类型的集合 TypeHandler
7.负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换 MappedStatement
8.MappedStatement维护一条<select|update|delete|insert>节点的封装
9.SqlSource负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回BoundSql表示动态生成的SQL语句以及相应的参数信息
使用了mybatis之后,我们并不需要关注mybatis和数据库交互操作的细节,因为这些mybatis的响应的组件已经帮助我们实现了,大体来说就是如下的一个执行顺序:
发起数据库交互—>创建sqlsession—>通过内部组件将请求的sql转化为真实执行的sql—>返回数据库执行结果—>对结果集进行包装—>响应业务处理的代码。