当前位置: 首页 > news >正文

05 Mybatis源码篇---XML配置之mappers 映射器

这里我简单的讲述一下,在创建SqlSessionFactory对象的时候,是如何解析XML配置文件,并完成加载。

首先从解析MyBatis配置文件configuration节点及子节点时,调用mapperElement来解析mappers。

      /**
       * 解析Mappers节点及一下节点
       */
      mapperElement(root.evalNode("mappers"));


  /**
   * 解析XML配置文件mappers节点
   * @param parent
   * @throws Exception
   */
  private void mapperElement(XNode parent) throws Exception {
    if (parent != null) {
      for (XNode child : parent.getChildren()) {

        /**
         * mappers 节点下,配置我们的mapper映射文件, 所谓的mapper映射文件,就是让mybatis 用来建立数据表和javabean映射的一个桥梁。
         * 在我们实际开发中,通常一个mapper文件对应一个dao接口, 这个mapper可以看做是dao的实现。所以,mappers必须配置。
         * 对于mapper的配置,跟typeAliases相同,有两种方式
         *<mappers>
         *  <mapper resource="demo1/UserMapper.xml"/>
         *  <mapper class="hzq.mybatis.source.demo1.dao.IUserDao"/>
         *  <mapper url="file:///var/demo1/UserMapper.xml"/>
         *  <package name="hzq.mybatis.source.demo1.dao"/>
         </mappers>
         * mapper 和 package两种方式,但是对于mapper配置,又有三种不同的引用方式,见下面源码
         * package加载的是所有的接口的class文件“Register all interfaces in a package as mappers”,要求跟<mapper class="hzq.mybatis.source.demo1.dao.IUserDao"/>这种配置方式一样
         * mapper:
         *    resource ---“Using classpath relative resources” 使用相对路径
         *    url ---- “Using url fully qualified paths”  使用全路径
         *    class  -- “ Using mapper interface classes ” 使用mapper文件的接口类,通过class指定接口,进而将接口与对应的xml文件形成映射关系,但是必须保证接口和mapper文件同名(不区分大小写)
         *
         */
        if ("package".equals(child.getName())) {
          /**
           * 获取MyBatis配置文件的包名称
           */
          String mapperPackage = child.getStringAttribute("name");
          /**
           * 解析package目录下面的Mapper文件,并加载到configuration
           */
          configuration.addMappers(mapperPackage);
        } else {
          String resource = child.getStringAttribute("resource");
          String url = child.getStringAttribute("url");
          String mapperClass = child.getStringAttribute("class");
          /**
           * mapper 配置方式,class,resource ,url 3个任取其一
           */
          if (resource != null && url == null && mapperClass == null) {
            // resource 配置方式
            ErrorContext.instance().resource(resource);
            /**
             * 读取mapper文件
             */
            InputStream inputStream = Resources.getResourceAsStream(resource);
            /**
             * mapper映射文件都是通过XMLMapperBuilder解析
             */
            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
            mapperParser.parse();
          } else if (resource == null && url != null && mapperClass == null) {
            //url 配置方式
            ErrorContext.instance().resource(url);
            InputStream inputStream = Resources.getUrlAsStream(url);
            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());
            mapperParser.parse();
          } else if (resource == null && url == null && mapperClass != null) {
            //class 配置方式
            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.");
          }
        }
      }
    }
  }

针对与Mpper映射文件具体是如何解析的,在研究完Mpper映射中的元素,我会将详细的流程展现给大家。




相关文章:

  • 04 Mybatis应用篇---XML映射文件之select,insert,update,delete基础介绍
  • 05 Mybatis应用篇---XML映射文件之select,insert,update,delete实战
  • IntelliJ IDEA 和 Eclipse 常用快捷键
  • 基于Maven环境进行Spring集成CXF WebService框架
  • 01 Mybatis整合Spring 由于版本引起的BUG
  • 01 shiro与spring集成
  • JAVA之自增自减运算符
  • JAVA之“==”和“equals”的区别
  • JAVA之equals对于引用类型比较的方式不同呢
  • JAVA之String,StringBuffer与StringBuilder三者之间的区别
  • JAVA之冒泡(Bubble)排序
  • JAVA之选择排序
  • JAVA之插入排序
  • JAVA之类,构造函数和构造代码块
  • JAVA面试题之冒泡排序,插入排序及选择排序
  • 分享的文章《人生如棋》
  • [译]如何构建服务器端web组件,为何要构建?
  • 【刷算法】求1+2+3+...+n
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Cookie 在前端中的实践
  • docker python 配置
  • jquery cookie
  • JS实现简单的MVC模式开发小游戏
  • JS字符串转数字方法总结
  • KMP算法及优化
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Markdown 语法简单说明
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • oschina
  • Python十分钟制作属于你自己的个性logo
  • Selenium实战教程系列(二)---元素定位
  • Sublime text 3 3103 注册码
  • supervisor 永不挂掉的进程 安装以及使用
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 浮动相关
  • 时间复杂度与空间复杂度分析
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 无服务器化是企业 IT 架构的未来吗?
  • 小程序01:wepy框架整合iview webapp UI
  • 小李飞刀:SQL题目刷起来!
  • 云大使推广中的常见热门问题
  • ​水经微图Web1.5.0版即将上线
  • #微信小程序:微信小程序常见的配置传旨
  • $(function(){})与(function($){....})(jQuery)的区别
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C语言)fread与fwrite详解
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (ZT)一个美国文科博士的YardLife
  • (安卓)跳转应用市场APP详情页的方式
  • (层次遍历)104. 二叉树的最大深度
  • (五)关系数据库标准语言SQL
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • **CI中自动类加载的用法总结