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 3.2.2 源代码的童鞋可以下载去看看
源码下载!绝对的mybatis源码,在Myeclipes或Eclipse中直接引入即可看源码!
mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...
spring + springmvc + mybatis; 里面包含mybatis生成文件,可以自己生成,看看学习一下就行,如果把自己生成的放进去可能会出现问题; 内涵mysql 表
在eclipse上简单搭建Springboot Maven项目,并且整合mybatis,mysql,源代码,新手可以看看。
使用spring+springmvc+Mybatis登陆的例子,详细教程请看https://blog.csdn.net/weixin_42908720/article/details/88530588 具体每一步操作+源代码
使用jta来管理多数据源的事物,代码整洁,一看就懂
这里放上我的Step,给自己看看,就当复习了。 [plain] view plain copy 2018年5月9日13:08:51 今天写SSM整合 1.建立项目,添加spring5\springMVC5\Mybatis3的maven 2.写spring、springmvc、mybatis的配置文件 ...
MyBatis的种子项目,用于快速构建中小型API、RESTful API项目,该种子项目已经有过多个真实项目的实践,稳定、简单、快速,使我们摆脱那些重复劳动,专注于业务代码的编写,减少加班。下面是一个简单的使用演示,看...
在数据库中创建steam库,然后导入sql文件,修改相应的的配置,关于主从配置请自行百度啦,运行起项目,然后需要把`GameService`类以及`CommentService`类里面的`afterPropertiesSet`方法里面的代码注释掉,这是第一...
该项目可以实现大学毕业设计中流程的大多是操作。主要有以下几点: 1、管理员添加教师信息和学生信息 2、教师网上报课题,管理员进行审核,审核通过的课题可以作为最终的选题开供学生选择 3、学生选择课题,并会实时...
mybatis-spring-1.2.2-sources mybatis与spring的集成的源代码 调试必备啊,看mybatis的dao层没有具体实现调试必备
3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于SpringMVC+Spring+MyBatis+Maven项目案例源码+数据库.zip 基于SpringMVC+Spring+MyBatis+Maven项目案例源码+数据库...
看界面效果可以在百度搜素“springboot结合mybatis多套druid数据源入门级音乐网站后台”那篇博客,里边有后台实现的代码,还有几张前台的照片。
Mybatis3.4中文版注释版本源码。阅读源码是提升自己代码能力的一个非常重要的手段,但是源码通常都是英文,对于我们这些英语没过4级的程序员来说,看英文版本的源码头都要大了,有了本资源,可以解决咱们这个难题。
使用spring+springmvc+Mybatis登陆的例子,详细教程请看https://blog.csdn.net/weixin_42908720/article/details/88530588 具体每一步操作+源代码
javaEE课程大作业设计项目在线车位销售系统源代码.。 架构 本软件主要采用spring,springMVC和mybatis进行编写。数据库采用mysql。 安装教程 git clone到idea项目中。 导入mysql数据库相关配置 配置tomcat,开发用...
基于java开发的人流检测服务端源码+源代码文档.zip 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信...
本次为大家带来的资源是“基于SSM框架开发的教资考前指导系统”的毕业设计项目,附带了完整的源代码及详细的说明文档。此项目不仅是一个完整的软件解决方案,更是一个极佳的学习与研究的平台,尤其适合正在进行Java ...
harmonyos源代码 一个教务管理系统 来自软件架构课程设计,用 Java 16 + Spring Boot + MyBatis 实现,数据库用的 MySQL 。 前端的代码在 ,用 SvelteKit 写的。 介绍 这是一个简单的教务管理系统,支持以下功能: ...