@@ -74,11 +74,11 @@ private static MetaObject forObject(Object object) {
74
74
return MetaObject .forObject (object , DEFAULT_OBJECT_FACTORY , DEFAULT_OBJECT_WRAPPER_FACTORY );
75
75
}
76
76
77
- private Parser sqlParser ;
77
+ private SqlUtil . Parser sqlParser ;
78
78
79
79
//数据库方言 - 使用枚举限制数据库类型
80
80
public enum Dialect {
81
- mysql , oracle , hsqldb , postgresql
81
+ mysql , mariadb , sqlite , oracle , hsqldb , postgresql
82
82
}
83
83
84
84
/**
@@ -124,8 +124,8 @@ public SqlUtil(String strDialect) {
124
124
* @param page
125
125
* @return
126
126
*/
127
- public Map setPageParameter (Object parameterObject , BoundSql boundSql , Page page ) {
128
- return sqlParser .setPageParameter (parameterObject , boundSql , page );
127
+ public Map setPageParameter (MappedStatement ms , Object parameterObject , BoundSql boundSql , Page page ) {
128
+ return sqlParser .setPageParameter (ms , parameterObject , boundSql , page );
129
129
}
130
130
131
131
/**
@@ -160,14 +160,16 @@ public static interface Parser {
160
160
161
161
String getPageSql (String sql );
162
162
163
- Map setPageParameter (Object parameterObject , BoundSql boundSql , Page page );
163
+ Map setPageParameter (MappedStatement ms , Object parameterObject , BoundSql boundSql , Page page );
164
164
}
165
165
166
166
public static abstract class SimpleParser implements Parser {
167
167
public static Parser newParser (Dialect dialect ) {
168
168
Parser parser = null ;
169
169
switch (dialect ) {
170
170
case mysql :
171
+ case mariadb :
172
+ case sqlite :
171
173
parser = new MysqlParser ();
172
174
break ;
173
175
case oracle :
@@ -212,25 +214,33 @@ public String getCountSql(final String sql) {
212
214
*/
213
215
public abstract String getPageSql (String sql );
214
216
215
- public Map setPageParameter (Object parameterObject , BoundSql boundSql , Page page ) {
217
+ public Map setPageParameter (MappedStatement ms , Object parameterObject , BoundSql boundSql , Page page ) {
216
218
Map paramMap = null ;
217
219
if (parameterObject == null ) {
218
220
paramMap = new HashMap ();
219
221
} else if (parameterObject instanceof Map ) {
220
222
paramMap = (Map ) parameterObject ;
221
223
} else {
222
224
paramMap = new HashMap ();
223
- //这里以及下面使用的地方,主要解决一个参数时的问题,例如使用一个参数Country使用id属性时,不这样处理会导致id=Country
224
- MetaObject metaObject = forObject (parameterObject );
225
+ //动态sql时的判断条件不会出现在ParameterMapping中,但是必须有,所以这里需要收集所有的getter属性
226
+ //TypeHandlerRegistry可以直接处理的会作为一个直接使用的对象进行处理
227
+ boolean hasTypeHandler = ms .getConfiguration ().getTypeHandlerRegistry ().hasTypeHandler (parameterObject .getClass ());
228
+ if (!hasTypeHandler ) {
229
+ MetaObject metaObject = forObject (parameterObject );
230
+ for (String name : metaObject .getGetterNames ()) {
231
+ paramMap .put (name , metaObject .getValue (name ));
232
+ }
233
+ }
234
+ //下面这段方法,主要解决一个常见类型的参数时的问题
225
235
if (boundSql .getParameterMappings () != null && boundSql .getParameterMappings ().size () > 0 ) {
226
236
for (ParameterMapping parameterMapping : boundSql .getParameterMappings ()) {
227
237
String name = parameterMapping .getProperty ();
228
238
if (!name .equals (PAGEPARAMETER_FIRST )
229
- && !name .equals (PAGEPARAMETER_SECOND )) {
230
- if (parameterMapping .getJavaType ().isAssignableFrom (parameterObject .getClass ())) {
239
+ && !name .equals (PAGEPARAMETER_SECOND )
240
+ && paramMap .get (name ) == null ) {
241
+ if (hasTypeHandler
242
+ || parameterMapping .getJavaType ().isAssignableFrom (parameterObject .getClass ())) {
231
243
paramMap .put (name , parameterObject );
232
- } else {
233
- paramMap .put (name , metaObject .getValue (name ));
234
244
}
235
245
}
236
246
}
@@ -244,16 +254,15 @@ public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page
244
254
private static class MysqlParser extends SimpleParser {
245
255
@ Override
246
256
public String getPageSql (String sql ) {
247
- StringBuilder sqlBuilder = new StringBuilder (sql .length () + 40 );
248
- sqlBuilder .append ("select * from (" );
257
+ StringBuilder sqlBuilder = new StringBuilder (sql .length () + 14 );
249
258
sqlBuilder .append (sql );
250
- sqlBuilder .append (") as tmp_page limit ?,?" );
259
+ sqlBuilder .append (" limit ?,?" );
251
260
return sqlBuilder .toString ();
252
261
}
253
262
254
263
@ Override
255
- public Map setPageParameter (Object parameterObject , BoundSql boundSql , Page page ) {
256
- Map paramMap = super .setPageParameter (parameterObject , boundSql , page );
264
+ public Map setPageParameter (MappedStatement ms , Object parameterObject , BoundSql boundSql , Page page ) {
265
+ Map paramMap = super .setPageParameter (ms , parameterObject , boundSql , page );
257
266
paramMap .put (PAGEPARAMETER_FIRST , page .getStartRow ());
258
267
paramMap .put (PAGEPARAMETER_SECOND , page .getPageSize ());
259
268
return paramMap ;
@@ -272,8 +281,8 @@ public String getPageSql(String sql) {
272
281
}
273
282
274
283
@ Override
275
- public Map setPageParameter (Object parameterObject , BoundSql boundSql , Page page ) {
276
- Map paramMap = super .setPageParameter (parameterObject , boundSql , page );
284
+ public Map setPageParameter (MappedStatement ms , Object parameterObject , BoundSql boundSql , Page page ) {
285
+ Map paramMap = super .setPageParameter (ms , parameterObject , boundSql , page );
277
286
paramMap .put (PAGEPARAMETER_FIRST , page .getEndRow ());
278
287
paramMap .put (PAGEPARAMETER_SECOND , page .getStartRow ());
279
288
return paramMap ;
@@ -291,8 +300,8 @@ public String getPageSql(String sql) {
291
300
}
292
301
293
302
@ Override
294
- public Map setPageParameter (Object parameterObject , BoundSql boundSql , Page page ) {
295
- Map paramMap = super .setPageParameter (parameterObject , boundSql , page );
303
+ public Map setPageParameter (MappedStatement ms , Object parameterObject , BoundSql boundSql , Page page ) {
304
+ Map paramMap = super .setPageParameter (ms , parameterObject , boundSql , page );
296
305
paramMap .put (PAGEPARAMETER_FIRST , page .getPageSize ());
297
306
paramMap .put (PAGEPARAMETER_SECOND , page .getStartRow ());
298
307
return paramMap ;
@@ -303,16 +312,15 @@ public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page
303
312
private static class PostgreSQLParser extends SimpleParser {
304
313
@ Override
305
314
public String getPageSql (String sql ) {
306
- StringBuilder sqlBuilder = new StringBuilder (sql .length () + 50 );
307
- sqlBuilder .append ("select * from (" );
315
+ StringBuilder sqlBuilder = new StringBuilder (sql .length () + 14 );
308
316
sqlBuilder .append (sql );
309
- sqlBuilder .append (") as tmp_page limit ? offset ?" );
317
+ sqlBuilder .append (" limit ? offset ?" );
310
318
return sqlBuilder .toString ();
311
319
}
312
320
313
321
@ Override
314
- public Map setPageParameter (Object parameterObject , BoundSql boundSql , Page page ) {
315
- Map paramMap = super .setPageParameter (parameterObject , boundSql , page );
322
+ public Map setPageParameter (MappedStatement ms , Object parameterObject , BoundSql boundSql , Page page ) {
323
+ Map paramMap = super .setPageParameter (ms , parameterObject , boundSql , page );
316
324
paramMap .put (PAGEPARAMETER_FIRST , page .getPageSize ());
317
325
paramMap .put (PAGEPARAMETER_SECOND , page .getStartRow ());
318
326
return paramMap ;
0 commit comments