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–>