/*
* Copyright 2010-2012 The MyBatis Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mybatis.spring;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.fail;
import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.junit.After;
import org.junit.Test;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.TransientDataAccessResourceException;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.jta.JtaTransactionManager;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import com.mockrunner.mock.ejb.MockUserTransaction;
import com.mockrunner.mock.jdbc.MockConnection;
import com.mockrunner.mock.jdbc.MockDataSource;
import com.mockrunner.mock.jdbc.MockPreparedStatement;
/**
* @version $Id$
*/
public final class MyBatisSpringTest extends AbstractMyBatisSpringTest {
private SqlSession session;
@After
public void validateSessionClose() {
// assume if the Executor is closed, the Session is too
if ((session != null) && !executorInterceptor.isExecutorClosed()) {
session = null;
fail("SqlSession is not closed");
} else {
session = null;
}
}
// ensure MyBatis API still works with SpringManagedTransaction
@Test
public void testMyBatisAPI() {
session = sqlSessionFactory.openSession();
session.getMapper(TestMapper.class).findTest();
session.close();
assertNoCommit();
assertSingleConnection();
assertExecuteCount(1);
}
@Test
public void testMyBatisAPIWithCommit() {
session = sqlSessionFactory.openSession();
session.getMapper(TestMapper.class).findTest();
session.commit(true);
session.close();
assertCommit();
assertSingleConnection();
assertExecuteCount(1);
}
@Test
public void testMyBatisAPIWithRollback() {
session = sqlSessionFactory.openSession();
session.getMapper(TestMapper.class).findTest();
session.rollback(true);
session.close();
assertRollback();
assertSingleConnection();
assertExecuteCount(1);
}
// basic tests using SqlSessionUtils instead of using the MyBatis API directly
@Test
public void testSpringAPI() {
session = SqlSessionUtils.getSqlSession(sqlSessionFactory);
session.getMapper(TestMapper.class).findTest();
SqlSessionUtils.closeSqlSession(session, sqlSessionFactory);
assertNoCommit();
assertSingleConnection();
assertExecuteCount(1);
}
@Test
public void testSpringAPIWithCommit() {
session = SqlSessionUtils.getSqlSession(sqlSessionFactory);
session.getMapper(TestMapper.class).findTest();
session.commit(true);
SqlSessionUtils.closeSqlSession(session, sqlSessionFactory);
assertCommit();
assertSingleConnection();
}
@Test
public void testSpringAPIWithRollback() {
session = SqlSessionUtils.getSqlSession(sqlSessionFactory);
session.getMapper(TestMapper.class).findTest();
session.rollback(true);
SqlSessionUtils.closeSqlSession(session, sqlSessionFactory);
assertRollback();
assertSingleConnection();
}
@Test
public void testSpringAPIWithMyBatisClose() {
// This is a programming error and could lead to connection leak if there is a transaction
// in progress. But, the API allows it, so make sure it at least works without a tx.
session = SqlSessionUtils.getSqlSession(sqlSessionFactory);
session.getMapper(TestMapper.class).findTest();
session.close();
assertNoCommit();
assertSingleConnection();
}
// Spring API should work with a MyBatis TransactionFactories
@Test
public void testWithNonSpringTransactionFactory() {
Environment original = sqlSessionFactory.getConfiguration().getEnvironment();
Environment nonSpring = new Environment("non-spring", new JdbcTransactionFactory(), dataSource);
sqlSessionFactory.getConfiguration().setEnvironment(nonSpring);
try {
session = SqlSessionUtils.getSqlSession(sqlSessionFactory);
session.getMapper(TestMapper.class).findTest();
SqlSessionUtils.closeSqlSession(session, sqlSessionFactory);
// users need to manually call commit, rollback and close, just like with normal MyBatis
// API usage
assertNoCommit();
assertSingleConnection();
} finally {
sqlSessionFactory.getConfiguration().setEnvironment(original);
}
}
// Spring TX, non-Spring TransactionFactory, Spring managed DataSource
// this should not work since the DS will be out of sync with MyBatis
@Test(expected = TransientDataAccessResourceException.class)
public void testNonSpringTxFactoryWithTx() throws Exception {
Environment original = sqlSessionFactory.getConfiguration().getEnvironment();
Environment nonSpring = new Environment("non-spring", new JdbcTransactionFactory(), dataSource);
sqlSessionFactory.getConfiguration().setEnvironment(nonSpring);
TransactionStatus status = null;
try {
status = txManager.getTransaction(new DefaultTransactionDefinition());
session = SqlSessionUtils.getSqlSession(sqlSessionFactory);
fail("should not be able to get an SqlSession using non-Spring tx manager when there is an active Spring tx");
} finally {
// rollback required to close connection
txManager.rollback(status);
sqlSessionFactory.getConfiguration().setEnvironment(original);
}
}
// Spring TX, non-Spring TransactionFactory, MyBatis managed DataSource
// this should work since the DS is managed MyBatis
@Test
public void testNonSpringTxFactoryNonSpringDSWithTx() throws java.sql.SQLException {
Environment original = sqlSessionFactory.getConfiguration().getEnvironment();
MockDataSource mockDataSource = new MockDataSource();
mockDataSource.setupConnection(createMockConnection());
Environment nonSpring = new Environment("non-spring", new JdbcTransactionFactory(), mockDataSource);
sqlSessionFactory.getConfiguration().setEnvironment(nonSpring);
TransactionStatus status = null;
try {
status = txManager.getTransaction(new DefaultTransactionDefinition());
session = SqlSessionUtils.getSqlSession(sqlSessionFactory);
session.commit();
session.close();
txManager.commit(status);
// txManager still uses original connection
assertCommit();
assertSingleConnection();
// SqlSession uses its own connection
// that connection will not have commited since no SQL was executed by the session
MockConnection mockConnection = (MockConnection) mockDataSource.getConnection();
assertEquals("should call commit on Connection", 0, mockConnection.getNumberCommits());
assertEquals("should not call rollback on Connection", 0, mockConnection.getNumberRollbacks());
assertCommitSession();
} finally {
SqlSessionUtils.closeSqlSession(session, sqlSessionFactory);
sqlSessionFactory.getConfiguration().setEnvironment(original);
}
}
@Test(expected = TransientDataAccessResourceException.class)
public void testChangeExecutorTypeInTx() throw
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
spring-mybatis-spring-1.1.0.tar.gz (103个子文件)
site.css 390B
MyBatisSpringTest.java 21KB
MapperScannerConfigurer.java 17KB
SqlSessionFactoryBean.java 16KB
SqlSessionUtils.java 12KB
SqlSessionTemplate.java 11KB
MapperScannerConfigurerTest.java 9KB
SqlSessionFactoryBeanTest.java 9KB
MapperFactoryBeanTest.java 8KB
SqlSessionDaoSupportTest.java 6KB
SqlSessionTemplateTest.java 6KB
AbstractMyBatisSpringTest.java 6KB
MyBatisBatchItemWriter.java 5KB
SpringTransactionManagerTest.java 4KB
SpringManagedTransaction.java 4KB
MapperFactoryBean.java 4KB
MyBatisPagingItemReader.java 3KB
MyBatisExceptionTranslator.java 3KB
ExecutorInterceptor.java 3KB
SqlSessionDaoSupport.java 2KB
SqlSessionHolder.java 2KB
SpringBatchTest.java 2KB
PooledMockDataSource.java 2KB
SpringManagedTransactionFactory.java 2KB
AbstractSampleTest.java 2KB
DummyTypeHandler2.java 1KB
DummyTypeHandler.java 1KB
MyBatisSystemException.java 1KB
UserDaoImpl.java 1KB
User.java 1KB
SampleBatchTest.java 1KB
FooService.java 1KB
Employee.java 1KB
SampleSqlSessionTest.java 1KB
SampleScannerTest.java 1KB
SampleMapperTest.java 1015B
package-info.java 1006B
MapperChildInterface.java 984B
UserDao.java 967B
AnnotatedMapperZeroMethods.java 921B
AnnotatedMapper.java 917B
MapperInterface.java 908B
MapperSubinterface.java 883B
MapperImplementation.java 851B
package-info.java 838B
MapperClass.java 832B
package-info.java 801B
DummyTypeAlias2.java 786B
DummyTypeAlias.java 784B
TestMapper.java 780B
package-info.java 773B
package-info.java 765B
package-info.java 750B
package-info.java 733B
LICENSE 11KB
NOTICE 1KB
en.png 2KB
es.png 873B
zh.png 793B
log4j.properties 992B
database-test-data.sql 931B
database-test-data.sql 903B
database-schema.sql 872B
database-schema.sql 838B
sample.xml 20KB
sample.xml 19KB
sample.xml 19KB
pom.xml 9KB
mappers.xml 9KB
mappers.xml 8KB
sqlsession.xml 8KB
sqlsession.xml 8KB
mappers.xml 7KB
transactions.xml 6KB
transactions.xml 6KB
sqlsession.xml 6KB
factorybean.xml 6KB
changes.xml 6KB
transactions.xml 5KB
factorybean.xml 5KB
index.xml 5KB
getting-started.xml 5KB
getting-started.xml 5KB
index.xml 5KB
factorybean.xml 4KB
index.xml 4KB
getting-started.xml 4KB
applicationContext.xml 4KB
using-api.xml 3KB
using-api.xml 3KB
applicationContext-infrastructure.xml 3KB
using-api.xml 3KB
site_zh.xml 2KB
site_es.xml 2KB
site.xml 2KB
applicationContext-mapper.xml 2KB
applicationContext-batch.xml 2KB
applicationContext-scanner.xml 2KB
applicationContext-sqlsession.xml 1KB
EmployeeMapper.xml 1KB
共 103 条
- 1
- 2
资源评论
段子手-168
- 粉丝: 1559
- 资源: 1970
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功