`
longgangbai
  • 浏览: 7330218 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

看看mybatis 源代码

阅读更多

1.SqlSessionFactory 
               每个ibatis应用都应该只有一个SqlSessionFactory的实例对象,所以一般设置为static属性或者使用spring管理时返回singleton类型,与spring集成时其实也是写一个怎样构建SqlSessionFactory的Bean, 
构建SqlSessionFactory一般是SqlSessionFactoryBuild通过读取ibatis的配置文件而进行build的: 
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml"); 
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuild().build(reader); 

 

2.SqlSession 

  用于执行sql命令,获取Mappers并管理事务.
 可以从SqlSessionFactory得到SqlSession: sessionFactory.openSession(); 
SqlSession是一切Sql相关数据库操作的中心,insert,select,update,delete... 
SqlSession不是线程安全的(也就是有状态的),所以它的作用域最好是在一个Thread下,每个Thread有自己的SqlSession对象实例,彼此不相关. 
Never keep references to a SqlSession instance in a static field or even an instance field of a class.  Never keep references to a 
SqlSession in any sort of managed scope, such as HttpSession of of the Servlet framework. 

默认sessionFacory.openSession()拿到的SqlSession不是自动commit的,所以如果是更新操作必须自己执行session.commit() 
关闭SqlSession很重要,必须保证在线程结束时关闭这个SqlSession,可以在finally中 
session.close(); 
           那跟Spring集成是怎样做到这一点的呢,因为dataSource是由spring管理的,所以他可以保证在一个Thread的每个方法中拿到的Connection是同一个对象, 
          虽然每个方法从sessionFactory.openSession()拿到的SqlSession对象是不同的,但是sqlSession对象中的connection是相同的,所以spring就可以在service层的方法结束之前将这个connection commit跟close,这样就实现了事务控制. 
           我们往往在dao层是一个方法对应一个sql语句的,不在这里控制事务,控制事务应该在service层, dao的每个方法拿到的sqlsession对象都是不相同的(尽管它的connection可能相同). 
那我们应该怎样在没有spring的情况下实现ibatis的事务控制呢?还要保持dao的结构,以保持能跟spring随时切换?
看来ThreadLocal要派上用场了 

SqlSessionManager实现了SqlSessionFactory, SqlSession接口.

类中的实例变量如下:

 private final SqlSessionFactory sqlSessionFactory;
  private final SqlSession sqlSessionProxy;

  private ThreadLocal<SqlSession> localSqlSession = new ThreadLocal<SqlSession>();

 

由ThreadLocal<SqlSession>可以看出threadlocal为mybatis的sqlsession提供了线程安全.

 

SqlSessionManager实现的代理类实现如下:

内部类

private class SqlSessionInterceptor implements InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      final SqlSession sqlSession = SqlSessionManager.this.localSqlSession.get();
      if (sqlSession != null) {
        try {
          return method.invoke(sqlSession, args);
        } catch (Throwable t) {
          throw ExceptionUtil.unwrapThrowable(t);
        }
      } else {
        final SqlSession autoSqlSession = openSession();
        try {
          final Object result = method.invoke(autoSqlSession, args);
          autoSqlSession.commit();
          return result;
        } catch (Throwable t) {
          autoSqlSession.rollback();
          throw ExceptionUtil.unwrapThrowable(t);
        } finally {
          autoSqlSession.close();
        }
      }
    }
  }

 

由上可以看出,mybatis执行方式时候需要采用jdk代理模式,实现事务的控制.

 

 

在SqlSessionManager的构造函数的具体实现如下:

 

 

 

  private SqlSessionManager(SqlSessionFactory sqlSessionFactory) {
    this.sqlSessionFactory = sqlSessionFactory;
    this.sqlSessionProxy = (SqlSession) Proxy.newProxyInstance(
        SqlSessionFactory.class.getClassLoader(),
        new Class[]{SqlSession.class},
        new SqlSessionInterceptor());
  }

 由上可以看出SqlSessionInterceptor代理类代理的接口为SqlSession.

 

所以说SqlSessionFactory 为线程安全的,SqlSession为线程非安全性的类,但是控制事务的执行.

分享到:
评论
1 楼 lgh1992314 2018-10-23  
[u][i][b]
[flash=200,200][url][img][list]
[*]
引用
[/list][/img][/url][/flash]
[/b][/i][/u]

相关推荐

    mybatis项目源代码

    标题 "mybatis项目源代码" 暗示我们即将探讨的是MyBatis框架与Spring集成的项目源码。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Spring框架则是一个全面的企业级应用开发框架,提供...

    Mybatis的代码实例

    首先,我们来看Mybatis的基本概念。Mybatis的核心组件有三个:SqlSessionFactory、SqlSession和Mapper。SqlSessionFactory是创建SqlSession的工厂,SqlSession则用于执行SQL语句,而Mapper接口则对应数据库中的表,...

    mybatis入门学习的完整项目代码

    - `src/main/java`:Java 源代码目录,包含业务逻辑类、DAO 接口及其实现类。 - `src/main/resources`:资源文件目录,这里通常会放置 MyBatis 的配置文件、Mapper XML 文件等。 - `pom.xml`:Maven 项目配置文件...

    mybatis demo

    首先,我们来看看MyBatis的基本概念和功能。MyBatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通...

    myBatis自动生成代码案例

    MBG是一个能够根据数据库表结构自动生成Java源代码和XML配置文件的工具。它可以生成Model对象、Mapper接口和XML配置文件,以及Service和DAO实现类等,这些代码通常用于处理数据库的CRUD(Create、Read、Update、...

    mybatis spring 多数据源

    标签中的"源码"可能指的是理解MyBatis和Spring框架内部如何处理多数据源的关键代码,这有助于我们更深入地定制和优化解决方案。"工具"可能是指像Druid、HikariCP这样的数据库连接池,它们在多数据源配置中起着至关...

    mybatis批处理自动生成代码文件

    例如,`targetProject`属性指定生成的Java文件存放的位置,如`src\main\java`,这意味着生成的Java类将被放置在项目的源代码目录下。你可以根据实际项目结构调整这个路径,确保生成的代码能正确地整合到你的工程中。...

    mybatis-3.2.2-javadoc.jar

    想要学习mybatis 3.2.2 源代码的童鞋可以下载去看看

    mybatis3 物理分页源代码

    首先,我们来看Interceptor接口。在Mybatis中,拦截器扮演着关键角色,它允许我们在特定的执行点(如SQL语句的准备、执行等)插入自定义的行为。`Interceptor`接口提供了`intercept`方法,这个方法会在目标方法执行...

    mybatis-plus 代码生成器

    `src` 目录通常包含源代码文件,按照 Java 的标准目录结构,可以分为 `src/main/java`(Java 源代码)和 `src/main/resources`(资源文件)。在 `java` 目录下,你可能会看到类似 `...

    springmybatis

    mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...

    springboot mybatis 集成多数据源 两种实现方式

    首先,我们来看第一种实现方式:静态添加数据源。这种方式适用于数据源数量固定且不会频繁变动的场景。在Spring Boot中,我们可以利用`@ConfigurationProperties`注解来加载配置文件中的数据源属性,然后通过`...

    springMVC_mybatis代码

    7. **MyBatis配置**:MyBatis的配置文件(`mybatis-config.xml`)定义了数据源、事务管理器等,Mapper的XML文件(如`UserMapper.xml`)则包含了具体的SQL语句。 在实际运行中,当用户发起一个HTTP请求时,Spring ...

    mybatis-3-config.dtd mybatis-3-mapper.dtd

    首先,我们来看`mybatis-3-config.dtd`。这个文件是MyBatis配置文件的DTD,用于验证`mybatis-config.xml`文件的语法是否正确。`mybatis-config.xml`是MyBatis的全局配置文件,包含了数据库连接、事务管理、类型别名...

    springboot+mybatis多数据源配置下载

    首先,我们来看标题中的"springboot+mybatis多数据源配置"。在Spring Boot中,多数据源配置意味着应用程序需要连接并管理多个数据库。这通常涉及以下几个步骤: 1. **引入依赖**:在`pom.xml`或`build.gradle`文件...

    传智播客mybatis笔记

    在深入探讨MyBatis之前,我们先来看看使用原始JDBC编程时可能会遇到的一些问题: 1. **数据库连接的创建与释放**:在传统JDBC编程中,数据库连接的创建与释放是非常频繁的操作,这会导致大量的系统资源消耗,进而...

    Mybatis Generator代码生成

    配置文件是Mybatis Generator的核心,它定义了数据源、生成的目标目录、生成的代码类型等关键信息。例如,我们需要指定数据库连接URL、用户名、密码,以及想要生成的代码的包名和类名。在配置文件中,我们还可以定制...

    mybatis-3.4.6 jar包和源码

    在`mybatis-3.4.6.zip`中,你可以找到MyBatis的源代码,这对于学习和理解MyBatis的工作原理非常有帮助。源码中,你可以看到如SqlSessionManager、Executor、ParameterHandler等核心类的实现,以及Mapper接口和XML...

Global site tag (gtag.js) - Google Analytics