Skip to content

Commit c49bfc5

Browse files
author
willie
committed
feat: allow DefaultSqlSessionFactory to provide a custom SqlSession
Additionally, allow subclasses of DefaultSqlSession to call `selectList(...)`
1 parent 498c79c commit c49bfc5

File tree

6 files changed

+91
-4
lines changed

6 files changed

+91
-4
lines changed

src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ public <E> List<E> selectList(String statement, Object parameter, RowBounds rowB
147147
return selectList(statement, parameter, rowBounds, Executor.NO_RESULT_HANDLER);
148148
}
149149

150-
private <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) {
150+
protected final <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds,
151+
ResultHandler handler) {
151152
try {
152153
MappedStatement ms = configuration.getMappedStatement(statement);
153154
dirty |= ms.isDirtySelect();

src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSessionFactory.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2023 the original author or authors.
2+
* Copyright 2009-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -87,6 +87,10 @@ public Configuration getConfiguration() {
8787
return configuration;
8888
}
8989

90+
protected SqlSession createSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
91+
return new DefaultSqlSession(configuration, executor, autoCommit);
92+
}
93+
9094
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level,
9195
boolean autoCommit) {
9296
Transaction tx = null;
@@ -95,7 +99,7 @@ private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionI
9599
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
96100
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
97101
final Executor executor = configuration.newExecutor(tx, execType);
98-
return new DefaultSqlSession(configuration, executor, autoCommit);
102+
return createSqlSession(configuration, executor, autoCommit);
99103
} catch (Exception e) {
100104
closeTransaction(tx); // may have fetched a connection so lets call close()
101105
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
@@ -118,7 +122,7 @@ private SqlSession openSessionFromConnection(ExecutorType execType, Connection c
118122
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
119123
final Transaction tx = transactionFactory.newTransaction(connection);
120124
final Executor executor = configuration.newExecutor(tx, execType);
121-
return new DefaultSqlSession(configuration, executor, autoCommit);
125+
return createSqlSession(configuration, executor, autoCommit);
122126
} catch (Exception e) {
123127
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
124128
} finally {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.apache.ibatis.session.defaults;
2+
3+
import java.util.List;
4+
5+
import org.apache.ibatis.executor.Executor;
6+
import org.apache.ibatis.session.Configuration;
7+
import org.apache.ibatis.session.ResultContext;
8+
import org.apache.ibatis.session.ResultHandler;
9+
import org.apache.ibatis.session.RowBounds;
10+
11+
public class ExtendedSqlSession extends DefaultSqlSession {
12+
13+
public ExtendedSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
14+
super(configuration, executor, autoCommit);
15+
}
16+
17+
@Override
18+
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
19+
return super.selectList(statement, parameter, rowBounds, new GlobalIfNotSetResultHandler());
20+
}
21+
22+
private static final class GlobalIfNotSetResultHandler implements ResultHandler {
23+
24+
@Override
25+
public void handleResult(ResultContext resultContext) {
26+
// demonstrates how to globally set a result handler if one was not specified
27+
}
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.apache.ibatis.session.defaults;
2+
3+
import org.apache.ibatis.executor.Executor;
4+
import org.apache.ibatis.session.Configuration;
5+
import org.apache.ibatis.session.SqlSession;
6+
7+
public class ExtendedSqlSessionFactory extends DefaultSqlSessionFactory {
8+
9+
public ExtendedSqlSessionFactory(Configuration configuration) {
10+
super(configuration);
11+
}
12+
13+
@Override
14+
protected SqlSession createSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
15+
return new ExtendedSqlSession(configuration, executor, autoCommit);
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.apache.ibatis.session.defaults;
2+
3+
import org.apache.ibatis.session.Configuration;
4+
import org.apache.ibatis.session.SqlSessionFactory;
5+
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
6+
7+
public class ExtendedSqlSessionFactoryBuilder extends SqlSessionFactoryBuilder {
8+
9+
@Override
10+
public SqlSessionFactory build(Configuration config) {
11+
return new ExtendedSqlSessionFactory(config);
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.apache.ibatis.session.defaults;
2+
3+
import java.io.Reader;
4+
5+
import org.apache.ibatis.BaseDataTest;
6+
import org.apache.ibatis.io.Resources;
7+
import org.apache.ibatis.session.SqlSessionFactory;
8+
import org.assertj.core.api.Assertions;
9+
import org.junit.Test;
10+
11+
public class ExtendedSqlSessionFactoryTest extends BaseDataTest {
12+
13+
@Test
14+
public void testCanUseExtendedSqlSessionUsingDefaults() throws Exception {
15+
createBlogDataSource();
16+
17+
final String resource = "org/apache/ibatis/builder/MapperConfig.xml";
18+
final Reader reader = Resources.getResourceAsReader(resource);
19+
20+
SqlSessionFactory sqlMapper = new ExtendedSqlSessionFactoryBuilder().build(reader);
21+
Assertions.assertThat(sqlMapper).isNotNull();
22+
}
23+
}

0 commit comments

Comments
 (0)