mybatis的运行原理
发布日期:2021-05-07 21:06:07 浏览次数:14 分类:精选文章

本文共 2628 字,大约阅读时间需要 8 分钟。

MyBatis框架运行原理解析:从配置到Session的完整流程

MyBatis是一个功能强大的动态SQL框架,广泛应用于Java后端开发中。其运行机制涉及多个核心组件和配置文件,以下将从配置加载到Session创建的完整流程进行详细解析。

首先,MyBatis运行开始时,通过 Resources类加载磁盘上的核心配置文件到内存中,获取一个输入流。具体来说,使用以下代码获取配置文件:

InputStream is = Resources.getResourceAsStream("mybatis.xml");

接下来,通过输入流作为参数传递给XMLConfigBuilder类,创建一个XMLConfigBuilder对象。XMLConfigBuilder对象调用parse方法,解析配置文件内容,返回一个Configuration对象。这个Configuration对象保存了磁盘中核心配置文件的信息,随后传递给DefaultSqlSessionFactory类,生成一个DefaultSqlSessionFactory对象。

在代码中,可以看到以下操作:

// 生成DefaultSqlSessionFactory对象
factory = new SqlSessionFactoryBuilder().build(is);

MyBatis内部执行的build方法如下:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
SqlSessionFactory localSqlSessionFactory = build(parser.parse());
return localSqlSessionFactory;
} catch (Exception e) {
finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
}
}
}
}

这个方法首先创建一个XMLConfigBuilder对象,通过parse方法解析配置文件,获取Configuration对象,然后使用DefaultSqlSessionFactory类构建SqlSessionFactory对象。

接下来,获取SqlSessionFactory对象后,调用openSession方法创建一个DefaultSqlSession对象(Session)。openSession方法内部执行如下:

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, 
boolean autoCommit) {
Exception exception;
Transaction tx = null;
DefaultSqlSession defaultSqlSession;
try {
Environment environment = configuration.getEnvironment();
TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
org.apache.ibatis.executor.Executor executor = configuration.newExecutor(tx, execType);
defaultSqlSession = new DefaultSqlSession(configuration, executor, autoCommit);
} catch (Exception e) {
closeTransaction(tx);
throw ExceptionFactory.wrapException(
new StringBuilder().append("Error opening session. Cause: ").append(e).toString(), e);
} finally {
ErrorContext.instance().reset();
}
return defaultSqlSession;
throw exception;
}

这个方法首先获取Environment对象,获取TransactionFactory对象,创建一个Transaction对象,通过newExecutor方法创建Executor对象,最后创建DefaultSqlSession对象。

在操作完成后,需要正确关闭Session资源。MyBatis框架在事务管理方面表现尤为出色,支持事务提交和回滚功能。具体操作如下:

// 调用SQL代码
sqlSession.insert("insertStatement");
// 事务提交或回滚
sqlSession.commit();

通过这种方式,可以确保数据库操作的原子性和一致性,避免数据不一致或丢失。

上一篇:导出zip功能的实现
下一篇:关联查询的实现方法-使用mybatis框架

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月14日 11时24分13秒