Skip to content

Commit ae47328

Browse files
committed
修复SqlTemplate将字段更新为NULL的时候出现的空指针BUG
1 parent ea9ef64 commit ae47328

File tree

1 file changed

+52
-44
lines changed

1 file changed

+52
-44
lines changed

src/org/nutz/dao/impl/sql/SqlTemplate.java

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
/**
2424
* 仿照Spring JdbcTemplate实现nutz的SqlTemplate,方便sql的调用
25-
*
25+
*
2626
* @author hzl7652(hzl7652@sina.com)
2727
*/
2828
public class SqlTemplate {
@@ -45,12 +45,12 @@ public Dao dao() {
4545

4646
/**
4747
* 执行一个SQL更新操作(如插入,更新或删除语句)。
48-
*
48+
*
4949
* @param sql
5050
* 包含变量占位符的SQL
5151
* @param params
5252
* 参数map,无参数时,可为null
53-
*
53+
*
5454
* @return SQL 语句所影响的行数
5555
*/
5656
public int update(String sql, Map<String, Object> params) {
@@ -59,14 +59,14 @@ public int update(String sql, Map<String, Object> params) {
5959

6060
/**
6161
* 执行一个SQL更新操作(如插入,更新或删除语句)。
62-
*
62+
*
6363
* @param sql
6464
* 包含变量占位符的SQL
6565
* @param vars
6666
* 变量map,无参数时,可为null
6767
* @param params
6868
* 参数map,无参数时,可为null
69-
*
69+
*
7070
* @return SQL 语句所影响的行数
7171
*/
7272
public int update(String sql, Map<String, Object> vars, Map<String, Object> params) {
@@ -77,12 +77,12 @@ public int update(String sql, Map<String, Object> vars, Map<String, Object> para
7777

7878
/**
7979
* 执行SQL批量更新操作(如插入,更新或删除语句)。
80-
*
80+
*
8181
* @param sql
8282
* 包含变量占位符的SQL
8383
* @param batchValues
8484
* 批量更新参数集合
85-
*
85+
*
8686
* @return SQL 语句所影响的行数
8787
*/
8888
public int batchUpdate(String sql, List<Map<String, Object>> batchValues) {
@@ -91,14 +91,14 @@ public int batchUpdate(String sql, List<Map<String, Object>> batchValues) {
9191

9292
/**
9393
* 执行SQL批量更新操作(如插入,更新或删除语句)。
94-
*
94+
*
9595
* @param sql
9696
* 包含变量占位符的SQL
9797
* @param vars
9898
* 变量map,无参数时,可为null
9999
* @param batchValues
100100
* 批量更新参数集合
101-
*
101+
*
102102
* @return SQL 语句所影响的行数
103103
*/
104104
public int batchUpdate(String sql,
@@ -124,12 +124,12 @@ public int batchUpdate(String sql,
124124
/**
125125
* 执行一个SQL查询操作,结果为一个int形数值。
126126
* <p>
127-
*
127+
*
128128
* @param sql
129129
* 包含变量占位符的SQL
130130
* @param params
131131
* 参数map,无参数时,可为null
132-
*
132+
*
133133
* @return int数值,当查询为null时返回0
134134
*/
135135
public int queryForInt(String sql, Map<String, Object> params) {
@@ -138,14 +138,14 @@ public int queryForInt(String sql, Map<String, Object> params) {
138138

139139
/**
140140
* 执行一个SQL查询操作,结果为一个int形数值。
141-
*
141+
*
142142
* @param sql
143143
* 包含变量占位符的SQL
144144
* @param vars
145145
* 变量map,无参数时,可为null
146146
* @param params
147147
* 参数map,无参数时,可为null
148-
*
148+
*
149149
* @return int数值,当查询为null时返回0
150150
*/
151151
public int queryForInt(String sql, Map<String, Object> vars, Map<String, Object> params) {
@@ -157,12 +157,12 @@ public int queryForInt(String sql, Map<String, Object> vars, Map<String, Object>
157157

158158
/**
159159
* 执行一个SQL查询操作,结果为一个long形数值。
160-
*
160+
*
161161
* @param sql
162162
* 包含变量占位符的SQL
163163
* @param params
164164
* 参数map,无参数时,可为null
165-
*
165+
*
166166
* @return long数值,当查询为null时返回0
167167
*/
168168
public long queryForLong(String sql, Map<String, Object> params) {
@@ -171,14 +171,14 @@ public long queryForLong(String sql, Map<String, Object> params) {
171171

172172
/**
173173
* 执行一个SQL查询操作,结果为一个long形数值。
174-
*
174+
*
175175
* @param sql
176176
* 包含变量占位符的SQL
177177
* @param vars
178178
* 变量map,无参数时,可为null
179179
* @param params
180180
* 参数map,无参数时,可为null
181-
*
181+
*
182182
* @return long数值,当查询为null时返回0
183183
*/
184184
public long queryForLong(String sql, Map<String, Object> vars, Map<String, Object> params) {
@@ -191,14 +191,14 @@ public long queryForLong(String sql, Map<String, Object> vars, Map<String, Objec
191191

192192
/**
193193
* 执行一个SQL查询操作,结果为给定对象类型的对象,适用于明确SQL查询结果的类型。
194-
*
194+
*
195195
* @param sql
196196
* 包含变量占位符的SQL
197197
* @param params
198198
* 参数map 无参数时,可为null
199199
* @param classOfT
200200
* 对象类型,SQL查询结果所对应的类型,如Date.class等
201-
*
201+
*
202202
* @return 对象,无查询结果时返回null
203203
*/
204204
public <T> T queryForObject(String sql, Map<String, Object> params, Class<T> classOfT) {
@@ -207,7 +207,7 @@ public <T> T queryForObject(String sql, Map<String, Object> params, Class<T> cla
207207

208208
/**
209209
* 执行一个SQL查询操作,结果为给定对象类型的对象,适用于明确SQL查询结果的类型。
210-
*
210+
*
211211
* @param sql
212212
* 包含变量占位符的SQL
213213
* @param vars
@@ -216,7 +216,7 @@ public <T> T queryForObject(String sql, Map<String, Object> params, Class<T> cla
216216
* 参数map,无参数时,可为null
217217
* @param classOfT
218218
* 对象类型,SQL查询结果所对应的类型,如Date.class等
219-
*
219+
*
220220
* @return 对象,无查询结果时返回null
221221
*/
222222
public <T> T queryForObject(String sql,
@@ -238,14 +238,14 @@ public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException
238238

239239
/**
240240
* 执行一个SQL查询操作,结果为给定实体的对象。
241-
*
241+
*
242242
* @param sql
243243
* 包含变量占位符的SQL
244244
* @param params
245245
* 参数map,无参数时,可为null
246246
* @param entity
247247
* 实体类型,无参数时,可为null
248-
*
248+
*
249249
* @return 对象,无查询结果时返回null
250250
*/
251251
public <T> T queryForObject(String sql, Map<String, Object> params, Entity<T> entity) {
@@ -254,7 +254,7 @@ public <T> T queryForObject(String sql, Map<String, Object> params, Entity<T> en
254254

255255
/**
256256
* 执行一个SQL查询操作,结果为给定实体的对象。
257-
*
257+
*
258258
* @param sql
259259
* 包含变量占位符的SQL
260260
* @param vars
@@ -263,7 +263,7 @@ public <T> T queryForObject(String sql, Map<String, Object> params, Entity<T> en
263263
* 参数map,无参数时,可为null
264264
* @param entity
265265
* 实体类型
266-
*
266+
*
267267
* @return 对象,无查询结果时返回null
268268
*/
269269
public <T> T queryForObject(String sql,
@@ -281,12 +281,12 @@ public <T> T queryForObject(String sql,
281281

282282
/**
283283
* 执行一个SQL查询操作,结果为Record的对象。
284-
*
284+
*
285285
* @param sql
286286
* 包含变量占位符的SQL
287287
* @param params
288288
* 参数map,无参数时,可为null
289-
*
289+
*
290290
* @return Record对象,无查询结果时返回null
291291
*/
292292
public Record queryForRecord(String sql, Map<String, Object> params) {
@@ -295,7 +295,7 @@ public Record queryForRecord(String sql, Map<String, Object> params) {
295295

296296
/**
297297
* 执行一个SQL查询操作,结果为Record的对象。
298-
*
298+
*
299299
* @param sql
300300
* 包含变量占位符的SQL
301301
* @param vars
@@ -315,14 +315,14 @@ public Record queryForRecord(String sql, Map<String, Object> vars, Map<String, O
315315

316316
/**
317317
* 执行一个SQL查询操作,结果为一组对象。
318-
*
318+
*
319319
* @param sql
320320
* 包含变量占位符的SQL
321321
* @param params
322322
* 参数map,无参数时,可为null
323323
* @param entity
324324
* 对象类型,无参数时,可为null
325-
*
325+
*
326326
* @return 对象列表,无查询结果时返回长度为0的List对象
327327
*/
328328
public <T> List<T> query(String sql, Map<String, Object> params, Entity<T> entity) {
@@ -331,14 +331,14 @@ public <T> List<T> query(String sql, Map<String, Object> params, Entity<T> entit
331331

332332
/**
333333
* 执行一个SQL查询操作,结果为一组对象。
334-
*
334+
*
335335
* @param sql
336336
* 包含变量占位符的SQL
337337
* @param params
338338
* 参数map,无参数时,可为null
339339
* @param classOfT
340340
* 对象类类
341-
*
341+
*
342342
* @return 对象列表,无查询结果时返回长度为0的List对象
343343
*/
344344
public <T> List<T> query(String sql,
@@ -349,7 +349,7 @@ public <T> List<T> query(String sql,
349349

350350
/**
351351
* 执行一个SQL查询操作,结果为一组对象。
352-
*
352+
*
353353
* @param sql
354354
* 包含变量占位符的SQL
355355
* @param vars
@@ -358,7 +358,7 @@ public <T> List<T> query(String sql,
358358
* 参数map,无参数时,可为null
359359
* @param entity
360360
* 对象类型
361-
*
361+
*
362362
* @return 对象列表,无查询结果时返回长度为0的List对象
363363
*/
364364
public <T> List<T> query(String sql,
@@ -376,7 +376,7 @@ public <T> List<T> query(String sql,
376376

377377
/**
378378
* 执行一个SQL查询操作,结果为一组对象。
379-
*
379+
*
380380
* @param sql
381381
* 包含变量占位符的SQL
382382
* @param vars
@@ -385,7 +385,7 @@ public <T> List<T> query(String sql,
385385
* 参数map,无参数时,可为null
386386
* @param classOfT
387387
* 对象类型
388-
*
388+
*
389389
* @return 对象列表,无查询结果时返回长度为0的List对象
390390
*/
391391
public <T> List<T> queryForList(String sql,
@@ -412,14 +412,14 @@ public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException
412412

413413
/**
414414
* 执行一个SQL查询操作,结果为Record对象列表。
415-
*
415+
*
416416
* @param sql
417417
* 包含变量占位符的SQL
418418
* @param vars
419419
* 变量map,无参数时,可为null
420420
* @param params
421421
* 参数map,无参数时,可为null
422-
*
422+
*
423423
* @return Record列表,无查询结果时返回长度为0的List对象
424424
*/
425425
public List<Record> queryRecords(String sql,
@@ -452,12 +452,12 @@ private void execute(Sql sqlObj, Map<String, Object> vars, Map<String, Object> p
452452
* 创建Sql对象。
453453
* <p>
454454
* 在这里处理Array Collection类型参数,方便SQL IN 表达式的设置
455-
*
455+
*
456456
* @param sql
457457
* 包含变量占位符的SQL
458458
* @param params
459459
* 参数map,无参数时,可为null
460-
*
460+
*
461461
* @return Sql对象
462462
*/
463463
private Sql createSqlObj(String sql, Map<String, Object> params) {
@@ -472,12 +472,12 @@ private Sql createSqlObj(String sql, Map<String, Object> params) {
472472

473473
/**
474474
* 将Array Collection类型参数对应的sql占位符进行处理
475-
*
475+
*
476476
* @param originSql
477477
* 原包含变量占位符的SQL
478478
* @param params
479479
* 参数map,无参数时,可为null
480-
*
480+
*
481481
* @return 包含处理IN表达式的sql
482482
*/
483483
private String sqlProcess(String originSql, Map<String, Object> params) {
@@ -490,6 +490,10 @@ private String sqlProcess(String originSql, Map<String, Object> params) {
490490
String paramName = entry.getKey();
491491
Object paramObj = entry.getValue();
492492

493+
if(paramObj == null){
494+
continue;
495+
}
496+
493497
if (paramObj.getClass().isArray()) {
494498
String inSqlExp = inSqlProcess(paramName, paramObj);
495499
newSql = newSql.replaceAll("@" + paramName, inSqlExp);
@@ -509,10 +513,10 @@ private String sqlProcess(String originSql, Map<String, Object> params) {
509513

510514
/**
511515
* sql参数处理,在这里处理Array Collection类型参数,方便SQL IN 表达式的设置
512-
*
516+
*
513517
* @param params
514518
* 参数map,无参数时,可为null
515-
*
519+
*
516520
* @return 包含处理IN表达式的sql
517521
*/
518522
private Map<String, Object> paramProcess(Map<String, Object> params) {
@@ -523,6 +527,10 @@ private Map<String, Object> paramProcess(Map<String, Object> params) {
523527
String paramName = entry.getKey();
524528
Object paramObj = entry.getValue();
525529

530+
if(paramObj == null){
531+
continue;
532+
}
533+
526534
if (paramObj.getClass().isArray()) {
527535
inParamProcess(paramName, paramObj, newParams);
528536
newParams.remove(paramName);

0 commit comments

Comments
 (0)