sqlsession调用哪个方法获取代理对象

sqlsession调用哪个方法获取代理对象,第1张

首先, 通过翻阅源码,我们来整理一下mybatis进行持久化 *** 作时重要的几个类:

SqlSessionFactoryBuilder:build方法创建SqlSessionFactory实例

SqlSessionFactory:创建SqlSession实例的工厂。

SqlSession:用于执行持久化 *** 作的对象,类似于jdbc中的Connection。

SqlSessionTemplate:MyBatis提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入SqlSessionFactory实例。

Hibernate是与MyBatis类似的orm框架,这里与Hibernate进行一下对比,Hibernate中对于connection的管理,是通过以下几个重要的类:

SessionFactory:创建Session实例的工厂,类似于MyBatis中的SqlSessionFactory。

Session:用来执行持久化 *** 作的对象,类似于jdbc中的Connection。

HibernateTemplate:Hibernate提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入SessionFactory实例。

在日常的开发中,我们经常需要这样对MyBatis和Spring进行集成,把sqlSessionFactory交给Spring管理,通常情况下,我们这样配置:

1

2

3

<bean id="sqlSessionFactory" class="orgmybatisspringSqlSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

</bean>

通过上面的配置,Spring将自动创建一个SqlSessionFactory对象,其中使用到了orgmybatisspringSqlSessionFactoryBean,其 是MyBatis为Spring提供的用于创建SqlSessionFactory的类,将在Spring应用程序的上下文建议一下可共享的 MyBatis SqlSessionFactory实例,我们可以通过依赖注入将SqlSessionFactory传递给MyBatis的一些接口。

如果通过Spring进行事务的管理,我们需要增加Spring注解的事务管理机制,如下配置:

1

2

3

4

5

<bean id="transactionManager" class="orgspringframeworkjdbcdatasourceDataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

<tx:annotation-driven/>

这样,我们就可以使用Spring @Transactional注解,进行事务的控制,表明所注释的方法应该在一个事务中运行。 Spring将在事务成功完成后提交事务,在事务发生错误时进行异常回滚,而且,Spring会将产生的MyBatis异常转换成适当的 DataAccessExceptions,从而提供具体的异常信息。

下面,我们通过分析SqlSessionUtils中getSession的源码,来详细的了解一下sqlSession的产生过程,源码如下:

public static SqlSession getSqlSession(SqlSessionFactory sessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) {

notNull(sessionFactory, "No SqlSessionFactory specified");

notNull(executorType, "No ExecutorType specified");

SqlSessionHolder holder = (SqlSessionHolder) getResource(sessionFactory);

if (holder != null && holderisSynchronizedWithTransaction()) {

if (holdergetExecutorType() != executorType) {

throw new TransientDataAccessResourceException("Cannot change the ExecutorType when there is an existing transaction");

}

holderrequested();

if (loggerisDebugEnabled()) {

loggerdebug("Fetched SqlSession [" + holdergetSqlSession() + "] from current transaction");

}

return holdergetSqlSession();

}

if (loggerisDebugEnabled()) {

loggerdebug("Creating a new SqlSession");

}

SqlSession session = sessionFactoryopenSession(executorType);

// Register session holder if synchronization is active (ie a Spring TX is active)

//

// Note: The DataSource used by the Environment should be synchronized with the

// transaction either through DataSourceTxMgr or another tx synchronization

// Further assume that if an exception is thrown, whatever started the transaction will

// handle closing / rolling back the Connection associated with the SqlSession

if (isSynchronizationActive()) {

Environment environment = sessionFactorygetConfiguration()getEnvironment();

if (environmentgetTransactionFactory() instanceof SpringManagedTransactionFactory) {

if (loggerisDebugEnabled()) {

loggerdebug("Registering transaction synchronization for SqlSession [" + session + "]");

}

AllDataLinksession()每次都获取一个session,你关闭的只是新打开的session,查询的session没有关闭。

应该这样试试:

Session session=AllDataLinksession();

int i=sessioninsert();

sessionclose();

return i;

MyBatis是什么?

MyBatis是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果。MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素、Map接口和POJOs(普通java对象)到数据库中的记录。

简介

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

MyBatis工作流程

(1)加载配置并初始化

触发条件:加载配置文件

配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

(2)接收调用请求

触发条件:调用Mybatis提供的API

传入参数:为SQL的ID和传入参数对象

处理过程:将请求传递给下层的请求处理层进行处理。

(3)处理 *** 作请求 触发条件:API接口层传递请求过来

传入参数:为SQL的ID和传入参数对象

处理过程:

(A)根据SQL的ID查找对应的MappedStatement对象。

(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。

(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。

(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。

(E)释放连接资源。

(4)返回处理结果将最终的处理结果返回。

以上就是关于sqlsession调用哪个方法获取代理对象全部的内容,包括:sqlsession调用哪个方法获取代理对象、mybatis关闭数据链接、mybatis查询和插入可以写在一个session里吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9420502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存