xml文件是如何被读取的

XPathParser的作用

在java中xml文件被读取的方式有哪几种

在xml文件被读取的方式有:Dom、SAX、Xpath;

mybatis中读取mybatis-config.xml文件用的是Xpath(Xpat也是最简单)

简述mybatis对mybatis-config.xml的操作

通过Xpath将xml封装成XpathParser,然后将XpathParser封装封xNodes对象

OXM

Object xml Mapping(对象 xml文件 映射)

ORM

Object Relational Mapping

模拟Mybatis中读取mybatis-config.xml文件

准备工作:

User对象

package com.baizhi.xml;

public class User {
    private String name;
    private String password;

    public User() {
    }

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

user.xml

<users>
    <user>
        <name>zhangsan</name>
        <password>123456</password>
    </user>
    <user>
        <name>lisi</name>
        <password>654321</password>
    </user>
</users>

Test测试:

package com.baizhi.test;

import com.baizhi.xml.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.parsing.XNode;
import org.apache.ibatis.parsing.XPathParser;
import org.junit.Test;

import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;


public class XpathParset {
    /**
     * 用于测试:
     */
    @Test
    public void test() throws IOException {
        Reader reader = Resources.getResourceAsReader("user.xml");
        XPathParser xPathParser = new XPathParser(reader);
        List<XNode> xNodes = xPathParser.evalNodes("/users/*");
        xNodes.forEach(xNode -> System.out.println(xNode));
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        List<User> users = new ArrayList<>();
        xNodes.stream().map(xNode -> {
            User user = new User();
            List<XNode> children = xNode.getChildren();
            user.setName(children.get(0).getStringBody());
            user.setPassword(children.get(1).getStringBody());
            users.add(user);
            return user;
        }).collect(Collectors.toList());
        users.forEach(user -> System.out.println("user = " + user));
    }
}

回顾之前的代码

InputStream inputStream = Resources.getInputStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

XPathParser xPathParser = new XPathParser(reader);

进行对比

追踪如下:

build–>在这里插入图片描述

build–>在这里插入图片描述

parser.parse()–>在这里插入图片描述

parseConfiguration–>在这里插入图片描述

Mapper.xml是如何被调用的

mapperElement–>mapperParser.parse();在这里插入图片描述

mapperParser.parse();–>在这里插入图片描述

configurationElement–>在这里插入图片描述

在这里插入图片描述

statementParser.parseStatementNode();–>在这里插入图片描述

在这里插入图片描述

builderAssistant.addMappedStatement–>典型的构建者模式在这里插入图片描述

进行封装到configuration中通过addMappedstatement在这里插入图片描述

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);的另一个作用

创建SqlSession解析如下:

build–>在这里插入图片描述

DefaultSqlSessionFactory–>在这里插入图片描述

进行分析:

在这里插入图片描述

由于build方法是目的是创建SqlSessionFactory而DefaultSqlSessionFactory的构造方法是创建SqlSessionFactory,所以不用看源码就可以进行分析openSession()方法是DefaultSqlSessionFactory的方法

openSession方法

在这里插入图片描述

openSessionFromDataSource–>在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值