mybatis mybatis-spring 源码流程分析

2019-04-23  本文已影响0人  小小爱笑

前言

实际项目中通常使用mybatis-spring获得mapper的bean对象。本文通过 mybatis 和 mybatis-spring 的源码流程 了解其实现方式。

mybatis-logo

mybatis doc

http://www.mybatis.org/mybatis-3/zh/getting-started.html

mybatis-spring doc

http://www.mybatis.org/spring/zh/index.html

mybatis-spring github

https://github.com/mybatis/spring


mybatis 源码流程

session & binding

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
} finally {
  session.close();
}

第一部分:构造sessionFactory

第二部分 查询

transaction

datasource

PooledConnection是Connection的一个动态代理。主要为了在调用connection对象的接口前,检查连接是否过期。另外,如果调用close,会将connect归还连接池。


plugin

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  public Object intercept(Invocation invocation) throws Throwable {
    return invocation.proceed();
  }
  public Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }
  public void setProperties(Properties properties) {
  }
}

binding

生成mapper接口的 动态代理。
实现方式与 retrofit 相同。 https://www.jianshu.com/p/122859d42f4f

@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 (isDefaultMethod(method)) {
        return invokeDefaultMethod(proxy, method, args);
      }
    } catch (Throwable t) {
      throw ExceptionUtil.unwrapThrowable(t);
    }
    final MapperMethod mapperMethod = cachedMapperMethod(method);
    return mapperMethod.execute(sqlSession, args);
  }

接口调用时invoke根据传入的method 在methodCache中查找方法,调用MapperMethod.execute()


executor

sql的执行器,封装了对jdbc的调用。
sqlsession调用executor实现 对底层sql的执行。


mybatis-spring 源码流程

transaction

实现mybatis包中的事务接口, 提供 spring 管理的 事务。
使用了 spring-jdbc spring-tx

上一篇下一篇

猜你喜欢

热点阅读