1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.ibatis.sqlmap.engine.mapping.sql.simple;
17
18 import com.ibatis.common.beans.Probe;
19 import com.ibatis.common.beans.ProbeFactory;
20 import com.ibatis.sqlmap.client.SqlMapException;
21 import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
22 import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap;
23 import com.ibatis.sqlmap.engine.mapping.result.ResultMap;
24 import com.ibatis.sqlmap.engine.mapping.sql.Sql;
25 import com.ibatis.sqlmap.engine.scope.StatementScope;
26
27 import java.util.StringTokenizer;
28
29
30
31
32 public class SimpleDynamicSql implements Sql {
33
34
35 private static final Probe PROBE = ProbeFactory.getProbe();
36
37
38 private static final String ELEMENT_TOKEN = "$";
39
40
41 private String sqlStatement;
42
43
44 private SqlMapExecutorDelegate delegate;
45
46
47
48
49
50
51
52
53
54 public SimpleDynamicSql(SqlMapExecutorDelegate delegate, String sqlStatement) {
55 this.delegate = delegate;
56 this.sqlStatement = sqlStatement;
57 }
58
59 @Override
60 public String getSql(StatementScope statementScope, Object parameterObject) {
61 return processDynamicElements(sqlStatement, parameterObject);
62 }
63
64 @Override
65 public ParameterMap getParameterMap(StatementScope statementScope, Object parameterObject) {
66 return statementScope.getParameterMap();
67 }
68
69 @Override
70 public ResultMap getResultMap(StatementScope statementScope, Object parameterObject) {
71 return statementScope.getResultMap();
72 }
73
74 @Override
75 public void cleanup(StatementScope statementScope) {
76 }
77
78
79
80
81
82
83
84
85
86 public static boolean isSimpleDynamicSql(String sql) {
87 return sql != null && sql.indexOf(ELEMENT_TOKEN) > -1;
88 }
89
90
91
92
93
94
95
96
97
98
99
100 private String processDynamicElements(String sql, Object parameterObject) {
101 StringTokenizer parser = new StringTokenizer(sql, ELEMENT_TOKEN, true);
102 StringBuilder newSql = new StringBuilder();
103
104 String token = null;
105 String lastToken = null;
106 while (parser.hasMoreTokens()) {
107 token = parser.nextToken();
108
109 if (ELEMENT_TOKEN.equals(lastToken)) {
110 if (ELEMENT_TOKEN.equals(token)) {
111 newSql.append(ELEMENT_TOKEN);
112 } else {
113
114 Object value = null;
115 if (parameterObject != null) {
116 if (delegate.getTypeHandlerFactory().hasTypeHandler(parameterObject.getClass())) {
117 value = parameterObject;
118 } else {
119 value = PROBE.getObject(parameterObject, token);
120 }
121 }
122 if (value != null) {
123 newSql.append(String.valueOf(value));
124 }
125
126 token = parser.nextToken();
127 if (!ELEMENT_TOKEN.equals(token)) {
128 throw new SqlMapException("Unterminated dynamic element in sql (" + sql + ").");
129 }
130 }
131 token = null;
132 } else if (!ELEMENT_TOKEN.equals(token)) {
133 newSql.append(token);
134 }
135
136 lastToken = token;
137 }
138
139 return newSql.toString();
140 }
141
142 }