• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mybatis / ibatis-2 / 753

05 Jan 2026 01:30AM UTC coverage: 65.569% (+0.03%) from 65.537%
753

push

github

web-flow
Merge pull request #346 from hazendaz/master

Minor code cleanups

1598 of 2797 branches covered (57.13%)

19 of 30 new or added lines in 9 files covered. (63.33%)

1 existing line in 1 file now uncovered.

5020 of 7656 relevant lines covered (65.57%)

0.66 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.73
/src/main/java/com/ibatis/sqlmap/engine/config/MappedStatementConfig.java
1
/*
2
 * Copyright 2004-2026 the original author or authors.
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *    https://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
package com.ibatis.sqlmap.engine.config;
17

18
import com.ibatis.common.beans.Probe;
19
import com.ibatis.common.beans.ProbeFactory;
20
import com.ibatis.common.resources.Resources;
21
import com.ibatis.sqlmap.client.SqlMapException;
22
import com.ibatis.sqlmap.engine.cache.CacheModel;
23
import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
24
import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
25
import com.ibatis.sqlmap.engine.mapping.parameter.InlineParameterMapParser;
26
import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap;
27
import com.ibatis.sqlmap.engine.mapping.result.AutoResultMap;
28
import com.ibatis.sqlmap.engine.mapping.result.ResultMap;
29
import com.ibatis.sqlmap.engine.mapping.sql.Sql;
30
import com.ibatis.sqlmap.engine.mapping.sql.SqlText;
31
import com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql;
32
import com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql;
33
import com.ibatis.sqlmap.engine.mapping.sql.stat.StaticSql;
34
import com.ibatis.sqlmap.engine.mapping.statement.CachingStatement;
35
import com.ibatis.sqlmap.engine.mapping.statement.InsertStatement;
36
import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
37
import com.ibatis.sqlmap.engine.mapping.statement.SelectKeyStatement;
38
import com.ibatis.sqlmap.engine.scope.ErrorContext;
39
import com.ibatis.sqlmap.engine.type.TypeHandlerFactory;
40

41
import java.sql.ResultSet;
42
import java.util.Arrays;
43
import java.util.List;
44

45
/**
46
 * The Class MappedStatementConfig.
47
 */
48
public class MappedStatementConfig {
49

50
  /** The Constant PROBE. */
51
  private static final Probe PROBE = ProbeFactory.getProbe();
1✔
52

53
  /** The Constant PARAM_PARSER. */
54
  private static final InlineParameterMapParser PARAM_PARSER = new InlineParameterMapParser();
1✔
55

56
  /** The error context. */
57
  private ErrorContext errorContext;
58

59
  /** The client. */
60
  private SqlMapClientImpl client;
61

62
  /** The type handler factory. */
63
  private TypeHandlerFactory typeHandlerFactory;
64

65
  /** The mapped statement. */
66
  private MappedStatement mappedStatement;
67

68
  /** The root statement. */
69
  private MappedStatement rootStatement;
70

71
  /**
72
   * Instantiates a new mapped statement config.
73
   *
74
   * @param config
75
   *          the config
76
   * @param id
77
   *          the id
78
   * @param statement
79
   *          the statement
80
   * @param processor
81
   *          the processor
82
   * @param parameterMapName
83
   *          the parameter map name
84
   * @param parameterClass
85
   *          the parameter class
86
   * @param resultMapName
87
   *          the result map name
88
   * @param additionalResultMapNames
89
   *          the additional result map names
90
   * @param resultClass
91
   *          the result class
92
   * @param additionalResultClasses
93
   *          the additional result classes
94
   * @param cacheModelName
95
   *          the cache model name
96
   * @param resultSetType
97
   *          the result set type
98
   * @param fetchSize
99
   *          the fetch size
100
   * @param allowRemapping
101
   *          the allow remapping
102
   * @param timeout
103
   *          the timeout
104
   * @param defaultStatementTimeout
105
   *          the default statement timeout
106
   * @param xmlResultName
107
   *          the xml result name
108
   */
109
  MappedStatementConfig(SqlMapConfiguration config, String id, MappedStatement statement, SqlSource processor,
110
      String parameterMapName, Class parameterClass, String resultMapName, String[] additionalResultMapNames,
111
      Class resultClass, Class[] additionalResultClasses, String cacheModelName, String resultSetType,
112
      Integer fetchSize, boolean allowRemapping, Integer timeout, Integer defaultStatementTimeout,
113
      String xmlResultName) {
1✔
114
    this.errorContext = config.getErrorContext();
1✔
115
    this.client = config.getClient();
1✔
116
    SqlMapExecutorDelegate delegate = client.getDelegate();
1✔
117
    this.typeHandlerFactory = config.getTypeHandlerFactory();
1✔
118
    errorContext.setActivity("parsing a mapped statement");
1✔
119
    errorContext.setObjectId(id + " statement");
1✔
120
    errorContext.setMoreInfo("Check the result map name.");
1✔
121
    if (resultMapName != null) {
1✔
122
      statement.setResultMap(client.getDelegate().getResultMap(resultMapName));
1✔
123
      if (additionalResultMapNames != null) {
1!
124
        for (String additionalResultMapName : additionalResultMapNames) {
1✔
125
          statement.addResultMap(client.getDelegate().getResultMap(additionalResultMapName));
1✔
126
        }
127
      }
128
    }
129
    errorContext.setMoreInfo("Check the parameter map name.");
1✔
130
    if (parameterMapName != null) {
1✔
131
      statement.setParameterMap(client.getDelegate().getParameterMap(parameterMapName));
1✔
132
    }
133
    statement.setId(id);
1✔
134
    statement.setResource(errorContext.getResource());
1✔
135
    if ((resultSetType != null) && (resultSetType != null)) {
1!
NEW
136
      switch (resultSetType) {
×
137
        case "FORWARD_ONLY":
NEW
138
          statement.setResultSetType(Integer.valueOf(ResultSet.TYPE_FORWARD_ONLY));
×
NEW
139
          break;
×
140
        case "SCROLL_INSENSITIVE":
NEW
141
          statement.setResultSetType(Integer.valueOf(ResultSet.TYPE_SCROLL_INSENSITIVE));
×
NEW
142
          break;
×
143
        case "SCROLL_SENSITIVE":
NEW
144
          statement.setResultSetType(Integer.valueOf(ResultSet.TYPE_SCROLL_SENSITIVE));
×
NEW
145
          break;
×
146
        default:
147
          break;
148
      }
149
    }
150
    if (fetchSize != null) {
1!
151
      statement.setFetchSize(fetchSize);
×
152
    }
153

154
    // set parameter class either from attribute or from map (make sure to match)
155
    ParameterMap parameterMap = statement.getParameterMap();
1✔
156
    if (parameterMap == null) {
1✔
157
      statement.setParameterClass(parameterClass);
1✔
158
    } else {
159
      statement.setParameterClass(parameterMap.getParameterClass());
1✔
160
    }
161

162
    // process SQL statement, including inline parameter maps
163
    errorContext.setMoreInfo("Check the SQL statement.");
1✔
164
    Sql sql = processor.getSql();
1✔
165
    setSqlForStatement(statement, sql);
1✔
166

167
    // set up either null result map or automatic result mapping
168
    ResultMap resultMap = statement.getResultMap();
1✔
169
    if (resultMap == null && resultClass == null) {
1✔
170
      statement.setResultMap(null);
1✔
171
    } else if (resultMap == null) {
1✔
172
      resultMap = buildAutoResultMap(allowRemapping, statement, resultClass, xmlResultName);
1✔
173
      statement.setResultMap(resultMap);
1✔
174
      if (additionalResultClasses != null) {
1!
175
        for (Class additionalResultClass : additionalResultClasses) {
1✔
176
          statement.addResultMap(buildAutoResultMap(allowRemapping, statement, additionalResultClass, xmlResultName));
1✔
177
        }
178
      }
179

180
    }
181
    statement.setTimeout(defaultStatementTimeout);
1✔
182
    if (timeout != null) {
1!
183
      try {
184
        statement.setTimeout(timeout);
×
185
      } catch (NumberFormatException e) {
×
186
        throw new SqlMapException(
×
187
            "Specified timeout value for statement " + statement.getId() + " is not a valid integer");
×
188
      }
×
189
    }
190
    errorContext.setMoreInfo(null);
1✔
191
    errorContext.setObjectId(null);
1✔
192
    statement.setSqlMapClient(client);
1✔
193
    if (cacheModelName != null && !cacheModelName.isEmpty() && client.getDelegate().isCacheModelsEnabled()) {
1!
194
      CacheModel cacheModel = client.getDelegate().getCacheModel(cacheModelName);
1✔
195
      mappedStatement = new CachingStatement(statement, cacheModel);
1✔
196
    } else {
1✔
197
      mappedStatement = statement;
1✔
198
    }
199
    rootStatement = statement;
1✔
200
    delegate.addMappedStatement(mappedStatement);
1✔
201
  }
1✔
202

203
  /**
204
   * Sets the select key statement.
205
   *
206
   * @param processor
207
   *          the processor
208
   * @param resultClassName
209
   *          the result class name
210
   * @param keyPropName
211
   *          the key prop name
212
   * @param runAfterSQL
213
   *          the run after SQL
214
   * @param type
215
   *          the type
216
   */
217
  public void setSelectKeyStatement(SqlSource processor, String resultClassName, String keyPropName,
218
      boolean runAfterSQL, String type) {
219
    if (!(rootStatement instanceof InsertStatement)) {
1!
220
      throw new SqlMapException("You cant set a select key statement on statement named " + rootStatement.getId()
×
221
          + " because it is not an InsertStatement.");
222
    }
223
    InsertStatement insertStatement = (InsertStatement) rootStatement;
1✔
224
    Class parameterClass = insertStatement.getParameterClass();
1✔
225
    errorContext.setActivity("parsing a select key");
1✔
226
    SelectKeyStatement selectKeyStatement = new SelectKeyStatement();
1✔
227
    resultClassName = typeHandlerFactory.resolveAlias(resultClassName);
1✔
228
    Class resultClass = null;
1✔
229

230
    // get parameter and result maps
231
    selectKeyStatement.setSqlMapClient(client);
1✔
232
    selectKeyStatement.setId(insertStatement.getId() + "-SelectKey");
1✔
233
    selectKeyStatement.setResource(errorContext.getResource());
1✔
234
    selectKeyStatement.setKeyProperty(keyPropName);
1✔
235
    selectKeyStatement.setRunAfterSQL(runAfterSQL);
1✔
236
    // process the type (pre or post) attribute
237
    if (type != null) {
1✔
238
      selectKeyStatement.setRunAfterSQL("post".equals(type));
1✔
239
    }
240
    try {
241
      if (resultClassName != null) {
1!
242
        errorContext.setMoreInfo("Check the select key result class.");
1✔
243
        resultClass = Resources.classForName(resultClassName);
1✔
244
      } else if (keyPropName != null && parameterClass != null) {
×
245
        resultClass = PROBE.getPropertyTypeForSetter(parameterClass, selectKeyStatement.getKeyProperty());
×
246
      }
247
    } catch (ClassNotFoundException e) {
×
248
      throw new SqlMapException("Error.  Could not set result class.  Cause: " + e, e);
×
249
    }
1✔
250
    if (resultClass == null) {
1!
251
      resultClass = Object.class;
×
252
    }
253

254
    // process SQL statement, including inline parameter maps
255
    errorContext.setMoreInfo("Check the select key SQL statement.");
1✔
256
    Sql sql = processor.getSql();
1✔
257
    setSqlForStatement(selectKeyStatement, sql);
1✔
258
    ResultMap resultMap = new AutoResultMap(client.getDelegate(), false);
1✔
259
    resultMap.setId(selectKeyStatement.getId() + "-AutoResultMap");
1✔
260
    resultMap.setResultClass(resultClass);
1✔
261
    resultMap.setResource(selectKeyStatement.getResource());
1✔
262
    selectKeyStatement.setResultMap(resultMap);
1✔
263
    errorContext.setMoreInfo(null);
1✔
264
    insertStatement.setSelectKeyStatement(selectKeyStatement);
1✔
265
  }
1✔
266

267
  /**
268
   * Sets the sql for statement.
269
   *
270
   * @param statement
271
   *          the statement
272
   * @param sql
273
   *          the sql
274
   */
275
  private void setSqlForStatement(MappedStatement statement, Sql sql) {
276
    if (sql instanceof DynamicSql) {
1✔
277
      statement.setSql(sql);
1✔
278
    } else {
279
      applyInlineParameterMap(statement, sql.getSql(null, null));
1✔
280
    }
281
  }
1✔
282

283
  /**
284
   * Apply inline parameter map.
285
   *
286
   * @param statement
287
   *          the statement
288
   * @param sqlStatement
289
   *          the sql statement
290
   */
291
  private void applyInlineParameterMap(MappedStatement statement, String sqlStatement) {
292
    String newSql = sqlStatement;
1✔
293
    errorContext.setActivity("building an inline parameter map");
1✔
294
    ParameterMap parameterMap = statement.getParameterMap();
1✔
295
    errorContext.setMoreInfo("Check the inline parameters.");
1✔
296
    if (parameterMap == null) {
1✔
297
      ParameterMap map;
298
      map = new ParameterMap(client.getDelegate());
1✔
299
      map.setId(statement.getId() + "-InlineParameterMap");
1✔
300
      map.setParameterClass(statement.getParameterClass());
1✔
301
      map.setResource(statement.getResource());
1✔
302
      statement.setParameterMap(map);
1✔
303
      SqlText sqlText = PARAM_PARSER.parseInlineParameterMap(client.getDelegate().getTypeHandlerFactory(), newSql,
1✔
304
          statement.getParameterClass());
1✔
305
      newSql = sqlText.getText();
1✔
306
      List mappingList = Arrays.asList(sqlText.getParameterMappings());
1✔
307
      map.setParameterMappingList(mappingList);
1✔
308
    }
309
    Sql sql;
310
    if (SimpleDynamicSql.isSimpleDynamicSql(newSql)) {
1✔
311
      sql = new SimpleDynamicSql(client.getDelegate(), newSql);
1✔
312
    } else {
313
      sql = new StaticSql(newSql);
1✔
314
    }
315
    statement.setSql(sql);
1✔
316

317
  }
1✔
318

319
  /**
320
   * Builds the auto result map.
321
   *
322
   * @param allowRemapping
323
   *          the allow remapping
324
   * @param statement
325
   *          the statement
326
   * @param firstResultClass
327
   *          the first result class
328
   * @param xmlResultName
329
   *          the xml result name
330
   *
331
   * @return the result map
332
   */
333
  private ResultMap buildAutoResultMap(boolean allowRemapping, MappedStatement statement, Class firstResultClass,
334
      String xmlResultName) {
335
    ResultMap resultMap = new AutoResultMap(client.getDelegate(), allowRemapping);
1✔
336
    resultMap.setId(statement.getId() + "-AutoResultMap");
1✔
337
    resultMap.setResultClass(firstResultClass);
1✔
338
    resultMap.setXmlName(xmlResultName);
1✔
339
    resultMap.setResource(statement.getResource());
1✔
340
    return resultMap;
1✔
341
  }
342

343
  /**
344
   * Gets the mapped statement.
345
   *
346
   * @return the mapped statement
347
   */
348
  public MappedStatement getMappedStatement() {
349
    return mappedStatement;
×
350
  }
351
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc