Mybatis源码解析(一) SqlSessionFactory 初始化

本文详细解析了MyBatis中SqlSessionFactory的创建过程,重点关注了从XML配置文件创建SqlSessionFactory的方式。文章还深入探讨了mappers配置,特别是XML映射文件的解析流程,包括XML映射文件的解析、XML与Mapper接口的绑定,以及命名空间在Mapper接口绑定中的作用。通过对解析逻辑的分析,阐述了MyBatis如何减少大部分JDBC代码,实现强大的映射语句功能。

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

SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

创建一个SqlSessionFactory

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置加载资源文件更加容易。

SqlSessionFactoryBuilder#build

public SqlSessionFactory build(Configuration config) {
   
   
  return new DefaultSqlSessionFactory(config);
}

这个configurations 可以自己构造,也可以通过配置mybatis的xml,对应配置介绍如下

http://www.mybatis.org/mybatis-3/zh/configuration.html
在这里插入图片描述

mappers 配置

这里重点说一下 mappers 这个元素的配置,因为之前我直接使用这个Configuration自己进行构造,发现xml并没有被解析,后面发现在这里的进行mappers的进行解析的时候,做了一步操作,就是把mapper进行解析

private void mapperElement(XNode parent) throws Exception {
  if (parent != null) {
    for (XNode child : parent.getChildren()) {
      if ("package".equals(child.getName())) {
        String mapperPackage = child.getStringAttribute("name");
        configuration.addMappers(mapperPackage);
      } else {
        String resource = child.getStringAttribute("resource");
        String url = child.getStringAttribute("url");
        String mapperClass = child.getStringAttribute("class");
        if (resource != null && url == null && mapperClass == null) {
          ErrorContext.instance().resource(resource);
          InputStream inputStream = Resources.getResourceAsStream(resource);
          XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
          // 15 行
          mapperParser.parse();
        } else if (resource == null && url != null && mapperClass == null) {
          ErrorContext.instance().resource(url);
          InputStream inputStream = Resources.getUrlAsStream(url);
          XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());
          // 20 行
          mapperParser.parse();
        } else if (resource == null && url == null && mapperClass != null) {
          Class<?> mapperInterface = Resources.classForName(mapperClass);
          configuration.addMapper(mapperInterface);
        } else {
          throw new BuilderException("A mapper element may only specify a url, resource or class, but not more than one.");
        }
      }
    }
  }
}

可以发现在 15行 和 20行 ,也就是 配置中的resource 和 url不为空的时候 。调用了一下 parse 的方法
也就是XML文件的解析,也就是下一章节,这里先看一下如何进行xml扫描配置

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值