1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.ibatis.sqlmap.engine.execution;
17
18 import com.ibatis.sqlmap.engine.config.SqlMapConfiguration;
19 import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
20 import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
21 import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap;
22 import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMapping;
23 import com.ibatis.sqlmap.engine.mapping.result.ResultMap;
24 import com.ibatis.sqlmap.engine.mapping.result.ResultObjectFactoryUtil;
25 import com.ibatis.sqlmap.engine.mapping.statement.DefaultRowHandler;
26 import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
27 import com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback;
28 import com.ibatis.sqlmap.engine.scope.ErrorContext;
29 import com.ibatis.sqlmap.engine.scope.SessionScope;
30 import com.ibatis.sqlmap.engine.scope.StatementScope;
31
32 import java.sql.BatchUpdateException;
33 import java.sql.CallableStatement;
34 import java.sql.Connection;
35 import java.sql.PreparedStatement;
36 import java.sql.ResultSet;
37 import java.sql.SQLException;
38 import java.sql.Statement;
39 import java.sql.Types;
40 import java.util.ArrayList;
41 import java.util.List;
42 import java.util.Properties;
43
44
45
46
47 public class DefaultSqlExecutor implements SqlExecutor {
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 @Override
67 public int executeUpdate(StatementScope statementScope, Connection conn, String sql, Object[] parameters)
68 throws SQLException {
69 ErrorContext errorContext = statementScope.getErrorContext();
70 errorContext.setActivity("executing update");
71 errorContext.setObjectId(sql);
72 PreparedStatement ps = null;
73 setupResultObjectFactory(statementScope);
74 int rows = 0;
75 try {
76 errorContext.setMoreInfo("Check the SQL Statement (preparation failed).");
77 ps = prepareStatement(statementScope.getSession(), conn, sql);
78 setStatementTimeout(statementScope.getStatement(), ps);
79 errorContext.setMoreInfo("Check the parameters (set parameters failed).");
80 statementScope.getParameterMap().setParameters(statementScope, ps, parameters);
81 errorContext.setMoreInfo("Check the statement (update failed).");
82 ps.execute();
83 rows = ps.getUpdateCount();
84 } finally {
85 closeStatement(statementScope.getSession(), ps);
86 cleanupResultObjectFactory();
87 }
88 return rows;
89 }
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 @Override
107 public void addBatch(StatementScope statementScope, Connection conn, String sql, Object[] parameters)
108 throws SQLException {
109 Batch batch = (Batch) statementScope.getSession().getBatch();
110 if (batch == null) {
111 batch = new Batch();
112 statementScope.getSession().setBatch(batch);
113 }
114 batch.addBatch(statementScope, conn, sql, parameters);
115 }
116
117
118
119
120
121
122
123
124
125
126
127
128 @Override
129 public int executeBatch(SessionScope sessionScope) throws SQLException {
130 int rows = 0;
131 Batch batch = (Batch) sessionScope.getBatch();
132 if (batch != null) {
133 try {
134 rows = batch.executeBatch();
135 } finally {
136 batch.cleanupBatch(sessionScope);
137 }
138 }
139 return rows;
140 }
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156 @Override
157 public List executeBatchDetailed(SessionScope sessionScope) throws SQLException, BatchException {
158 List answer = null;
159 Batch batch = (Batch) sessionScope.getBatch();
160 if (batch != null) {
161 try {
162 answer = batch.executeBatchDetailed();
163 } finally {
164 batch.cleanupBatch(sessionScope);
165 }
166 }
167 return answer;
168 }
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191 @Override
192 public void executeQuery(StatementScope statementScope, Connection conn, String sql, Object[] parameters,
193 int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
194 ErrorContext errorContext = statementScope.getErrorContext();
195 errorContext.setActivity("executing query");
196 errorContext.setObjectId(sql);
197 PreparedStatement ps = null;
198 ResultSet rs = null;
199 setupResultObjectFactory(statementScope);
200 try {
201 errorContext.setMoreInfo("Check the SQL Statement (preparation failed).");
202 Integer rsType = statementScope.getStatement().getResultSetType();
203 if (rsType != null) {
204 ps = prepareStatement(statementScope.getSession(), conn, sql, rsType);
205 } else {
206 ps = prepareStatement(statementScope.getSession(), conn, sql);
207 }
208 setStatementTimeout(statementScope.getStatement(), ps);
209 Integer fetchSize = statementScope.getStatement().getFetchSize();
210 if (fetchSize != null) {
211 ps.setFetchSize(fetchSize.intValue());
212 }
213 errorContext.setMoreInfo("Check the parameters (set parameters failed).");
214 statementScope.getParameterMap().setParameters(statementScope, ps, parameters);
215 errorContext.setMoreInfo("Check the statement (query failed).");
216 ps.execute();
217 errorContext.setMoreInfo("Check the results (failed to retrieve results).");
218
219
220 rs = handleMultipleResults(ps, statementScope, skipResults, maxResults, callback);
221
222 } finally {
223 try {
224 closeResultSet(rs);
225 } finally {
226 closeStatement(statementScope.getSession(), ps);
227 cleanupResultObjectFactory();
228 }
229 }
230
231 }
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250 @Override
251 public int executeUpdateProcedure(StatementScope statementScope, Connection conn, String sql, Object[] parameters)
252 throws SQLException {
253 ErrorContext errorContext = statementScope.getErrorContext();
254 errorContext.setActivity("executing update procedure");
255 errorContext.setObjectId(sql);
256 CallableStatement cs = null;
257 setupResultObjectFactory(statementScope);
258 int rows = 0;
259 try {
260 errorContext.setMoreInfo("Check the SQL Statement (preparation failed).");
261 cs = prepareCall(statementScope.getSession(), conn, sql);
262 setStatementTimeout(statementScope.getStatement(), cs);
263 ParameterMap parameterMap = statementScope.getParameterMap();
264 ParameterMapping[] mappings = parameterMap.getParameterMappings();
265 errorContext.setMoreInfo("Check the output parameters (register output parameters failed).");
266 registerOutputParameters(cs, mappings);
267 errorContext.setMoreInfo("Check the parameters (set parameters failed).");
268 parameterMap.setParameters(statementScope, cs, parameters);
269 errorContext.setMoreInfo("Check the statement (update procedure failed).");
270 cs.execute();
271 rows = cs.getUpdateCount();
272 errorContext.setMoreInfo("Check the output parameters (retrieval of output parameters failed).");
273 retrieveOutputParameters(statementScope, cs, mappings, parameters, null);
274 } finally {
275 closeStatement(statementScope.getSession(), cs);
276 cleanupResultObjectFactory();
277 }
278 return rows;
279 }
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302 @Override
303 public void executeQueryProcedure(StatementScope statementScope, Connection conn, String sql, Object[] parameters,
304 int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
305 ErrorContext errorContext = statementScope.getErrorContext();
306 errorContext.setActivity("executing query procedure");
307 errorContext.setObjectId(sql);
308 CallableStatement cs = null;
309 ResultSet rs = null;
310 setupResultObjectFactory(statementScope);
311 try {
312 errorContext.setMoreInfo("Check the SQL Statement (preparation failed).");
313 Integer rsType = statementScope.getStatement().getResultSetType();
314 if (rsType != null) {
315 cs = prepareCall(statementScope.getSession(), conn, sql, rsType);
316 } else {
317 cs = prepareCall(statementScope.getSession(), conn, sql);
318 }
319 setStatementTimeout(statementScope.getStatement(), cs);
320 Integer fetchSize = statementScope.getStatement().getFetchSize();
321 if (fetchSize != null) {
322 cs.setFetchSize(fetchSize.intValue());
323 }
324 ParameterMap parameterMap = statementScope.getParameterMap();
325 ParameterMapping[] mappings = parameterMap.getParameterMappings();
326 errorContext.setMoreInfo("Check the output parameters (register output parameters failed).");
327 registerOutputParameters(cs, mappings);
328 errorContext.setMoreInfo("Check the parameters (set parameters failed).");
329 parameterMap.setParameters(statementScope, cs, parameters);
330 errorContext.setMoreInfo("Check the statement (update procedure failed).");
331 cs.execute();
332 errorContext.setMoreInfo("Check the results (failed to retrieve results).");
333
334
335 rs = handleMultipleResults(cs, statementScope, skipResults, maxResults, callback);
336
337 errorContext.setMoreInfo("Check the output parameters (retrieval of output parameters failed).");
338 retrieveOutputParameters(statementScope, cs, mappings, parameters, callback);
339
340 } finally {
341 try {
342 closeResultSet(rs);
343 } finally {
344 closeStatement(statementScope.getSession(), cs);
345 cleanupResultObjectFactory();
346 }
347 }
348 }
349
350 @Override
351 public void init(SqlMapConfiguration config, Properties globalProps) {
352
353 }
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374 private ResultSet handleMultipleResults(PreparedStatement ps, StatementScope statementScope, int skipResults,
375 int maxResults, RowHandlerCallback callback) throws SQLException {
376 ResultSet rs = getFirstResultSet(statementScope, ps);
377 if (rs != null) {
378 handleResults(statementScope, rs, skipResults, maxResults, callback);
379 }
380
381
382 if (callback.getRowHandler() instanceof DefaultRowHandler) {
383 MappedStatement statement = statementScope.getStatement();
384 DefaultRowHandler defaultRowHandler = (DefaultRowHandler) callback.getRowHandler();
385 if (statement.hasMultipleResultMaps()) {
386 List multipleResults = new ArrayList<>();
387 multipleResults.add(defaultRowHandler.getList());
388 ResultMap[] resultMaps = statement.getAdditionalResultMaps();
389 int i = 0;
390 while (moveToNextResultsSafely(statementScope, ps)) {
391 if (i >= resultMaps.length) {
392 break;
393 }
394 ResultMap rm = resultMaps[i];
395 statementScope.setResultMap(rm);
396 rs = ps.getResultSet();
397 DefaultRowHandler rh = new DefaultRowHandler();
398 handleResults(statementScope, rs, skipResults, maxResults, new RowHandlerCallback(rm, null, rh));
399 multipleResults.add(rh.getList());
400 i++;
401 }
402 defaultRowHandler.setList(multipleResults);
403 statementScope.setResultMap(statement.getResultMap());
404 } else {
405 while (moveToNextResultsSafely(statementScope, ps)) {
406
407 }
408 }
409 }
410
411 return rs;
412 }
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427 private ResultSet getFirstResultSet(StatementScope scope, Statement stmt) throws SQLException {
428 ResultSet rs = null;
429 boolean hasMoreResults = true;
430 while (hasMoreResults) {
431 rs = stmt.getResultSet();
432 if (rs != null) {
433 break;
434 }
435 hasMoreResults = moveToNextResultsIfPresent(scope, stmt);
436 }
437 return rs;
438 }
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453 private boolean moveToNextResultsIfPresent(StatementScope scope, Statement stmt) throws SQLException {
454 boolean moreResults;
455
456 boolean movedToNextResultsSafely = moveToNextResultsSafely(scope, stmt);
457 int updateCount = stmt.getUpdateCount();
458
459 moreResults = movedToNextResultsSafely || updateCount != -1;
460
461
462 if (moreResults) {
463 moreResults = movedToNextResultsSafely || isMultipleResultSetSupportPresent(scope, stmt);
464 }
465
466 return moreResults;
467 }
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482 private boolean moveToNextResultsSafely(StatementScope scope, Statement stmt) throws SQLException {
483 if (isMultipleResultSetSupportPresent(scope, stmt)) {
484 return stmt.getMoreResults();
485 }
486 return false;
487 }
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503 private boolean isMultipleResultSetSupportPresent(StatementScope scope, Statement stmt) throws SQLException {
504 return forceMultipleResultSetSupport(scope) || stmt.getConnection().getMetaData().supportsMultipleResultSets();
505 }
506
507
508
509
510
511
512
513
514
515 private boolean forceMultipleResultSetSupport(StatementScope scope) {
516 return ((SqlMapClientImpl) scope.getSession().getSqlMapClient()).getDelegate().isForceMultipleResultSetSupport();
517 }
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536 private void handleResults(StatementScope statementScope, ResultSet rs, int skipResults, int maxResults,
537 RowHandlerCallback callback) throws SQLException {
538 try {
539 statementScope.setResultSet(rs);
540 ResultMap resultMap = statementScope.getResultMap();
541 if (resultMap != null) {
542
543 if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
544 if (skipResults > 0) {
545 rs.absolute(skipResults);
546 }
547 } else {
548 for (int i = 0; i < skipResults; i++) {
549 if (!rs.next()) {
550 return;
551 }
552 }
553 }
554
555
556 int resultsFetched = 0;
557 while ((maxResults == NO_MAXIMUM_RESULTS || resultsFetched < maxResults) && rs.next()) {
558 Object[] columnValues = resultMap.resolveSubMap(statementScope, rs).getResults(statementScope, rs);
559 callback.handleResultObject(statementScope, columnValues, rs);
560 resultsFetched++;
561 }
562 }
563 } finally {
564 statementScope.setResultSet(null);
565 }
566 }
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585 private void retrieveOutputParameters(StatementScope statementScope, CallableStatement cs,
586 ParameterMapping[] mappings, Object[] parameters, RowHandlerCallback callback) throws SQLException {
587 for (int i = 0; i < mappings.length; i++) {
588 ParameterMapping mapping = mappings[i];
589 if (mapping.isOutputAllowed()) {
590 if ("java.sql.ResultSet".equalsIgnoreCase(mapping.getJavaTypeName())) {
591 ResultSet rs = (ResultSet) cs.getObject(i + 1);
592 ResultMap resultMap;
593 if (mapping.getResultMapName() == null) {
594 resultMap = statementScope.getResultMap();
595 handleOutputParameterResults(statementScope, resultMap, rs, callback);
596 } else {
597 SqlMapClientImpl client = (SqlMapClientImpl) statementScope.getSession().getSqlMapClient();
598 resultMap = client.getDelegate().getResultMap(mapping.getResultMapName());
599 DefaultRowHandler rowHandler = new DefaultRowHandler();
600 RowHandlerCallback handlerCallback = new RowHandlerCallback(resultMap, null, rowHandler);
601 handleOutputParameterResults(statementScope, resultMap, rs, handlerCallback);
602 parameters[i] = rowHandler.getList();
603 }
604 rs.close();
605 } else {
606 parameters[i] = mapping.getTypeHandler().getResult(cs, i + 1);
607 }
608 }
609 }
610 }
611
612
613
614
615
616
617
618
619
620
621
622
623 private void registerOutputParameters(CallableStatement cs, ParameterMapping[] mappings) throws SQLException {
624 for (int i = 0; i < mappings.length; i++) {
625 ParameterMapping mapping = mappings[i];
626 if (mapping.isOutputAllowed()) {
627 if (null != mapping.getTypeName() && !mapping.getTypeName().isEmpty()) {
628
629 cs.registerOutParameter(i + 1, mapping.getJdbcType(), mapping.getTypeName());
630 } else if (mapping.getNumericScale() != null
631 && (mapping.getJdbcType() == Types.NUMERIC || mapping.getJdbcType() == Types.DECIMAL)) {
632 cs.registerOutParameter(i + 1, mapping.getJdbcType(), mapping.getNumericScale().intValue());
633 } else {
634 cs.registerOutParameter(i + 1, mapping.getJdbcType());
635 }
636 }
637 }
638 }
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655 private void handleOutputParameterResults(StatementScope statementScope, ResultMap resultMap, ResultSet rs,
656 RowHandlerCallback callback) throws SQLException {
657 ResultMap orig = statementScope.getResultMap();
658 try {
659 statementScope.setResultSet(rs);
660 if (resultMap != null) {
661 statementScope.setResultMap(resultMap);
662
663
664 while (rs.next()) {
665 Object[] columnValues = resultMap.resolveSubMap(statementScope, rs).getResults(statementScope, rs);
666 callback.handleResultObject(statementScope, columnValues, rs);
667 }
668 }
669 } finally {
670 statementScope.setResultSet(null);
671 statementScope.setResultMap(orig);
672 }
673 }
674
675
676
677
678
679
680
681 @Override
682 public void cleanup(SessionScope sessionScope) {
683 Batch batch = (Batch) sessionScope.getBatch();
684 if (batch != null) {
685 batch.cleanupBatch(sessionScope);
686 sessionScope.setBatch(null);
687 }
688 }
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707 private PreparedStatement prepareStatement(SessionScope sessionScope, Connection conn, String sql, Integer rsType)
708 throws SQLException {
709 SqlMapExecutorDelegate delegate = ((SqlMapClientImpl) sessionScope.getSqlMapExecutor()).getDelegate();
710 if (sessionScope.hasPreparedStatementFor(sql)) {
711 return sessionScope.getPreparedStatement(sql);
712 }
713 PreparedStatement ps = conn.prepareStatement(sql, rsType.intValue(), ResultSet.CONCUR_READ_ONLY);
714 sessionScope.putPreparedStatement(delegate, sql, ps);
715 return ps;
716 }
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735 private CallableStatement prepareCall(SessionScope sessionScope, Connection conn, String sql, Integer rsType)
736 throws SQLException {
737 SqlMapExecutorDelegate delegate = ((SqlMapClientImpl) sessionScope.getSqlMapExecutor()).getDelegate();
738 if (sessionScope.hasPreparedStatementFor(sql)) {
739 return (CallableStatement) sessionScope.getPreparedStatement(sql);
740 }
741 CallableStatement cs = conn.prepareCall(sql, rsType.intValue(), ResultSet.CONCUR_READ_ONLY);
742 sessionScope.putPreparedStatement(delegate, sql, cs);
743 return cs;
744 }
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761 private static PreparedStatement prepareStatement(SessionScope sessionScope, Connection conn, String sql)
762 throws SQLException {
763 SqlMapExecutorDelegate delegate = ((SqlMapClientImpl) sessionScope.getSqlMapExecutor()).getDelegate();
764 if (sessionScope.hasPreparedStatementFor(sql)) {
765 return sessionScope.getPreparedStatement(sql);
766 }
767 PreparedStatement ps = conn.prepareStatement(sql);
768 sessionScope.putPreparedStatement(delegate, sql, ps);
769 return ps;
770 }
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787 private CallableStatement prepareCall(SessionScope sessionScope, Connection conn, String sql) throws SQLException {
788 SqlMapExecutorDelegate delegate = ((SqlMapClientImpl) sessionScope.getSqlMapExecutor()).getDelegate();
789 if (sessionScope.hasPreparedStatementFor(sql)) {
790 return (CallableStatement) sessionScope.getPreparedStatement(sql);
791 }
792 CallableStatement cs = conn.prepareCall(sql);
793 sessionScope.putPreparedStatement(delegate, sql, cs);
794 return cs;
795 }
796
797
798
799
800
801
802
803
804
805 private static void closeStatement(SessionScope sessionScope, PreparedStatement ps) {
806 if (ps != null && !sessionScope.hasPreparedStatement(ps)) {
807 try {
808 ps.close();
809 } catch (SQLException e) {
810
811 }
812 }
813 }
814
815
816
817
818
819
820
821 private static void closeResultSet(ResultSet rs) {
822 if (rs != null) {
823 try {
824 rs.close();
825 } catch (SQLException e) {
826
827 }
828 }
829 }
830
831
832
833
834
835
836
837
838
839
840
841
842 private static void setStatementTimeout(MappedStatement mappedStatement, Statement statement) throws SQLException {
843 if (mappedStatement.getTimeout() != null) {
844 statement.setQueryTimeout(mappedStatement.getTimeout().intValue());
845 }
846 }
847
848
849
850
851 private static class Batch {
852
853
854 private String currentSql;
855
856
857 private List statementList = new ArrayList<>();
858
859
860 private List batchResultList = new ArrayList<>();
861
862
863 private int size;
864
865
866
867
868 public Batch() {
869 this.size = 0;
870 }
871
872
873
874
875
876
877 public int getSize() {
878 return size;
879 }
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896 public void addBatch(StatementScope statementScope, Connection conn, String sql, Object[] parameters)
897 throws SQLException {
898 PreparedStatement ps = null;
899 if (currentSql != null && currentSql.equals(sql)) {
900 int last = statementList.size() - 1;
901 ps = (PreparedStatement) statementList.get(last);
902 } else {
903 ps = prepareStatement(statementScope.getSession(), conn, sql);
904 setStatementTimeout(statementScope.getStatement(), ps);
905 currentSql = sql;
906 statementList.add(ps);
907 batchResultList.add(new BatchResult(statementScope.getStatement().getId(), sql));
908 }
909 statementScope.getParameterMap().setParameters(statementScope, ps, parameters);
910 ps.addBatch();
911 size++;
912 }
913
914
915
916
917
918
919
920
921
922
923
924
925 public int executeBatch() throws SQLException {
926 int totalRowCount = 0;
927 for (Object element : statementList) {
928 PreparedStatement ps = (PreparedStatement) element;
929 int[] rowCounts = ps.executeBatch();
930 for (int j = 0; j < rowCounts.length; j++) {
931 if (rowCounts[j] == Statement.SUCCESS_NO_INFO) {
932
933 } else if (rowCounts[j] == Statement.EXECUTE_FAILED) {
934 throw new SQLException("The batched statement at index " + j + " failed to execute.");
935 } else {
936 totalRowCount += rowCounts[j];
937 }
938 }
939 }
940 return totalRowCount;
941 }
942
943
944
945
946
947
948
949
950
951
952
953 public List executeBatchDetailed() throws SQLException, BatchException {
954 List answer = new ArrayList<>();
955 for (int i = 0, n = statementList.size(); i < n; i++) {
956 BatchResult br = (BatchResult) batchResultList.get(i);
957 PreparedStatement ps = (PreparedStatement) statementList.get(i);
958 try {
959 br.setUpdateCounts(ps.executeBatch());
960 } catch (BatchUpdateException e) {
961 StringBuilder message = new StringBuilder();
962 message.append("Sub batch number ");
963 message.append(i + 1);
964 message.append(" failed.");
965 if (i > 0) {
966 message.append(" ");
967 message.append(i);
968 message.append(" prior sub batch(s) completed successfully, but will be rolled back.");
969 }
970 throw new BatchException(message.toString(), e, answer, br.getStatementId(), br.getSql());
971 }
972 answer.add(br);
973 }
974 return answer;
975 }
976
977
978
979
980
981
982
983 public void cleanupBatch(SessionScope sessionScope) {
984 for (Object element : statementList) {
985 PreparedStatement ps = (PreparedStatement) element;
986 closeStatement(sessionScope, ps);
987 }
988 currentSql = null;
989 statementList.clear();
990 batchResultList.clear();
991 size = 0;
992 }
993 }
994
995
996
997
998
999
1000
1001 private void setupResultObjectFactory(StatementScope statementScope) {
1002 SqlMapClientImpl client = (SqlMapClientImpl) statementScope.getSession().getSqlMapClient();
1003 ResultObjectFactoryUtil.setupResultObjectFactory(client.getResultObjectFactory(),
1004 statementScope.getStatement().getId());
1005 }
1006
1007
1008
1009
1010 private void cleanupResultObjectFactory() {
1011 ResultObjectFactoryUtil.cleanupResultObjectFactory();
1012 }
1013 }