首先引入需要的依赖
<!--dom4j依赖-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!--jaxen依赖-->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
jaxen依赖的依赖是dom4j中用到的,所以使用dom4j的时候需要引入jaxen依赖。
项目的目录结构
test.xml文件是mybatis的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/dongmu"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<mappers>
<mapper resource="sqlNapper.xml"/>
</mappers>
</environments>
</configuration>
sqlMapper.xml是配置sql语句的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_ty
pe) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
<select id="selectCarByCarNum" resultType="org.dongmu.pojo.Car">
select id,car_num carNum,brand,guide_price guidePrice,produce_time,
produceTime,car_type carType from t_car where car_num = #{carNum}
</select>
</mapper>
编写代码解析xml文件
package org.dongmu.test;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) throws DocumentException {
// 读取xml文件,获取document对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("test.xml"));
// 获取environments标签的default属性的值
Element environmentsElt = (Element) document.selectSingleNode("/configuration/environments");
// attributeValue可以获取文档的属性值
String defaultId = environmentsElt.attributeValue("default");
System.out.println("environments标签的属性值是:"+defaultId);
// 获取environment标签
Element environmentElt = (Element) environmentsElt.selectSingleNode("/configuration/environments/environment[@id='" + defaultId + "']");
// 获取事务管理器的类型
Element transactionManager = environmentElt.element("transactionManager");
String transactionManagerType = transactionManager.attributeValue("type");
System.out.println("事务管理器的类型是:"+transactionManagerType);
// 获取数据源的类型
Element dataSource = environmentElt.element("dataSource");
Attribute dataSourceType = dataSource.attribute("type");
System.out.println("数据源的类型是:"+dataSourceType);
// 获取数据源的信息并封装到map集合当中
Map<String,String> dataSourceMap = new HashMap<>();
dataSource.elements().forEach(propertyElt->{
dataSourceMap.put(propertyElt.attributeValue("name"), propertyElt.attributeValue("value"));
});
System.out.println("数据源的配置信息如下:");
dataSourceMap.forEach((k,v)-> System.out.println(k+":"+v));
// 获取sqlMapper.xml文件的路径
Element mappersElt = (Element) document.selectSingleNode("/configuration/environments/mappers");
mappersElt.elements().forEach(mapper-> System.out.println("获取sqlMapper.xml文件的路径:"+mapper.attributeValue("resource")));
// 解析sqlmapper.xml
SAXReader mapperReader = new SAXReader();
//这里的配置文件的路径就是上面获取的,这里为了处理方便直接写了sql配置文件的路径
Document mapperDocument = mapperReader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("sqlMapper.xml"));
// 获取namespace
Element mapperElt = (Element) mapperDocument.selectSingleNode("/mapper");
String namespace = mapperElt.attributeValue("namespace");
System.out.println("sqlMapper的namespace属性值是:"+namespace);
// 遍历获取所有的sql
mapperElt.elements().forEach(statementElt->{
// 获取sql标签的标签名
String name = statementElt.getName();
System.out.println("sql标签的标签名是:"+name);
// 如果是select语句,则获取其返回值的类型
if ("select".equals(name)){
String resultType = statementElt.attributeValue("resultType");
System.out.println("select标签的返回值的类型是:"+resultType);
}
// 获取sql语句的id
String id = statementElt.attributeValue("id");
System.out.println("sql语句的id是:"+id);
// 获取需要执行的sql语句
String sql = statementElt.getTextTrim();
System.out.println("待执行的sql语句是:"+sql);
});
}
}
其实在mybatis的底层就是把sql封装成了一个MappedStatement对象,这里面记录了这个sql的各种信息,包括返回值类型,sql语句,返回的结果集,是否使用缓存等等。