Spring整合MyBatis原理之Mapper接口代理对象的产生以及调用

本文深入探讨Spring整合MyBatis时Mapper接口代理对象的产生过程,从SqlSessionTemplate到SqlSessionManager,再到Configuration和MapperProxy,详细解析了接口方法调用的整个流程,包括增删改查操作的实现。
摘要由CSDN通过智能技术生成

1. 前言

本篇文章是 Spring 整合 MyBatis 原理的第三篇文章,上一篇文章 在这里 ,我们啦继续学习 Spring 整合 MyBatis 原理

2. Mapper 接口代理对象的产生以及调用

2.1. Mapper 接口代理对象的产生

2.1.1. SqlSessionTemplate 中的 getMapper()

我们知道在 MyBatis 使用中,有如下步骤

 public static void main(String[] args) throws Exception {
   
	Reader reader = Resources.getResourceAsReader("resource/mybatis-config.xml");
	// 获取 SqlSessionFactory 对象
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
	// 获取 SqlSession 对象
	SqlSession sqlSession = sessionFactory.openSession();
	PersonDao personDao = sqlSession.getMapper(PersonDao.class);
	Person person = new Person("11", "Fighter168");
	personDao.save(person);
	// ......省略
}
  • sqlSession.getMapper() 可知,它必定会产生代理对象,那么就开始分析它的背后逻辑
  • Spring 整合 MyBatis中,由于 SqlSession 是线程不安全的,所以 Spring 提供了一个 SqlSessionTemplate 来代替 SqlSessionSqlSessionTemplate 类实现了 SqlSession 接口
  • SqlSessionTemplate 中的 getMapper() 方法如下
@Override
public <T> T getMapper(Class<T> type) {
   
	return getConfiguration().getMapper(type, this);
}

@Override
public Configuration getConfiguration() {
   
    return this.sqlSessionFactory.getConfiguration();
}

我们继续跟近 Configuration 类的 getMapper() 方法看下里面做了什么

2.1.2. Configuration 类的 getMapper()

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
   
    return mapperRegistry.getMapper(type, sqlSession);
}

继续跟进 MapperRegistry 类中的 getMapper()

2.1.3. MapperRegistry 类中的 getMapper()

@SuppressWarnings("unchecked")
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
   
	// 获取已经解析完成的 Mapper 接口信息
	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);
    }
}
  • knownMappers.get() 方法:获取已经解析完成了的 Mapper 接口信息

显然,应该跟进 mapperProxyFactory.newInstance() 方法

2.1.4. MapperProxyFactory 类中的 newInstance()

public T newInstance(SqlSession sqlSession) {
   
    final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache);
    // 调用下面的 newInstance()
    return newInstance(mapperProxy);
}

@SuppressWarnings("unchecked")
protected T newInstance(
  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值