registrar aprendizagem
Estou aprendendo mybatis e estou muito curioso para saber como o mybatis carrega mybatis.config.xml, então fiz uma pequena demonstração para consolidar meu aprendizado.
mybatis-config.xml é colocado no caminho de classe
confiar:
<!-- 使用dom4j解析xml文件-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!-- jaxen实现了xPath的规范,否则无法使用xPath来解析xml文件 -->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
Código de teste de unidade Junit:
Obtenha elementos xml do caminho raiz e use xPath para obter elementos
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
/**
*
*/
/**
* Dom4j会将 XML 看成一个 Document 对象,将 XML 标签看成 Element 对象。
* 读取
* 首先,我们需要实例化 SAXReader 类,它是读取 XML 文件的核心类。调用其 read 方法读取 xml 文件,会生成一个 Document 对象。
*/
public class howToUseDom4j {
@Test
public void howToUse() throws DocumentException {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"));
// 可以通过document对象获取根节点等 【[Element: <configuration attributes: []/>]】
Element rootElement = document.getRootElement();
// 通过根节点可以递归依次拿到所有的元素已经其属性
List<Element> elements = rootElement.elements();
getChildrenElement(elements);
}
public void getChildrenElement(List<Element> elements){
for (Element element:
elements) {
List<Attribute> attributes = element.attributes(); // 获取当前element的属性集合
for (Attribute attribute:
attributes) {
System.out.println(element.getName()+"【"+attribute.getName()+"-->"+attribute.getValue()+"】");
}
List<Element> elementChildren = element.elements();
if (elementChildren!=null){
getChildrenElement(elementChildren);
}
}
}
/**
* 使用xPath解析config文件
* XPath 通过类似于文件系统路径的方式来描述 XML 文档中的节点和属性,是一种规范所以使用XPath需要导入jaxen jar包
* 这里做一个mybatis-config.xml 中 拿到文件中的默认环境中的值的demo
*/
@Test
public void parseXmlByXPath() throws DocumentException {
// 1.获取xml文件的document文档对象
Document document = new SAXReader().read(ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"));
// 2.创建xPath,从根标签开始查找所需语义化标签
String rootPath ="/configuration";
String xPath = rootPath+"/environments";
// 使用父转子之前最好进行Null判断【这里就不判断了】
// 3.默认数据库的id
Element environments = (Element)document.selectSingleNode(xPath); // Node功能太有限了使用强制类型转换【父转子】
String envDefaultId = environments.attribute("default").getValue(); // 获取多环境的默认id
// 4.拿到environments下的id为envDefault的 environment标签【默认数据库】
// ps:在使用爬虫的时候经常会使用xPath,不仅仅是xml文件,html同样适用
// /configuration/environments/environment[@id='development'] 'development' 是期望的属性值。只有当 id 属性的值等于 "development" 时,才会选中该 environment 元素。
xPath = xPath+"/environment[@id='"+envDefaultId+"']";
System.out.println(xPath);
Element environment = (Element)document.selectSingleNode(xPath); // 获取
System.out.println("默认使用的数据库环境为:"+environment.getName()+"【"+environment.attribute("id").getName()+"="+environment.attribute("id").getValue()+"】");
// 同样可以遍历environment下的属性
List<Element> elements = environment.elements();
getChildrenElement(elements);
}
}
Menos comentários:
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
public class Dom4jParseMybatisConfigTest {
@Test
public void testParseMybatisConfig() throws DocumentException {
// 这里使用xPath来解析mybatis-config.xml
// 1.通过SAXReader对象解析mybatis-config.xml为document对象
Document document = new SAXReader().read(ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"));
// 2.使用xPath读取到environments的default属性【默认使用的数据库环境】
String xPath = "/configuration/environments";
Element environmentsEle = (Element) document.selectSingleNode(xPath); // 拿到environmentsEle节点
String envDefault = environmentsEle.attribute("default").getValue(); // 获取default的value
System.out.println("默认数据库环境:-->"+envDefault);
// 3.找到默认的environment
// /configuration/environments/environment[@id='development'] 'development' 是期望的属性值。只有当 id 属性的值等于 "development" 时,才会选中该 environment 元素。
xPath = "//environment[@id='"+envDefault+"']"; // 从当前元素开始 需要俩个斜杠
Element environment = (Element)environmentsEle.selectSingleNode(xPath);
// 4.拿到事务管理器
Element transactionMagEle = (Element) environment.selectSingleNode("//transactionManager");
System.out.println("事务管理器:-->"+transactionMagEle.attribute("type").getValue());
// 5.拿到数据源
Element dataSourceEle = (Element) environment.selectSingleNode("//dataSource");
System.out.println("数据源Type:-->"+dataSourceEle.attribute("type").getValue());
// 6.依次拿到driver,url,username,password
List<Element> elements = dataSourceEle.elements();
elements.forEach(element -> {
Attribute attribute = element.attribute("name");
Attribute attributeVal = element.attribute("value");
System.out.print(attribute.getValue()+"=");
System.out.println(attributeVal.getValue());
});
// 6.拿到mappers标签
Element mappersEle = (Element) document.selectSingleNode("/configuration/mappers");
List<Element> mapperList = mappersEle.elements();
mapperList.forEach(mapper->{
Attribute resource = mapper.attribute("resource");
System.out.println("resource="+resource.getValue());
});
}
/**
* 解析xml文件
*/
@Test
public void testParseXml() throws DocumentException {
Document document = new SAXReader().read(ClassLoader.getSystemClassLoader().getResourceAsStream("DeptMapping.xml"));
// RootElement 【由xml文件中的 <!DOCTYPE mapper 决定】
Element mapper = document.getRootElement();
List<Element> elements = mapper.elements();
for (Element element:
elements) {
System.out.println("mapper的id="+element.attribute("id").getValue());
System.out.println("SQL="+element.getTextTrim());
}
}
}
Resultados de saída do teste de unidade HowToUse
ambientes【padrão-->desenvolvimento】
ambiente【id-->desenvolvimento】
transactionManager【tipo-->JDBC】
dataSource【tipo-->POOLED】
propriedade【nome-->driver】
propriedade【valor-->com.mysql. cj.jdbc.Driver】
propriedade【nome-->url】
propriedade【valor-->jdbc:mysql://localhost:3306/empresa】
propriedade【nome-->nome de usuário】
propriedade【valor-->raiz】
propriedade【 nome-->senha】
propriedade【valor-->123456】
ambiente【id-->mybatisDb】
transactionManager【tipo-->JDBC】
dataSource【tipo-->UNPOOLED】
propriedade【nome-->driver】
propriedade【valor- ->com.mysql.cj.jdbc.Driver】
propriedade【nome-->url】
propriedade【valor-->jdbc:mysql://localhost:3306/curd_servlet】
propriedade【nome-->nome de usuário】
propriedade【valor-->raiz】
propriedade【nome-->senha】
propriedade【valor-->123456】
mapeador【recurso-->DeptMapping.xml】
resultados de saída do teste de unidade parseXmlByXPath
/configuration/environments/environment[@id='development']
默认使用的数据库环境为:environment【id=development】
transactionManager【type-->JDBC】
dataSource【type-->POOLED】
property【name-->driver 】
propriedade【valor-->com.mysql.cj.jdbc.Driver】
propriedade【nome-->url】
propriedade【valor-->jdbc:mysql://localhost:3306/empresa】
propriedade【nome-->nome de usuário 】
propriedade【valor-->raiz】
propriedade【nome-->senha】
propriedade【valor-->123456】