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为线程非安全性的类,但是控制事务的执行.
相关推荐
标题 "mybatis项目源代码" 暗示我们即将探讨的是MyBatis框架与Spring集成的项目源码。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Spring框架则是一个全面的企业级应用开发框架,提供...
首先,我们来看Mybatis的基本概念。Mybatis的核心组件有三个:SqlSessionFactory、SqlSession和Mapper。SqlSessionFactory是创建SqlSession的工厂,SqlSession则用于执行SQL语句,而Mapper接口则对应数据库中的表,...
- `src/main/java`:Java 源代码目录,包含业务逻辑类、DAO 接口及其实现类。 - `src/main/resources`:资源文件目录,这里通常会放置 MyBatis 的配置文件、Mapper XML 文件等。 - `pom.xml`:Maven 项目配置文件...
首先,我们来看看MyBatis的基本概念和功能。MyBatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通...
MBG是一个能够根据数据库表结构自动生成Java源代码和XML配置文件的工具。它可以生成Model对象、Mapper接口和XML配置文件,以及Service和DAO实现类等,这些代码通常用于处理数据库的CRUD(Create、Read、Update、...
标签中的"源码"可能指的是理解MyBatis和Spring框架内部如何处理多数据源的关键代码,这有助于我们更深入地定制和优化解决方案。"工具"可能是指像Druid、HikariCP这样的数据库连接池,它们在多数据源配置中起着至关...
例如,`targetProject`属性指定生成的Java文件存放的位置,如`src\main\java`,这意味着生成的Java类将被放置在项目的源代码目录下。你可以根据实际项目结构调整这个路径,确保生成的代码能正确地整合到你的工程中。...
想要学习mybatis 3.2.2 源代码的童鞋可以下载去看看
首先,我们来看Interceptor接口。在Mybatis中,拦截器扮演着关键角色,它允许我们在特定的执行点(如SQL语句的准备、执行等)插入自定义的行为。`Interceptor`接口提供了`intercept`方法,这个方法会在目标方法执行...
`src` 目录通常包含源代码文件,按照 Java 的标准目录结构,可以分为 `src/main/java`(Java 源代码)和 `src/main/resources`(资源文件)。在 `java` 目录下,你可能会看到类似 `...
mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...
首先,我们来看第一种实现方式:静态添加数据源。这种方式适用于数据源数量固定且不会频繁变动的场景。在Spring Boot中,我们可以利用`@ConfigurationProperties`注解来加载配置文件中的数据源属性,然后通过`...
7. **MyBatis配置**:MyBatis的配置文件(`mybatis-config.xml`)定义了数据源、事务管理器等,Mapper的XML文件(如`UserMapper.xml`)则包含了具体的SQL语句。 在实际运行中,当用户发起一个HTTP请求时,Spring ...
首先,我们来看`mybatis-3-config.dtd`。这个文件是MyBatis配置文件的DTD,用于验证`mybatis-config.xml`文件的语法是否正确。`mybatis-config.xml`是MyBatis的全局配置文件,包含了数据库连接、事务管理、类型别名...
首先,我们来看标题中的"springboot+mybatis多数据源配置"。在Spring Boot中,多数据源配置意味着应用程序需要连接并管理多个数据库。这通常涉及以下几个步骤: 1. **引入依赖**:在`pom.xml`或`build.gradle`文件...
在深入探讨MyBatis之前,我们先来看看使用原始JDBC编程时可能会遇到的一些问题: 1. **数据库连接的创建与释放**:在传统JDBC编程中,数据库连接的创建与释放是非常频繁的操作,这会导致大量的系统资源消耗,进而...
配置文件是Mybatis Generator的核心,它定义了数据源、生成的目标目录、生成的代码类型等关键信息。例如,我们需要指定数据库连接URL、用户名、密码,以及想要生成的代码的包名和类名。在配置文件中,我们还可以定制...
在`mybatis-3.4.6.zip`中,你可以找到MyBatis的源代码,这对于学习和理解MyBatis的工作原理非常有帮助。源码中,你可以看到如SqlSessionManager、Executor、ParameterHandler等核心类的实现,以及Mapper接口和XML...