16
16
package org .springframework .data .jdbc .repository ;
17
17
18
18
import java .io .Serializable ;
19
- import java .util .ArrayList ;
20
19
import java .util .HashMap ;
21
- import java .util .List ;
22
20
import java .util .Map ;
23
21
import java .util .stream .Collectors ;
22
+ import java .util .stream .StreamSupport ;
24
23
import javax .sql .DataSource ;
25
24
import org .springframework .data .jdbc .mapping .model .JdbcPersistentEntity ;
26
- import org .springframework .data .mapping .PersistentProperty ;
25
+ import org .springframework .data .jdbc . mapping .model . JdbcPersistentProperty ;
27
26
import org .springframework .data .mapping .PropertyHandler ;
28
27
import org .springframework .data .repository .CrudRepository ;
29
28
import org .springframework .jdbc .core .namedparam .MapSqlParameterSource ;
@@ -37,117 +36,116 @@ public class SimpleJdbcRepository<T, ID extends Serializable> implements CrudRep
37
36
38
37
private final JdbcPersistentEntity <T > entity ;
39
38
private final NamedParameterJdbcOperations template ;
39
+ private final SqlGenerator sql ;
40
40
41
- private final String findOneSql ;
42
- private final String insertSql ;
41
+ private final EntityRowMapper <T > entityRowMapper ;
43
42
44
43
public SimpleJdbcRepository (JdbcPersistentEntity <T > entity , DataSource dataSource ) {
45
44
46
45
this .entity = entity ;
47
46
this .template = new NamedParameterJdbcTemplate (dataSource );
48
47
49
- findOneSql = createFindOneSelectSql ( );
50
- insertSql = createInsertSql ( );
48
+ entityRowMapper = new EntityRowMapper < T >( entity );
49
+ sql = new SqlGenerator ( entity );
51
50
}
52
51
53
52
@ Override
54
53
public <S extends T > S save (S entity ) {
55
54
56
- template .update (insertSql , getPropertyMap (entity ));
55
+ template .update (sql . getInsert () , getPropertyMap (entity ));
57
56
58
57
return entity ;
59
58
}
60
59
61
60
@ Override
62
61
public <S extends T > Iterable <S > save (Iterable <S > entities ) {
63
- return null ;
62
+
63
+ Map <String , ?>[] batchValues = StreamSupport
64
+ .stream (entities .spliterator (), false )
65
+ .map (i -> getPropertyMap (i ))
66
+ .toArray (size -> new Map [size ]);
67
+
68
+ template .batchUpdate (sql .getInsert (), batchValues );
69
+
70
+ return entities ;
64
71
}
65
72
66
73
@ Override
67
74
public T findOne (ID id ) {
68
75
69
76
return template .queryForObject (
70
- findOneSql ,
77
+ sql . getFindOne () ,
71
78
new MapSqlParameterSource ("id" , id ),
72
- new EntityRowMapper < T >( entity )
79
+ entityRowMapper
73
80
);
74
81
}
75
82
76
83
@ Override
77
84
public boolean exists (ID id ) {
78
- return false ;
85
+
86
+ return template .queryForObject (
87
+ sql .getExists (),
88
+ new MapSqlParameterSource ("id" , id ),
89
+ Boolean .class
90
+ );
79
91
}
80
92
81
93
@ Override
82
94
public Iterable <T > findAll () {
83
- return null ;
95
+ return template . query ( sql . getFindAll (), entityRowMapper ) ;
84
96
}
85
97
86
98
@ Override
87
99
public Iterable <T > findAll (Iterable <ID > ids ) {
88
- return null ;
100
+ return template . query ( sql . getFindAllInList (), new MapSqlParameterSource ( "ids" , ids ), entityRowMapper ) ;
89
101
}
90
102
91
103
@ Override
92
104
public long count () {
93
- return 0 ;
105
+ return template . getJdbcOperations (). queryForObject ( sql . getCount (), Long . class ) ;
94
106
}
95
107
96
108
@ Override
97
109
public void delete (ID id ) {
98
-
110
+ template . update ( sql . getDeleteById (), new MapSqlParameterSource ( "id" , id ));
99
111
}
100
112
101
113
@ Override
102
- public void delete (T entity ) {
114
+ public void delete (T instance ) {
103
115
116
+ template .update (
117
+ sql .getDeleteById (),
118
+ new MapSqlParameterSource ("id" ,
119
+ entity .getIdValue (instance )));
104
120
}
105
121
106
122
@ Override
107
123
public void delete (Iterable <? extends T > entities ) {
108
124
125
+ template .update (
126
+ sql .getDeleteByList (),
127
+ new MapSqlParameterSource ("ids" ,
128
+ StreamSupport
129
+ .stream (entities .spliterator (), false )
130
+ .map (entity ::getIdValue )
131
+ .collect (Collectors .toList ())
132
+ )
133
+ );
109
134
}
110
135
111
136
@ Override
112
137
public void deleteAll () {
113
-
114
- }
115
-
116
- private String createFindOneSelectSql () {
117
-
118
- String tableName = entity .getType ().getSimpleName ();
119
- String idColumn = entity .getIdProperty ().getName ();
120
-
121
- return String .format ("select * from %s where %s = :id" , tableName , idColumn );
122
- }
123
-
124
- private String createInsertSql () {
125
-
126
- List <String > propertyNames = new ArrayList <>();
127
- entity .doWithProperties ((PropertyHandler ) persistentProperty -> propertyNames .add (persistentProperty .getName ()));
128
-
129
- String insertTemplate = "insert into %s (%s) values (%s)" ;
130
-
131
- String tableName = entity .getType ().getSimpleName ();
132
-
133
- String tableColumns = propertyNames .stream ().collect (Collectors .joining (", " ));
134
- String parameterNames = propertyNames .stream ().collect (Collectors .joining (", :" , ":" , "" ));
135
-
136
- return String .format (insertTemplate , tableName , tableColumns , parameterNames );
138
+ template .getJdbcOperations ().update (sql .getDeleteAll ());
137
139
}
138
140
139
- private <S extends T > Map <String , Object > getPropertyMap (final S entity ) {
141
+ private <S extends T > Map <String , Object > getPropertyMap (final S instance ) {
140
142
141
143
Map <String , Object > parameters = new HashMap <>();
142
144
143
- this .entity .doWithProperties (new PropertyHandler () {
145
+ this .entity .doWithProperties (new PropertyHandler < JdbcPersistentProperty > () {
144
146
@ Override
145
- public void doWithPersistentProperty (PersistentProperty persistentProperty ) {
146
- try {
147
- parameters .put (persistentProperty .getName (), persistentProperty .getGetter ().invoke (entity ));
148
- } catch (Exception e ) {
149
- throw new RuntimeException (String .format ("Couldn't get value of property %s" , persistentProperty .getName ()));
150
- }
147
+ public void doWithPersistentProperty (JdbcPersistentProperty persistentProperty ) {
148
+ parameters .put (persistentProperty .getColumnName (), entity .getPropertyAccessor (instance ).getProperty (persistentProperty ));
151
149
}
152
150
});
153
151
0 commit comments