MyBatis【Mapper】

本文详细介绍了MyBatis中Mapper的加载过程,包括XML配置、Mapper接口创建、SqlSessionFactory构建,以及Mapper的动态代理和执行机制,重点阐述了注解映射(@Select等)的工作原理。
摘要由CSDN通过智能技术生成

一、引言

上章说了【Pllugin】,这里将展现一下【Mapper】是如何加载、执行的。

二、Mapper加载

1.配置XML

  <mappers>
    <mapper class="org.apache.ibatis.plugin.Mapper" />
  </mappers>

1.2.创建 Mapper.class

public interface Mapper {

  @Select("select name from users where id = #{id}")
  String selectNameById(Integer id);

}

1.3.构建SqlSessionFactory

SqlSessionFactory sqlSessionFactory = null;
try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/plugin/mybatis-config.xml");
     SqlSession sqlSession = sqlSessionFactory.openSession()) {
     //
	sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
	// Mapper执行
	Mapper mapper = sqlSession.getMapper(Mapper.class);
	assertEquals("Public user 1", mapper.selectNameById(1));
}

1.4.Mapper的加载
Mapper装载
1.5.MapperRegistry

1.5.1.@Select,@Update等注解的解析
org.apache.ibatis.binding.MapperRegistry#addMapper除了将Mapper接口给存储起来,还包含对注解的解析等,具体看【org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#parseStatement】(包含@Select, @Update, @Insert等注解的解析)

1.5.2.Mapper动态代理节点
上诉流程中在加载的时候并未创建对应Mapper的动态代理,org.apache.ibatis.binding.MapperRegistry#getMapper这里面创建的。

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);
    }
  }

二、Mapper执行

上诉一节讲述了MyBatis怎么加载的Mapper.class。接下来看看Mapper.class和Mapper.xml是怎么映射的(@Select等注解的方式也是一致的)。
下列流程如图讲解:1.3.构建SqlSessionFactory Mapper执行的过程。(注:分支实现不过多探讨)
Mapper执行
在org.apache.ibatis.binding.MapperMethod.SqlCommand#resolveMappedStatement
中通过org.apache.ibatis.session.Configuration#getMappedStatement(java.lang.String)获取到对应的 MappedStatement,org.apache.ibatis.binding.MapperMethod#execute包含获取参数、拿到返回结果的逻辑。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值