微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

聊聊Mybatis的SqlSession

聊聊Mybatis的sqlSession

sqlSessionFactory接口是用来创建sqlSession的,它是一个接口,认实现类是DefaultsqlSessionFactory,DefaultsqlSessionFactory中创建sqlSession有两种方式:

通过连接信息创建sqlSession

一种是调用openSessionFromConnection()来获取sqlSession,也就是通过Connection来创建sqlSession,关键代码

final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      final Transaction tx = transactionFactory.newTransaction(connection);
      final Executor executor = configuration.newExecutor(tx, execType);
      return new DefaultsqlSession(configuration, executor, autoCommit);
  1. 获取Environment对象
  2. 通过Environment对象获取TransactionFactory对象
  3. 通过事务工厂创建事务对象,传入参数是Connection对象
  4. 传入事务对象参数创建出Executor对象
  5. 创建DefaultsqlSession对象来创建sqlSession

    通过数据源创建sqlSession

    另一种方法是openSessionFromDataSource()方法,也就是通过数据源来获取sqlSession,关键代码

final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      final Executor executor = configuration.newExecutor(tx, execType);
      return new DefaultsqlSession(configuration, executor, autoCommit);

整体和第一种一样,只是第三步创建事务对象时候,传入参数是DataSource对象

sqlSession接口是一个重要的接口,它提供增删改查的的执行接口和事务管理的接口,认实现类是DefaultsqlSession,DefaultsqlSession有个Executor成员变量,通过这个执行器进行事务的管理和sql的执行,这里用到了策略模式,Executor就是策略类,它的子类就是具体的策略类,DefaultsqlSession根据不同的策略选择不同Executor来进行事务管理和sql执行,DefaultsqlSession的增删改查的所有方法都是通过Executor实例来进行执行的

sqlSessionManager

sqlSessionManager实现了sqlSessionFactory接口和sqlSession接口,它既可以创建sqlSession,又能对数据库操作,它是sqlSessionFactory的装饰类,sqlSessionManager可以通过openSession()调用sqlSessionFactory创建sqlSession

@Override
  public sqlSession openSession() {
    return sqlSessionFactory.openSession();
  }

sqlSessionManager有个ThreadLocal成员变量: ThreadLocal<sqlSession> localsqlSession = new ThreadLocal<>();

通过ThreadLocal可以调用startManagedSession()实现当前线程和sqlSession的绑定:

public void startManagedSession() {
    this.localsqlSession.set(openSession());
  }

完成绑定后是怎么使用的呢,我们看到sqlSessionManager的构造方法sqlSession实例的创建是通过动态代理来创建的:

this.sqlSessionProxy = (sqlSession) Proxy.newProxyInstance(
        sqlSessionFactory.class.getClassLoader(),
        new Class[]{sqlSession.class},
        new sqlSessionInterceptor());

sqlSessionInterceptor实现InvocationHandler接口进行拦截,首先从sqlSessionManager的localsqlSession从获取sqlSession,如果不为空就直接执行具体方法,否则为调用openSession()方法得到sqlSession,然后执行具体方法,通过源码我们可以看到sqlSessionManager的增删改查方法都是通过代理类sqlSessionProxy来调用的具体方法

总结

本篇文章讲了sqlSession接口和它的认实现类DefaultsqlSession,它有个Executor实例作为成员变量,增删改查需要Executor实例来执行sqlsqlSessionFactory是创建sqlSession的接口,认实现类是DefaultsqlSessionFactory,它可以通过DataSource实例或Connection得到事务实例从而创建sqlSession实例,sqlSessionManager实现了sqlSession接口和sqlSessionFactory接口,增删改查使用代理类执行,sqlSession使用ThreadLocal来存储,避免一个线程重复创建sqlSession

原文地址:https://www.jb51.cc/wenti/3279070.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐