`

spring的jdbc和mybatis

 
阅读更多

引用:由于JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate类使用DataSourceUtils获取及释放连接,而且连接是与线程绑定的,因此这些JDBC模板类是线程安全的,即JdbcTemplate对象可以在多线程中重用。

 

spring的JDBC:

DataSourceUtils得到一个数据库连接的实现,和hibernate等ORM框架一样,得到连接后放入ThreadLocal中,同一个线程用同一个连接,源码如下:

public static Connection doGetConnection(DataSource dataSource) throws SQLException {
		Assert.notNull(dataSource, "No DataSource specified");

		ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
		if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) {
			conHolder.requested();
			if (!conHolder.hasConnection()) {
				logger.debug("Fetching resumed JDBC Connection from DataSource");
				conHolder.setConnection(dataSource.getConnection());
			}
			return conHolder.getConnection();
		}
		// Else we either got no holder or an empty thread-bound holder here.

		logger.debug("Fetching JDBC Connection from DataSource");
		Connection con = dataSource.getConnection();

		if (TransactionSynchronizationManager.isSynchronizationActive()) {
			logger.debug("Registering transaction synchronization for JDBC Connection");
			// Use same Connection for further JDBC actions within the transaction.
			// Thread-bound object will get removed by synchronization at transaction completion.
			ConnectionHolder holderToUse = conHolder;
			if (holderToUse == null) {
				holderToUse = new ConnectionHolder(con);
			}
			else {
				holderToUse.setConnection(con);
			}
			holderToUse.requested();
			TransactionSynchronizationManager.registerSynchronization(
					new ConnectionSynchronization(holderToUse, dataSource));
			holderToUse.setSynchronizedWithTransaction(true);
			if (holderToUse != conHolder) {
				TransactionSynchronizationManager.bindResource(dataSource, holderToUse);
			}
		}

		return con;
	}

 其中,获取到一个数据库连接后,放入一个事务中并放入ThreadLocal,源码如下:

private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =
			new NamedThreadLocal<Set<TransactionSynchronization>>("Transaction synchronizations");

//...

public static void registerSynchronization(TransactionSynchronization synchronization)
			throws IllegalStateException {

		Assert.notNull(synchronization, "TransactionSynchronization must not be null");
		if (!isSynchronizationActive()) {
			throw new IllegalStateException("Transaction synchronization is not active");
		}
		synchronizations.get().add(synchronization);
	}

 

MyBites:

1)我们在配置文件中,一般这么配置,但是只是获取读取解析配置session工厂的一个bean,该bean其中一个属性为SqlSessionFactory sqlSessionFactory;即session工厂,通过该对象可获得一个数据库连接:

配置文件:

 

<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 ,自动扫描加载Sql映射文件/接口-->  
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <!-- 自动扫描mapping.xml文件 -->  
        <property name="mapperLocations" value="classpath:mapping/*.xml"></property>  
    </bean> 

 在mybatis中,session工厂的默认实现为DefaultSqlSessionFactory类:

 

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      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);
    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

 2)其中,获取数据库连接,仍然是用底层rt.jar的DataSource,具体要看配置的事务类型TransactionFactory,比如下面这种,就是使用spring本身的,即DataSourceUtils的。

 

<bean id="txManager"  
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean> 

mybatis中,可以使用三种处理事务类型,如下图,前两种是mybatis本身封装的,使用原生的rt.jar中DataSource获取数据库连接。



 3)session中的Executor executor,也有三种实现(BatchExecutor批量执行、ClosedExecutor、ReuseExecutor、SimpleExecutor),如下图,但都会继承BaseExecutor这个基本类,具体属性之后再看,待续.......

 

 

 

 

 

 

 

  • 大小: 8.5 KB
分享到:
评论

相关推荐

    springjdbc使用及mybatis-generator

    8. **异常处理**:Spring JDBC和MyBatis都提供了统一的异常处理机制,比如SQLException和MyBatis的SqlSessionException,这使得开发者可以更好地捕获和处理数据库操作过程中可能出现的问题。 总结起来,这个项目...

    Spring + Spring MVC + MyBatis整合项目(源码)

    此外,Spring还提供了大量的其他模块,如Spring MVC用于Web开发,Spring JDBC和MyBatis的集成用于数据访问。 Spring MVC是Spring框架的一部分,专为构建Web应用程序设计。它采用MVC(Model-View-Controller)设计...

    Spring、SpringMVC入门及整合JDBC、Mybatis

    关于整合JDBC和Mybatis,Spring为这两者提供了支持: - JDBC:Spring对传统JDBC进行了封装,简化了模板代码和资源管理,提供了一个JdbcTemplate类,用于执行SQL语句、处理结果集等操作。 - Mybatis:Spring通过...

    Spring、Mybatis、Springboot常用面试试题及答案.rar

    在IT行业中,Spring、Mybatis和Springboot是Java开发者必备的三大框架,它们在实际开发中的应用广泛且深入。这份名为"Spring、Mybatis、Springboot常用面试试题及答案.rar"的压缩包文件,显然是为准备面试的Java...

    spring mvc与mybatis的集成

    1. **环境准备**:首先,确保项目中引入了 Spring MVC、MyBatis 相关的依赖库,如 spring-webmvc、spring-jdbc、mybatis、mybatis-spring 等。这些依赖可以通过 Maven 或 Gradle 管理。 2. **配置 Spring**:在 `...

    jdbc+mybatis+spring所有jar包

    mybatis是ibatis的升级版,spring也有自带mybatis的orm。所以,搭建ibatis的框架也会有多种方式(我这里mybatis是3.0的,ibatis是2.3的,spring是3.0的,数据库是mysql)。下面介绍3中方式 1,只是用mybatis3。 2...

    Spring+mybatis+jdbc结合使用教程

    本文档主要讲解Spring与mybatis与jdbc结合使用的方法和例子。

    互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析

    SSM 是Spring、Spring MVC 和MyBatis 框架的组合,是目前Java 领域使用非常广泛也非常稳定的开源Web 框架。《互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析》以SSM 的核心代码剖析为基础,突破...

    spring boot+mybatis 整合

    MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 **...

    Spring mvc 和 mybatis 整合、 mybatis使用注解模式

    1. **引入依赖**:在项目的pom.xml文件中添加Spring MVC和MyBatis的依赖,包括Spring的相关模块如spring-webmvc、spring-context、spring-jdbc以及MyBatis的核心库mybatis-spring。 2. **配置Spring MVC**:创建...

    spring_mybatis 整合jar包

    2. MyBatis的核心库:mybatis和mybatis-xml。 3. MyBatis-Spring整合库:mybatis-spring。 4. 数据库驱动:如mysql-connector-java(对于MySQL)、ojdbc(对于Oracle)等。 5. 其他依赖库:如log4j或slf4j用于日志...

    13spring4_mybatis2.rar

    /13spring4_mybatis2/lib/spring-jdbc-4.1.6.RELEASE.jar /13spring4_mybatis2/lib/spring-orm-4.1.6.RELEASE.jar /13spring4_mybatis2/lib/spring-tx-4.1.6.RELEASE.jar /13spring4_mybatis2/lib/spring-web-...

    Spring MVC整合Mybatis

    Mybatis避免了几乎所有的JDBC代码和手动设置参数,提高了开发效率。 **3. 整合流程** - **添加依赖**:在项目pom.xml文件中,需要引入Spring MVC和Mybatis的相关依赖。 - **配置Spring**:创建Spring的配置文件,如...

    Spring MVC与MYBatis企业应用实战.pdf

    《Spring MVC与MYBatis企业应用实战》是一本深度探讨如何在实际企业环境中集成和运用Spring MVC和MYBatis两大主流技术的书籍。Spring MVC作为Spring框架的重要组成部分,是Java Web开发中的强大控制器,而MYBatis则...

    springboot+jdbc+mybatis

    在本项目中,"springboot+jdbc+mybatis"的整合,是将SpringBoot与Java数据库连接(JDBC)和MyBatis数据持久层框架相结合,用于构建高效、便捷的数据访问系统。PostgreSQL是一种开源的对象关系型数据库系统,以其强大...

    spring boot-mybatis demo

    MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的...

    基于Spring + Spring MVC + MyBatis的图书馆管理系统

    本系统采用Java语言,结合Spring、Spring MVC和MyBatis三大核心技术框架,实现了功能完备、操作简便的图书馆管理系统。 首先,Spring作为核心的依赖注入(Dependency Injection,DI)框架,为系统提供了强大的组件...

    spring整合Mybatis

    在IT行业中,Spring框架与Mybatis的整合是常见的企业级应用开发模式,它结合了Spring的强大功能和Mybatis的灵活性,使得数据访问更加高效。本文将深入探讨如何进行"Spring整合Mybatis"的基础搭建,以及涉及到的相关...

    struts2 正和spring3和mybatis

    Struts2、Spring3和MyBatis是Java Web开发中常用的三大框架,它们各自负责不同的职责,协同工作可以构建出高效、松耦合的Web应用。Struts2作为MVC框架,负责处理用户请求和视图展示;Spring3则是一个全面的容器,...

    spring,mybatis,hibernate,activemq,redis,dubbo的集成

    它简化了Java EE开发,提供了丰富的模块,如Spring MVC用于Web开发,Spring JDBC和MyBatis集成进行数据访问,Spring Security处理权限控制,以及Spring Boot用于快速构建独立的应用。 2. **MyBatis**: MyBatis 是...

Global site tag (gtag.js) - Google Analytics