手写MyBatis ORM框架(四)

手写MyBatis ORM框架(四)

引言

在上一部分我们完成了解析XML配置的功能,这一部分呢就是把解析的SQL信息放到我们的JDBC中执行,也就是解析我们的数据源配置。这些数据源解析完成之后,就要创建我们的数据源的一个工厂,以及事务工厂进行一个处理。

开始

建立数据源连接池和 JDBC 事务工厂操作,并以 xml 配置数据源信息为入口,在 XMLConfigBuilder 中添加数据源解析和构建操作,向配置类configuration添加 JDBC 操作环境信息。以便在 DefaultSqlSession 完成对 JDBC 执行 SQL 的操作。

创建Transaction接口

定义标准的事务接口,连接、提交、回滚、关闭,由不同的事务方式进行实现。

创建JdbcTransaction以及其工厂类

在这个实现类中,我们实现了接口中的方法。

之后我们再通过对应的工厂进行创建。

在工厂的构造方法中包含 指定数据源,事物的隔离级别,以及是否自动提交

创建类型别名注册器TypeAliasRegistry

我们不难看出 它是使用一个map进行别名的存储,它在构造方法之中就已经将我们常用的基本数据类型进行注册了。

registerAlias("string", String.class); // 基本包装类型 registerAlias("byte", Byte.class); registerAlias("long", Long.class); registerAlias("short", Short.class); registerAlias("int", Integer.class); registerAlias("integer", Integer.class); registerAlias("double", Double.class); registerAlias("float", Float.class); registerAlias("boolean", Boolean.class);

这也就是我们在mybatis可以直接使用他们的原因。

那我们的JdbcTransaction是在哪里注册的呢?

在我们Configuration构造函数中。

解析数据源配置

在我们的XMLConfigBuilder中我们会通过environmentsElement方法解析我们的environments标签,

将这些内容导入到我们的Configuraion中进行存放。

<environments default="development">

<environment id="development">

<transactionManager type="JDBC"/>

<dataSource type="POOLED">

<property name="driver" value="com.mysql.cj.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://127.0.0.1:3309/mybatis?useUnicode=true&characterEncoding=utf8"/>

<property name="username" value="root"/>

<property name="password" value="root"/>

</dataSource>

</environment>

</environments>

使用数据源以及事务工厂

在我们openSession()之中会先创建一个事务工厂 在这个工厂里面我们会返回一个事务,就比如默认的JDBCTransaction

这个是我们获取连接的方法

Environment environment = configuration.getEnvironment();
Connection connection = environment.getDataSource().getConnection();

而正如我们上面的,这个JdbcTransaction中就有我们获取连接的方法。

@Override
public Connection getConnection() throws SQLException {
    if (null != connection) {
        return connection;
    }
    connection = dataSource.getConnection();
    connection.setTransactionIsolation(level.getLevel());
    connection.setAutoCommit(autoCommit);
    return connection;
}

最后

关于对MyBatis源码的学习,参考了https://bugstack.cn/ 这个大佬的文章,我就是在这里学会的,同时这位大佬还分享了很多其他的知识,让我受益匪浅,大家可以点击去学习,十分感谢。

todo

延迟加载

LICENSED UNDER CC BY-NC-SA 4.0