Mybatis开发 – SqlSession创建过程

1.Myabtis中SqlSession的使用SqlSession是通过SqlSessionFactory创建的,创建后可以执行一系列的数据库操

1.Myabtis中SqlSession的使用

SqlSession是通过SqlSessionFactory创建的,创建后可以执行一系列的数据库操作,如果不是自动提交且执行了数据库DML语句,需要手动执行commit方法,在使用完后需要将SqlSession显式关闭。

		SqlSession session = null;
		try {
			...
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
			session = factory.openSession();
			...
			session.commit();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(session != null) {
				session.close();
			}
		}

2.SqlSessionFactory创建SqlSession

SqlSessionFactory是一个接口,定义了一系列的生成SqlSession的方法

Mybatis开发 - SqlSession创建过程

SqlSessionFactory类方法

SqlSessionFactory的默认实现是DefaultSqlSessionFactory,DefaultSqlSessionFactory类里面包含了一个Configuration对象,它是通过解析Mybatis配置文件后生成的对象

接下来详细查看openSession()方法,方法返回一个SqlSession对象,没有输入参数

方法中会调用openSessionFromDataSource方法,传入的出参数ExecutorType从Configuration对象中获取,TransactionIsolationLevel为null,autoCommit默认为false;该方法不会自动提交,如果需要自动提交则可调用openSession(true)方法

 	public SqlSession openSession() {
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
    }

2.1Executor对象创建

在openSessionFromDataSource方法中,会通过Configuration对象获取Environment等信息来创建Executor对象

具体创建过程:Mybatis开发 – Executor的创建及作用

然后会创建一个DefaultSqlSession的实例,构造方法中传入Configuration、Executor 和 autoCommit的值

 	private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
        Transaction tx = null;

        DefaultSqlSession var8;
        try {
            Environment environment = this.configuration.getEnvironment();
            TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
            tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
            Executor executor = this.configuration.newExecutor(tx, execType);
            var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
        } catch (Exception var12) {
            this.closeTransaction(tx);
            throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
        } finally {
            ErrorContext.instance().reset();
        }

        return var8;
    }

3.DefaultSqlSession对象创建

DefaultSqlSession是SqlSession的默认实现类

在构造方法中,传入Configuration、Executor和autoCommit对象进行赋值

public class DefaultSqlSession implements SqlSession {
    private final Configuration configuration;
    private final Executor executor;
    private final boolean autoCommit;
    private boolean dirty;
    private List<Cursor<?>> cursorList;

    public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
        this.configuration = configuration;
        this.executor = executor;
        this.dirty = false;
        this.autoCommit = autoCommit;
    }
	...
}

SqlSession是一个接口,在接口中定义了一系列数据库操作方法

Mybatis开发 - SqlSession创建过程

4.总结

SqlSession的默认实现类是DefaultSqlSession,在创建过程中,主要通过配置文件对应的Configuration对象来创建Executor对象,然后将Configuration、Executor和autoCommit通过构造方法进行赋值

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/8254.html

(0)
上一篇 2023年 4月 21日 下午8:53
下一篇 2023年 4月 21日 下午8:53

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信