使用 dom4j 技术解析 sql-mapper-config.xml 配置文件

268 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 21 天,点击查看活动详情

上期课程中,完成创建两个 JavaBean。在这期课程中,我们使用 dom4j 技术解析核心配置文件,将解析出来的信息封装到 Configuration 容器对象中。

解析核心配置文件思路分析回顾

创建 SqlSessionFactoryBuilder 类,在这个类中创建 build 方法,build 方法能够正常执行,需要参数,这个参数就是前面加载的核心配置文件存在内存的输入字节流(inputStream),在这一步执行中,只需要包前面加载好的字节输入流(inputStream)传递过来即可,这就是本期课程要完成功能。

当 build 方法接收到这个 inputStream 之后,它需要完成两个功能、第一个,就需要使用 dom4j 技术解析配置文件,并将解析出来的信息封装到 Configuration 容器对象。第二个,它将要来创建 SqlSessionFactory 对象,这个 SqlSessionFactory 是 SqlSession 的一个工厂对象,主要的职责就是用来生产 SqlSession 绘画对象的。

接下来我们就按照这个思路来进行一下具体的代码编写与实现。

引入依赖

要使用 dom4j 解析配置文件,需要在 pom.xml 文件导入相关依赖。方便后面代码编写,这里把所有需要使用的依赖都导入到项目中。

<!-- MySQL 依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>
<!-- 数据库连接池依赖-->
<dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
</dependency>
<!-- 日志输出依赖 -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<!-- 单元测试依赖-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>
<!-- 解析配置文件依赖-->
<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>

<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.1.6</version>
</dependency>

创建 SqlSessionFactoryBuilder 类

在自定义持久层框架的项目中创建 SqlSessionFactoryBuilder 类,这个类中我们要去提供一个 build() 方法。build() 方法返回值是 SqlSessionFactory 工厂,同时需要一个 InputStream 类型的参数。

public class SqlSessionFactoryBuilder {
    public SqlSessionFactory build(InputStream inputStream) throws DocumentException, PropertyVetoException {


        // 使用 dom4j 技术解析配置文件,将解析出来的信息封装到 Configuration 容器对象中


        XMLConfigBuider xmlConfigBuider = new XMLConfigBuider();


        // 再次封装
        Configuration configuration = xmlConfigBuider.parseConfig(inputStream);


        // 创建 SqlSessionFactory 对象
    }
}

在 SqlSessionFactoryBuilder 类的 build() 方法中,目前只实现以上功能,在后期课程中,一步一步实现,请您不要着急,认真跟着课程学习。

创建 XMLConfigBuilder 类

我们可以将实现解析整个配置文件的程序编写在 build 方法中,但是我们也可以创建一个对象,在进行一次封装,将解析整个配置文件过程的程序编写在这个对象中 parseConfig() 方法里,这样实现目的方便维护,同时代码层次结构更加清晰。

parseConfig() 方法的返回值是 Configuration 对象,同时还需要接受一个 InputStream 类型的参数,这个参数就是 sql-mapper-config.xml 通过加载形成的字节输入流,通过层层传递。

这里,我们使用容器来存放遍历 List 集合中 property 元素中 name 和 value 值,可以使用的容器有很多,常见有 Map、Properties,这里 Properties 容器存放。

解决数据库连接频繁创建和释放,使用数据库连接 c3p0 来解决。

public class XMLConfigBuider {

    private Configuration configuration;

    public XMLConfigBuider() {
        this.configuration=new Configuration();
    }


    /**
     * 该方法就是使用 dom4j 配置文件进行解析,封装 Configuration
     * @param inputStream
     * @return
     */
    public Configuration parseConfig(InputStream inputStream) throws DocumentException, PropertyVetoException {


        Document document = new SAXReader().read(inputStream);


        //获取到核心配置文件的根 <configution> 元素
        Element rootElement = document.getRootElement();
        //获取 <property> 元素,并且是一个 List 集合
        List<Element> list = rootElement.selectNodes("//property");


        // 用于存储 <property> 元素中 name 和 value
        Properties properties = new Properties();


        //使用 for 循环遍历,获取 <property> 元素中 name 和 value
        for (Element element : list) {


            String name = element.attributeValue("name");
            String value = element.attributeValue("value");
            properties.setProperty(name,value);


        }


        //创建数据源对象,通过使用连接池方式来实,解决了数据库频繁创建和释放
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setDriverClass(properties.getProperty("driverClass"));
        comboPooledDataSource.setDriverClass(properties.getProperty("jdbcUrl"));
        comboPooledDataSource.setUser(properties.getProperty("username"));
        comboPooledDataSource.setPassword(properties.getProperty("password"));


        configuration.setDataSource(comboPooledDataSource);
        
        // mapper.xml 解析,下期课程中实现
        
        return null;
    }
}

介绍到目前为止,使用 dom4j 技术把整个核心配置文件解析完成。下期课程中,使用 dom4j 技术解析 mapper.xml 映射配置文件。

小结

本期课程中,相对前面课程,难度稍微有点大,我们学习就是这样由易到难,一步一步实现。本期课程内容不多,首先回顾前面分析,并且引入自定义持久层框架时需要第三方依赖,其次创建 SqlSessionFactoryBuilder 类,创建 XMLConfigBuilder 类,目的进一步封装 dom4j 技术解析配置文件过程。在 XMLConfigBuilder 类的 parseConfig() 方法中完成核心配置解析,同时使用 c3p0 连接池解决原生 JDBC 中数据库频繁创建和释放问题。