文档章节

Mybatis源码分析-读取非项目中的xml文件

傲娇字符
 傲娇字符
发布于 05/17 17:24
字数 611
阅读 20
收藏 0

mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--通过这个配置文件,完成mybatis与数据库的连接  -->
<configuration>
    <environments default="development">
        <environment id="development">
            <!-- 配置事务管理 ,采用JDBC管理事务-->
            <transactionManager type="JDBC"/>
            <!-- POOLED是mybatis的 数据源 -->
            <!-- JNDI是基于tomcat的数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/demo"/>
                <property name="username" value="demo"/>
                <property name="password" value="demo"/>
            </dataSource>
        </environment>
    </environments>
    <!-- pojo的映射文件UserMapper引入到配入到配置文件中 -->
    <mappers>
        <!-- resource要写成路径 -->
        <mapper resource="/mybatis/mapper/demo.xml"/><!-- 项目中的xml文件 -->
        <mapper url="file:///D:/tmp/mybatis/mybatis/mapper/demo.xml"/><!-- 本地磁盘的xml文件 -->
        <mapper url="http://www.gongstring.com/mybatis/demo.xml"/><!-- 远程URL的xml文件 -->
    </mappers>

</configuration>

demo.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="demo" >

    <select id="findByPatientNo" resultType="java.util.Map">
        select * from base_patient where s_code = #{sCode} 
		<if test="patientNo != null">
		and d_code = #{patientNo}
		</if>
    </select>

</mapper>

java调用代码


        Map<String,Object> params = new HashMap<>();
        params.put("sCode","system");
//            params.put("patientNo","111");

        String resource = "D:\\tmp\\mybatis\\mybatis\\mybatis-config.xml";
        try (InputStream inputStream = new FileInputStream(resource)){
            Configuration configuration = new Configuration();
            
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = builder.build(inputStream);
            datas = factory.openSession().selectList("demo.findBySql",params);
            System.out.println(JSON.toJSONString(datas));

        }catch (Exception e){
            e.printStackTrace();
        }

源码分析

在Mybatis的SqlSessionFactory启动时,会先读取mybatis-config.xml配置文件进行初始化。mappers标签里面配置的xml文件,在XMLConfigBuilder.parseConfiguration(XNode root)方法中进行加载,而mybatis底层提供了几种xml加载方式,支持项目中的xml读取,以及URL的方式。

private void parseConfiguration(XNode root) {
    try {
      propertiesElement(root.evalNode("properties")); //issue #117 read properties first
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      settingsElement(root.evalNode("settings"));
      environmentsElement(root.evalNode("environments"));
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      typeHandlerElement(root.evalNode("typeHandlers"));
      mapperElement(root.evalNode("mappers")); //加载Mappers中的配置文件
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }

mapperElement方法:

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);///////////// 读取本地类路径下面的xml
            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
            mapperParser.parse();
          } else if (resource == null && url != null && mapperClass == null) {
            ErrorContext.instance().resource(url);
            InputStream inputStream = Resources.getUrlAsStream(url);///////////// 读取URL资源中的xml
            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());
            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.");
          }
        }
      }
    }
  }

Resources.getUrlAsStream(url)方法:

public static InputStream getUrlAsStream(String urlString) throws IOException {
    URL url = new URL(urlString); ////// 说明支持多种文件读取方式
    URLConnection conn = url.openConnection();
    return conn.getInputStream();
  }

© 著作权归作者所有

共有 人打赏支持
傲娇字符
粉丝 5
博文 38
码字总数 14769
作品 0
武汉
架构师
mybatis源码分析之Configuration

上一篇mybatis之SqlSessionFactory http://my.oschina.net/u/657390/blog/653637 上一篇对mybatis中SqlSessionFactory的创建过程进行了分析,从之前的分析可以看出创建过程中比较重要的一部分...

udbwcso
2016/04/18
2.9K
6
mybatis源码解读(二)——构建Configuration对象

  Configuration 对象保存了所有mybatis的配置信息,主要包括:   ①、 mybatis-configuration.xml 基础配置文件   ②、 mapper.xml 映射器配置文件 1、读取配置文件   前面例子有这...

ysocean
05/07
0
0
MyBatis 源码分析——介绍

笔者第一次接触跟MyBatis框架是在2009年未的时候。不过那个时候的他并不叫MyBatis,而是叫IBatis。2010年的时候改为现在的名字——MyBatis。这几年过去了,对于笔者来讲有一点陌生了。而且那...

Java小铺
08/10
0
0
mybatis源码解读(一)——初始化环境

  本系列博客将对mybatis的源码进行解读,关于mybatis的使用教程,可以查看我前面写的博客——传送门。   为了便于后面的讲解,我们这里首先构造一个统一环境。也可以参考mybatis官网。 ...

ysocean
04/25
0
0
手写spring+springmvc+mybatis框架篇

我们平日开发时所用的SSM框架,可是你真的了解它吗?技术革新,换代应接不暇,只有理解了源码才能保证在技术快速更迭的时代中真正站稳脚跟。 本系列文章抽丝剥茧,源码分析百度有很多,在这里...

技术小能手
07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

windows nvm 安装 node

nvm 是 node 的版本控制管理 下面是下载 nvm 的地址,选择 nvm-setup.zip 下载 https://github.com/coreybutler/nvm-windows/releases 就是下一步下一步,一键安装 基本命令有: nvm arch [32...

U_I_A_N
9分钟前
0
0
函数式组件完整例子

之前创建的组件是比较简单,没有管理或者监听任何传递给他的状态,也没有生命周期方法。它只是一个接收参数的函数。 在下面这个例子中,我们标记组件为 functional,这意味它是无状态 (没有响...

tianyawhl
24分钟前
0
0
linux shell大文件操作

查找字符串所在行 : grep -n “待查找字符串” “文件名” 显示指定行信息:sed -n 1p “指定文件” 表示显示指定文件第一行的信息 ----------------------------------------------------...

悲催的古灵武士
24分钟前
0
0
centos7安装nexus3

centos7安装nexus3 2018年05月24日 16:20:34 阅读数:257 1、下载nexus wget https://sonatype-download.global.ssl.fastly.net/repository/repositoryManager/3/nexus-3.12.0-01-unix.tar.......

linjin200
26分钟前
1
0
springboot整合cxf发布webservice以及调用

webservice性能不高,但是现在好多公司还是在用,恰好今天在开发的时候对接项目组需要使用到webservice下面来说下简单的案例应用 首先老规矩:引入jar包 <dependency><groupId>org.apach...

落叶清风
30分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部