Mybatis的动态代理

本文详细解析了Spring整合MyBatis的过程,包括通过MybatisAutoConfiguration配置MybatisProperties,创建DefaultSqlSessionFactory及SqlSession,以及如何通过动态代理类执行SQL语句。深入探讨了Configuration对象如何生成动态代理类,并通过MapperProxyFactory与MapperProxy执行具体的方法调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Spring 通过 MybatisProperties 配置MybatisAutoConfiguration

2、创建DefaultSqlSessionFactory,从而创建SqlSession

3、动态代理类的生成,sql语句的执行

  1.当我们调用DefaultSqlSession的getMapper方法时,都会创建一个新的动态代理类实例,

  2.方法:sqlSession.getMapper(*Mapper.class);而SqlSession对象又将getMapper方法委给了 
   Configuration对象执行

    public class DefaultSqlSession implements SqlSession {
 
      private Configuration configuration;
 
      @Override
      public <T> T getMapper(Class<T> type) {
        return configuration.<T>getMapper(type, this);
      }
    }

   3.通过Configuration类里面通过MapperRegistry对象生成动态代理类的***Mapper接口信息。

   public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    return mapperRegistry.getMapper(type, sqlSession);
   }
   
   @SuppressWarnings("unchecked")
   public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) 
     knownMappers.get(type);
    if (mapperProxyFactory == null) {
      throw new BindingException("Type " + type + " is not known to the 
    MapperRegistry.");
    }
    try {
      return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
      throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
  }
  
  4.通过MapperProxyFactory<T> 生成代理对象
  /**
   * @author Lasse Voss
   */
   public class MapperProxyFactory<T> {
   ------
  @SuppressWarnings("unchecked")
  protected T newInstance(MapperProxy<T> mapperProxy) {
    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { 
    mapperInterface }, mapperProxy);
  }
  
  5.通过MapperProxy<T> invoke执行方法
  public class MapperProxy<T> implements InvocationHandler, Serializable {
  --------
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    try {
      if (Object.class.equals(method.getDeclaringClass())) {
        return method.invoke(this, args);
      } else if (method.isDefault()) {
        if (privateLookupInMethod == null) {
          return invokeDefaultMethodJava8(proxy, method, args);
        } else {
          return invokeDefaultMethodJava9(proxy, method, args);
        }
      }
    } catch (Throwable t) {
      throw ExceptionUtil.unwrapThrowable(t);
    }
    final MapperMethod mapperMethod = cachedMapperMethod(method);
    return mapperMethod.execute(sqlSession, args);
  }
}
6.mapperMethod.execute方法解析参数执行sql返回结果
 




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值