天天看点

Mybatis框架(二)-- 原理解析

Mybatis框架(一)-- 快速入门

Mybatis框架(二)-- 原理解析

Mybatis框架(三)-- 详细配置参数

Mybatis框架(四)-- 其他配置

Mybatis框架(五)-- 多表查询

Mybatis框架(六)-- 延迟加载

Mybatis框架(七)-- 缓存

Mybatis框架(八)-- 注解开发

文章目录

    • Mybatis框架所使用的资源
    • Mybatis执行原理
    • 动态代理过程

Mybatis框架所使用的资源

1 总配置文件

  • 包含连接数据库的四个参数
  • 包含mappers映射配置文件(每个dao层接口的配置文件)的目录

2 映射配置文件Mapper

  • 包含对应方法需要用到的Sql语句
  • 包含对应方法返回值的全限定类名封装结果的接收JavaBean类型(domain层)

Mybatis执行原理

  1. 解析配置文件,根据配置文件的信息创建Connection对象注册驱动,获得连接。
  2. 获取与处理对象

    PreparedStatement

    对象 conn.prepareStatement(Sql语句)
  3. 执行查询

    ResultSet rs = preparedStatement.executeQuery();

  4. 遍历结果集,用于封装 (通过返回值的全限定类名)。
通过返回值的全限定类名创建List集合 E为返回值类型
List<E> list = new ArrayList();
while(rs.next()){
	通过反射-创建E类型的对象,
	E element = (E)Class.forName(返回值的全限定类名).newInstance();
	
	将数据库返回的一条数据封装到element中,并添加到list中
	
	因为我们的实体类E 和 表中的列名是一致的。
	于是我们就可以把表的列名看成是实体类的属性名称。
	通过反射机制就可以把表中每条数据赋值到E实例对象的对应属性中
	
	list.add(element);
}
           

反射机制详解

5.返回List集合

动态代理过程

要详细了解Mybatis的实现,请先了解动态代理 – 代理模式

我们在抽象层次上理解动态代理与Mybatis框架的关系:

由于所有的Select语句都是向数据库发送Select语句并返回数据,只有Select语句和用于接收数据的JavaBean不同,使用动态代理对相同动作进行统一封装,不同之处使用动态代理进行增强。

首先定义一个接口里面包含要用到的方法 例如 (非真实代码,仅提供思路)

public interface SelectInterface
{
	List<T> select(); //通过sql语句返回数据,sql语句可通过配置文件或注解读取
}
           

通过动态代理返回实例

SelectInterface SelectProxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), SelectInterface.class, InvocationHandler h);

然后再执行
SelectProxy.select();
即可完成查询
           

关键的是InvocationHandler h中做了什么

InvocationHandler h InvocationHandler{
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)  {
    
	1.	根据配置文件的信息注册驱动,获得连接Connection对象。
		根据配置文件或注解,获得sql语句
	  	获取预处理对象 PreparedStatement conn.prepareStatement(Sql语句)
		 执行查询    ResultSet rs = preparedStatement.executeQuery();`
    
    2.  通过 返回值的全限定类名--returnType 或注解Sql语句所绑定的方法,得到返回值类型
		遍历结果集,进行封装
		(通过反射可以得到返回类型的属性个数fields,再通过属性名与表中列名相同可以一一赋值)
        
    3.  返回结果集合List
    }
}
           

继续阅读