Skip to content

Commit 399eabf

Browse files
author
Jarvis Song
committed
close # 184
1 parent 050d3bd commit 399eabf

File tree

8 files changed

+241
-90
lines changed

8 files changed

+241
-90
lines changed

spring-data-mybatis/src/main/java/org/springframework/data/mybatis/repository/MybatisRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44
import java.util.Optional;
5+
56
import org.springframework.data.domain.Example;
67
import org.springframework.data.domain.Page;
78
import org.springframework.data.domain.Pageable;
@@ -72,8 +73,12 @@ public interface MybatisRepository<T, ID>
7273
*/
7374
<S extends T> S update(S entity);
7475

76+
<S extends T> S update(ID id, S entity);
77+
7578
<S extends T> S updateIgnoreNull(S entity);
7679

80+
<S extends T> S updateIgnoreNull(ID id, S entity);
81+
7782
<S extends T> S saveIgnoreNull(S entity);
7883

7984
void deleteInBatch(Iterable<T> entities);

spring-data-mybatis/src/main/java/org/springframework/data/mybatis/repository/support/MybatisBasicMapperBuilder.java

Lines changed: 146 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.springframework.data.mapping.PropertyHandler;
2828
import org.springframework.data.mybatis.annotation.Condition;
2929
import org.springframework.data.mybatis.annotation.Conditions;
30+
import org.springframework.data.mybatis.annotation.CreatedBy;
31+
import org.springframework.data.mybatis.annotation.CreatedDate;
3032
import org.springframework.data.mybatis.annotation.Snowflake;
3133
import org.springframework.data.mybatis.id.SnowflakeKeyGenerator;
3234
import org.springframework.data.mybatis.mapping.MybatisPersistentEntityImpl;
@@ -61,8 +63,10 @@ protected void doBuild() {
6163
addResultMap();
6264

6365
addInsertStatement();
64-
addUpdateStatement(true);
65-
addUpdateStatement(false);
66+
addUpdateStatement(true, true);
67+
addUpdateStatement(false, true);
68+
addUpdateStatement(true, false);
69+
addUpdateStatement(false, false);
6670
addGetByIdStatement();
6771
addCountStatement();
6872
addCountAllStatement();
@@ -267,7 +271,7 @@ else if (gv.strategy() == SEQUENCE || (gv.strategy() == AUTO && "sequence"
267271

268272
}
269273

270-
private void addUpdateStatement(boolean ignoreNull) {
274+
private void addUpdateStatement(boolean ignoreNull, boolean byId) {
271275

272276
if (!entity.hasIdProperty()) {
273277
return;
@@ -278,75 +282,138 @@ private void addUpdateStatement(boolean ignoreNull) {
278282

279283
builder.append(
280284

281-
findNormalColumns().stream().map(p -> {
282-
283-
if (p.isAnnotationPresent(EmbeddedId.class) || p.isEmbeddable()) {
284-
return findNormalColumns(((MybatisPersistentEntityImpl) entity)
285-
.getRequiredPersistentEntity(p.getActualType())).stream()
286-
.map(ep -> {
287-
288-
StringBuilder sb = new StringBuilder();
289-
if (ignoreNull) {
290-
sb.append("<if test=\"")
291-
.append(ep.getName())
292-
.append("!=null\">");
293-
}
294-
295-
sb.append(ep.getColumnName()).append("=");
296-
sb.append(
297-
(null != ep.getSpecifiedTypeHandler()
298-
? String.format(
299-
"#{%s.%s,jdbcType=%s,typeHandler=%s}",
300-
p.getName(),
301-
ep.getName(),
302-
ep.getJdbcType()
303-
.name(),
304-
ep.getSpecifiedTypeHandler()
305-
.getName())
306-
: String.format(
307-
"#{%s.%s,jdbcType=%s}",
308-
p.getName(),
309-
ep.getName(),
310-
ep.getJdbcType()
311-
.name())));
312-
sb.append(",");
313-
if (ignoreNull) {
314-
sb.append("</if>");
315-
}
316-
return sb.toString();
317-
318-
}).collect(Collectors.joining(" "));
319-
}
285+
findNormalColumns().stream().filter(p -> !(p
286+
.isAnnotationPresent(CreatedDate.class)
287+
|| p.isAnnotationPresent(
288+
org.springframework.data.annotation.CreatedDate.class)
289+
|| p.isAnnotationPresent(CreatedBy.class)
290+
|| p.isAnnotationPresent(
291+
org.springframework.data.annotation.CreatedBy.class)))
292+
.map(p -> {
293+
294+
if (p.isAnnotationPresent(EmbeddedId.class)
295+
|| p.isEmbeddable()) {
296+
return findNormalColumns(
297+
((MybatisPersistentEntityImpl) entity)
298+
.getRequiredPersistentEntity(
299+
p.getActualType())).stream()
300+
.map(ep -> {
301+
302+
StringBuilder sb = new StringBuilder();
303+
if (ignoreNull) {
304+
sb.append(
305+
"<if test=\"");
306+
if (byId) {
307+
sb.append(
308+
"__entity != null and ");
309+
sb.append(
310+
"__entity."
311+
+ p.getName()
312+
+ " != null and ");
313+
sb.append(
314+
"__entity."
315+
+ p.getName()
316+
+ '.'
317+
+ ep.getName()
318+
+ " != null");
319+
}
320+
else {
321+
sb.append(p
322+
.getName()
323+
+ " != null and ");
324+
sb.append(p
325+
.getName()
326+
+ '.'
327+
+ ep.getName()
328+
+ " != null");
329+
}
330+
sb.append("\">");
331+
}
332+
333+
sb.append(ep
334+
.getColumnName())
335+
.append("=");
336+
sb.append((null != ep
337+
.getSpecifiedTypeHandler()
338+
? String.format(
339+
"#{%s.%s,jdbcType=%s,typeHandler=%s}",
340+
byId ? ("__entity."
341+
+ p.getName())
342+
: p.getName(),
343+
ep.getName(),
344+
ep.getJdbcType()
345+
.name(),
346+
ep.getSpecifiedTypeHandler()
347+
.getName())
348+
: String.format(
349+
"#{%s.%s,jdbcType=%s}",
350+
byId ? ("__entity."
351+
+ p.getName())
352+
: p.getName(),
353+
ep.getName(),
354+
ep.getJdbcType()
355+
.name())));
356+
sb.append(",");
357+
if (ignoreNull) {
358+
sb.append(
359+
"</if>");
360+
}
361+
return sb.toString();
362+
363+
}).collect(Collectors
364+
.joining(" "));
365+
}
320366

321-
if (p.isVersionProperty()) {
322-
return p.getColumnName() + "=" + p.getColumnName() + "+1,";
323-
}
367+
if (p.isVersionProperty()) {
368+
return p.getColumnName() + "=" + p.getColumnName()
369+
+ "+1,";
370+
}
324371

325-
StringBuilder sb = new StringBuilder();
326-
if (ignoreNull) {
327-
sb.append("<if test=\"").append(p.getName()).append("!=null\">");
328-
}
372+
StringBuilder sb = new StringBuilder();
373+
if (ignoreNull) {
329374

330-
sb.append(p.getColumnName()).append("=");
331-
sb.append((null != p.getSpecifiedTypeHandler()
332-
? String.format("#{%s,jdbcType=%s,typeHandler=%s}",
333-
p.getName(), p.getJdbcType().name(),
334-
p.getSpecifiedTypeHandler().getName())
335-
: String.format("#{%s,jdbcType=%s}", p.getName(),
336-
p.getJdbcType().name())));
337-
sb.append(",");
338-
if (ignoreNull) {
339-
sb.append("</if>");
340-
}
341-
return sb.toString();
375+
if (ignoreNull) {
376+
sb.append("<if test=\"");
377+
if (byId) {
378+
sb.append("__entity != null and ");
379+
sb.append("__entity." + p.getName() + " != null");
342380

343-
}).collect(Collectors.joining()));
381+
}
382+
else {
383+
sb.append(p.getName() + " != null");
384+
}
385+
sb.append("\">");
386+
}
344387

345-
builder.append("</set> where ").append(buildIdCaluse(true));
388+
}
389+
390+
sb.append(p.getColumnName()).append("=");
391+
sb.append((null != p.getSpecifiedTypeHandler()
392+
? String.format("#{%s,jdbcType=%s,typeHandler=%s}",
393+
byId ? ("__entity." + p.getName())
394+
: p.getName(),
395+
p.getJdbcType().name(),
396+
p.getSpecifiedTypeHandler().getName())
397+
: String.format("#{%s,jdbcType=%s}",
398+
byId ? ("__entity." + p.getName())
399+
: p.getName(),
400+
p.getJdbcType().name())));
401+
sb.append(",");
402+
if (ignoreNull) {
403+
sb.append("</if>");
404+
}
405+
return sb.toString();
406+
407+
}).collect(Collectors.joining()));
408+
409+
builder.append("</set> where ").append(buildIdCaluse(true, byId));
346410

347411
String[] sqls = new String[] { "<script>", builder.toString(), "</script>" };
348-
addMappedStatement(ignoreNull ? "__update_ignore_null" : "__update", sqls, UPDATE,
349-
entity.getType());
412+
addMappedStatement(
413+
ignoreNull
414+
? (byId ? "__update_by_id_ignore_null" : "__update_ignore_null")
415+
: (byId ? "__update_by_id" : "__update"),
416+
sqls, UPDATE, entity.getType());
350417
}
351418

352419
private void addGetByIdStatement() {
@@ -356,7 +423,7 @@ private void addGetByIdStatement() {
356423
// .map(p -> String.format("%s as %s", p.getColumnName(), p.getName()))
357424
// .collect(Collectors.joining(",")));
358425
builder.append(" from ").append(entity.getTableName()).append(" where ")
359-
.append(buildIdCaluse(false));
426+
.append(buildIdCaluse(false, false));
360427
addMappedStatement("__get_by_id", new String[] { builder.toString() }, SELECT,
361428
entity.getIdProperty().getType(), RESULT_MAP);
362429
}
@@ -402,7 +469,7 @@ private void addDeleteByIdStatement() {
402469
StringBuilder builder = new StringBuilder();
403470

404471
builder.append("delete from ").append(entity.getTableName()).append(" where ")
405-
.append(buildIdCaluse(false));
472+
.append(buildIdCaluse(false, false));
406473
addMappedStatement("__delete_by_id", new String[] { builder.toString() }, DELETE,
407474
entity.getIdProperty().getType());
408475

@@ -511,7 +578,7 @@ private String buildCondition() {
511578
return builder.toString();
512579
}
513580

514-
private String buildIdCaluse(boolean clearly) {
581+
private String buildIdCaluse(boolean clearly, boolean byId) {
515582

516583
if (!entity.hasIdProperty()) {
517584
return null;
@@ -526,24 +593,28 @@ private String buildIdCaluse(boolean clearly) {
526593
+ (null != ep.getSpecifiedTypeHandler()
527594
? String.format(
528595
"#{%s,jdbcType=%s,typeHandler=%s}",
529-
clearly ? (p.getName() + '.'
596+
clearly ? ((byId ? "__id"
597+
: p.getName()) + '.'
530598
+ ep.getName())
531599
: ep.getName(),
532600
ep.getJdbcType().name(),
533601
ep.getSpecifiedTypeHandler()
534602
.getName())
535603
: String.format("#{%s,jdbcType=%s}", clearly
536-
? (p.getName() + '.' + ep.getName())
604+
? ((byId ? "__id" : p.getName()) + '.'
605+
+ ep.getName())
537606
: ep.getName(),
538607
ep.getJdbcType().name())))
539608
.collect(Collectors.joining(" and "));
540609
}
541610

542-
return p.getColumnName() + " = " + (null != p.getSpecifiedTypeHandler()
543-
? String.format("#{%s,jdbcType=%s,typeHandler=%s}", p.getName(),
544-
p.getJdbcType().name(), p.getSpecifiedTypeHandler().getName())
545-
: String.format("#{%s,jdbcType=%s}", p.getName(),
546-
p.getJdbcType().name()));
611+
return p.getColumnName() + " = "
612+
+ (null != p.getSpecifiedTypeHandler()
613+
? String.format("#{%s,jdbcType=%s,typeHandler=%s}",
614+
byId ? "__id" : p.getName(), p.getJdbcType().name(),
615+
p.getSpecifiedTypeHandler().getName())
616+
: String.format("#{%s,jdbcType=%s}", byId ? "__id" : p.getName(),
617+
p.getJdbcType().name()));
547618
}
548619

549620
}

spring-data-mybatis/src/main/java/org/springframework/data/mybatis/repository/support/MybatisMapperBuildAssistant.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,8 @@ protected void addMappedStatement(String id, String[] sqls,
351351
keyProperty, keyColumn, null, getLanguageDriver(), null);
352352

353353
if (log.isDebugEnabled()) {
354-
System.out.println(
355-
"/*【" + this.assistant.getCurrentNamespace() + '.' + id + "】 */");
354+
System.out.println("/*【" + this.assistant.getCurrentNamespace() + '.' + id
355+
+ "】ResultMap=" + resultMap + " */");
356356
System.out.println((sqls.length > 1 ? sqls[1] : sqls[0]) + ";\n");
357357
}
358358
}

spring-data-mybatis/src/main/java/org/springframework/data/mybatis/repository/support/MybatisSimpleQueryMapperBuilder.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.springframework.data.mybatis.repository.support;
22

33
import java.util.Map;
4+
import java.util.regex.Pattern;
45

56
import org.springframework.data.mapping.PersistentEntity;
67
import org.springframework.data.mybatis.repository.query.InvalidMybatisQueryMethodException;
@@ -27,6 +28,9 @@ public class MybatisSimpleQueryMapperBuilder extends MybatisMapperBuildAssistant
2728

2829
private final SqlCommandType commandType;
2930

31+
private final static Pattern SELECT_ALL_FROM = Pattern
32+
.compile("^\\s*select\\s+\\*\\s+from\\s+.*", Pattern.CASE_INSENSITIVE);
33+
3034
public MybatisSimpleQueryMapperBuilder(Configuration configuration,
3135
PersistentEntity<?, ?> persistentEntity, SimpleMybatisQuery query) {
3236
super(configuration, persistentEntity, query.getQueryMethod().getNamespace());
@@ -49,15 +53,18 @@ protected void doBuild() {
4953
private void buildQuery() {
5054

5155
if (method.getAnnotatedQuery().trim().startsWith("<script>")) {
56+
String sql = method.getAnnotatedQuery().trim();
5257
if (null != method.getResultMap()) {
53-
addMappedStatement(method.getStatementId(),
54-
new String[] { method.getAnnotatedQuery() }, commandType,
55-
Map.class, method.getResultMap());
58+
addMappedStatement(method.getStatementName(), new String[] { sql },
59+
commandType, Map.class, method.getResultMap());
60+
}
61+
else if (SELECT_ALL_FROM.matcher(sql).matches()) {
62+
addMappedStatement(method.getStatementName(), new String[] { sql },
63+
commandType, Map.class, RESULT_MAP);
5664
}
5765
else {
58-
addMappedStatement(method.getStatementId(),
59-
new String[] { method.getAnnotatedQuery() }, commandType,
60-
Map.class, method.getReturnedObjectType());
66+
addMappedStatement(method.getStatementName(), new String[] { sql },
67+
commandType, Map.class, method.getReturnedObjectType());
6168
}
6269
return;
6370
}
@@ -151,11 +158,15 @@ private void buildQuery() {
151158
}
152159

153160
if (null != method.getResultMap()) {
154-
addMappedStatement(method.getStatementId(), sqls, commandType, Map.class,
161+
addMappedStatement(method.getStatementName(), sqls, commandType, Map.class,
155162
method.getResultMap());
156163
}
164+
else if (SELECT_ALL_FROM.matcher(sql).matches()) {
165+
addMappedStatement(method.getStatementName(), sqls, commandType, Map.class,
166+
RESULT_MAP);
167+
}
157168
else {
158-
addMappedStatement(method.getStatementId(), sqls, commandType, Map.class,
169+
addMappedStatement(method.getStatementName(), sqls, commandType, Map.class,
159170
method.getReturnedObjectType());
160171
}
161172
}

0 commit comments

Comments
 (0)