`
ufsmart
  • 浏览: 1490 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习ibatis

阅读更多

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实现的代理类实现如下:

内部类

Java代码  收藏代码
  1. private class SqlSessionInterceptor implements InvocationHandler {  
  2.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
  3.       final SqlSession sqlSession = SqlSessionManager.this.localSqlSession.get();  
  4.       if (sqlSession != null) {  
  5.         try {  
  6.           return method.invoke(sqlSession, args);  
  7.         } catch (Throwable t) {  
  8.           throw ExceptionUtil.unwrapThrowable(t);  
  9.         }  
  10.       } else {  
  11.         final SqlSession autoSqlSession = openSession();  
  12.         try {  
  13.           final Object result = method.invoke(autoSqlSession, args);  
  14.           autoSqlSession.commit();  
  15.           return result;  
  16.         } catch (Throwable t) {  
  17.           autoSqlSession.rollback();  
  18.           throw ExceptionUtil.unwrapThrowable(t);  
  19.         } finally {  
  20.           autoSqlSession.close();  
  21.         }  
  22.       }  
  23.     }  
  24.   }  

 

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

 

 

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

 

 

 

Java代码  收藏代码
  1. private SqlSessionManager(SqlSessionFactory sqlSessionFactory) {  
  2.   this.sqlSessionFactory = sqlSessionFactory;  
  3.   this.sqlSessionProxy = (SqlSession) Proxy.newProxyInstance(  
  4.       SqlSessionFactory.class.getClassLoader(),  
  5.       new Class[]{SqlSession.class},  
  6.       new SqlSessionInterceptor());  
  7. }  

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

 

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

分享到:
评论

相关推荐

    ibatis学习IBATIS好资料

    标题 "ibatis学习IBATIS好资料" 涉及的核心知识点是关于iBATIS,一个流行的开源Java持久层框架,它将SQL映射到Java对象,实现了数据访问层(DAL)的简化。这个资源包提供了对iBATIS深入学习的各种材料,包括jar包和...

    学习ibatis很好的例子JPetStore

    学习ibatis很好的例子JPetStore学习ibatis很好的例子JPetStore学习ibatis很好的例子JPetStore学习ibatis很好的例子JPetStore学习ibatis很好的例子JPetStore

    学习ibatis必备

    "学习iBATIS必备"这一主题涵盖了许多关键知识点,对于任何希望在Java开发中深入理解和使用数据访问技术的人来说,都是至关重要的。 首先,我们需要理解iBATIS的基本概念。iBATIS最初由Apache软件基金会开发,后来被...

    J2EE学习 Ibatis开发资料共享 Ibatis开发资料 Ibatis学习框架 Ibatis开发概要

    ### J2EE学习:Ibatis开发资料概要 #### 一、Ibatis简介与特点 Ibatis是一款半自动化的ORM(Object Relational Mapping)框架,它不像Hibernate等其他ORM工具那样提供完全自动化的数据库操作,而是更侧重于SQL语句...

    ibatis快速入门

    其次,"ibatis的入门"PDF文件可能包含了一步步引导你从零开始学习Ibatis的教程。通常,这样的教程会涵盖安装Ibatis、创建第一个映射文件、调用SQL语句、处理结果集等内容。此外,它可能还会介绍如何使用Ibatis的API...

    IBatis学习

    IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习

    ibatis学习总结,oracle , 敏捷开发,

    学习Ibatis,你需要理解它的基本概念,如SqlMapConfig.xml配置,Mapper接口和XML映射文件,以及如何进行参数映射和结果映射。对于Oracle,你需要熟悉SQL语法,掌握数据类型,了解索引、视图、触发器和存储过程的使用...

    Ibatis.net学习和实例~

    学习Ibatis.net,你需要了解以下几点: 1. **安装与设置**:首先,你需要下载并添加Ibatis.net库到你的项目中,然后配置相应的配置文件,包括数据库连接字符串以及SQL映射文件的位置。 2. **SQL映射文件**:这是...

    Ibatis入门例子,Ibatis教程

    学习Ibatis,不仅能够提高开发效率,还能使代码更加清晰、易于维护。随着对Ibatis的深入理解和实践,你会发现它在处理数据库操作时的灵活性和强大性。在实际项目中,结合Spring框架使用Ibatis,可以构建出更加健壮、...

    ibatis

    总的来说,这个压缩包提供了一个全面学习iBATIS的资源库,适合对Java Web开发有兴趣,特别是想深入了解iBATIS的开发者。结合理论与实践,通过阅读和动手操作,可以深入理解iBATIS在实际项目中的应用和优势。

    Ibatis

    通过学习 Ibatis,开发者可以更好地理解和掌握数据访问层的设计与实现,提升开发效率。提供的文档《iBATIS-SqlMaps-2_cn.pdf》是学习 Ibatis 的宝贵资源,涵盖了框架的各个方面,值得深入研究。

    ibatis官方资料及所需要的Jar包

    Ibatis,全称为MyBatis,是一款优秀的Java持久层框架,它主要解决了对象与关系数据库之间的映射问题,使得开发者...所以,这套ibatis官方资料大全是学习Ibatis的宝贵资源,建议开发者仔细研读并熟练掌握其中的知识点。

    ibatis学习锦集

    5. **JpetStore_4项目**:这是一个基于iBatis的开源网上宠物商店,包含了完整的CRUD操作和事务处理,是学习iBatis实际应用的好例子。 **iBatis教程** iBatis的学习资源包括官方文档、在线教程、视频课程等。学习...

    Ibatis 入门经典 实例

    《Ibatis 入门经典 实例》 Ibatis 是一款著名的轻量级 Java 持久层框架,它提供了一种映射 SQL 和 Java 对象的简单方式...在实际操作中,参考提供的 `ibatisTest` 示例,你会发现学习 Ibatis 是一件轻松而有趣的事情。

    ibatisDemo.zip

    这对于我们理解和学习Ibatis非常有帮助。 首先,让我们深入了解一下Ibatis的主要特性: 1. **SQL定制**:Ibatis允许在XML配置文件或者注解中编写原生的SQL,避免了JDBC中的模板化代码,让SQL更加灵活和可读。 2. **...

    ibatis学习资料大全

    在学习Ibatis的过程中,重要的是理解和掌握以下关键知识点: - **配置文件**:SqlMapConfig.xml是Ibatis的全局配置文件,用于配置数据源、事务管理器、环境等信息。而Mapper XML文件则是具体的SQL映射文件,包含SQL...

    ibatis课件

    学习iBatis的过程中,你需要理解以下关键知识点: 1. **基本概念**:了解iBatis是什么,它的设计理念,以及它与传统的JDBC相比有何优势。 2. **配置文件**:学习如何设置iBatis的主配置文件(mybatis-config.xml)...

    iBATIS_DBL-2.2.0.638.zip_iBATIS_DBL_ibatis_ibatis 2_ibatis2 src_

    这个压缩包提供了对iBatis 2.x版本的深入理解,特别是对于那些希望查看或学习iBatis 2.2.0.638源码的开发者来说,极具价值。 首先,让我们深入了解iBatis的核心概念。iBatis的主要功能是作为一个SQL映射框架,它将...

    ibatis的dtd文件

    在学习Ibatis时,直接阅读DTD文件是一种有效的方法。通过理解DTD中的各个元素及其属性,可以更准确地掌握Ibatis的配置语法,从而编写出符合规范的XML配置。同时,将这些DTD文件导入Eclipse等IDE,可以得到代码提示和...

    ibatis官方中文文档

    作为教程,这份文档提供了逐步指导,帮助读者从零开始学习iBATIS。它会引导读者完成创建一个简单的Java项目,集成iBATIS,并实现对数据库的基本操作。教程中还会详细讲解如何在iBATIS中定义和执行存储过程,包括输入...

Global site tag (gtag.js) - Google Analytics