文档章节

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

傲娇字符
 傲娇字符
发布于 05/17 17:24
字数 611
阅读 18
收藏 0
点赞 0
评论 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();
  }

© 著作权归作者所有

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

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

udbwcso ⋅ 2016/04/18 ⋅ 6

MyBatis整合Spring的实现(1)

目的 MyBatis是一个基于Java的持久层框架。也是很多程序员的最爱,因为自己控制的SQL时,写出一个好的SQL会大大的提高整体程序的性能。目前的项目一般都是MyBatis和Spring的整合,那么具体的...

tara_qri ⋅ 2015/10/24 ⋅ 0

Mybatis源码概览(一)

一般拿到源码会无从下手,我的基本思路一般就是根据一个基本的helloWorld Debug下去,把主线先大概理一遍,然后再具体分析细节,没有必要一个类一个类细看,看了也会忘掉。自己理源码的时候看...

robin-yao ⋅ 2016/03/22 ⋅ 0

mybatis源码分析之TypeHandler

上一篇: mybatis源码分析之MapperMethod https://my.oschina.net/u/657390/blog/755787 分析了MapperMethod从创建到执行的过程,MapperMethod的执行包括执行sql返回结果. 在执行sql和返回结果...

udbwcso ⋅ 2016/11/18 ⋅ 0

mybatis源码分析之事务管理器

上一篇:mybatis源码分析之Configuration 主要分析了构建SqlSessionFactory的过程中配置文件的读取. 这次重点分析mybatis的事务管理器 仍旧从官网给的例子着手分析,配置文件mybatis-config.xm...

udbwcso ⋅ 2016/04/20 ⋅ 0

MybatisExt

MybatisExt 项目扩展自 Mybatis,具有以下特点: 一、运行环境支持 通过指定虚拟机参数,自动加载properties文件中的指定代码块(velocity实现)各种耗性能的操作在生产环境下不会执行 二、内...

歇蹩虎子 ⋅ 2015/12/02 ⋅ 2

bobo/mybatisext

技术讨论 QQ 群 492238239 http://www.oschina.net/p/mybatisext MybatisExt项目扩展自Mybatis,具有以下特点: 一、运行环境支持 通过指定虚拟机参数,自动加载properties文件中的指定代码块...

bobo ⋅ 2015/09/07 ⋅ 0

基于dbunit进行mybatis DAO层Excel单元测试

DAO层测试难点 可重复性,每次运行单元测试,得到的数据是重复的 独立性,测试数据与实际数据相互独立 数据库中脏数据预处理 不能给数据库中数据带来变化 DAO层测试方法 使用内存数据库,如H...

llljj96 ⋅ 2017/05/23 ⋅ 0

早前学习Java记录

Spring 对 iBATIS 的支持】 Spring 通过 DAO 模式,提供了对 iBATIS 的良好支持。 SqlMapClient:是 iBATIS 中的主要接口,通过 xml 配置文件可以让 Spring 容器来管理 SqlMapClient 对象的创...

大风厂蔡成功 ⋅ 2016/07/10 ⋅ 0

【原】配置Log4j,使得MyBatis打印出SQL语句

【配置步骤】 一、mybatis-config.xml 设置MyBatis的Setting(非必须,不同环境下,可能不需要该设置)。 在“src/main/java/resources”目录下,创建mybatis-config.xml文件,并且输入下列内...

spinachgit ⋅ 01/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

在java中读取文件(也支持读取jar中的文件)

getClass().getResourceAsStream("文件名.格式"); 这个方法是用于获取当前类所在目录下的文件;需要将文件放到和当前类同一个包下面 比如我有个类在 com.test这个包下, 要读取一个test.jpg的图...

太黑_thj ⋅ 43分钟前 ⋅ 0

CentOS 7 源码编译安装 MySQL 5.7记录

没事瞎折腾,本来可以yum安装,却偏偏去要编译源码。 1. 安装依赖包 1). 安装cmake等依赖 # yum install cmake ncurses ncurses-devel bison bison-devel 2). 安装boost 1.59.0 # wget htt...

admin_qing ⋅ 45分钟前 ⋅ 0

tcp/ip详解-链路层

简介 设计链路层的目的: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 TCP/IP支持多种链路层协议,如以太网、令牌环往、FDDI、RS-...

loda0128 ⋅ 今天 ⋅ 0

spring.net aop代码例子

https://www.cnblogs.com/haogj/archive/2011/10/12/2207916.html

whoisliang ⋅ 今天 ⋅ 0

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部