Skip to content

Commit 550fea3

Browse files
committed
Documentation for Spring usage
1 parent 08aa7b0 commit 550fea3

File tree

1 file changed

+96
-8
lines changed

1 file changed

+96
-8
lines changed

src/site/markdown/docs/spring.md

Lines changed: 96 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,113 @@ The library supports generating SQL that is compatible with the Spring Framework
44
The SQL statement objects are created in exactly the same way as for MyBatis - only the rendering strategy changes. For example:
55

66
```java
7-
SelectStatement selectStatement = select(id.as("A_ID"), firstName, lastName, fullName)
8-
.from(generatedAlways, "a")
7+
SelectStatement selectStatement = select(id, firstName, lastName, fullName)
8+
.from(generatedAlways)
99
.where(id, isGreaterThan(3))
1010
.orderBy(id.descending())
1111
.build()
1212
.render(RenderingStrategy.SPRING_NAMED_PARAMETER);
1313
```
1414

1515
## Executing Select Statements
16-
TODO...
16+
The Spring Named Parameter JDBC template expects an SQL statement with parameter markers in the Spring format, and a set of matched parameters. MyBatis Dynamic SQL will generate both. The parameters returned from the generated SQL statement can be wrapped in a Spring `MapSqlParameterSource`. Spring also expects you to provide a row mapper for creating the returned objects. The followin code shows a complete example:
17+
18+
```java
19+
NamedParameterJdbcTemplate template = getTemplate();
20+
21+
SelectStatement selectStatement = select(id, firstName, lastName, fullName)
22+
.from(generatedAlways)
23+
.where(id, isGreaterThan(3))
24+
.orderBy(id.descending())
25+
.build()
26+
.render(RenderingStrategy.SPRING_NAMED_PARAMETER);
27+
28+
SqlParameterSource namedParameters = new MapSqlParameterSource(selectStatement.getParameters());
29+
List<GeneratedAlwaysRecord> records = template.query(selectStatement.getSelectStatement(), namedParameters,
30+
new RowMapper<GeneratedAlwaysRecord>(){
31+
@Override
32+
public GeneratedAlwaysRecord mapRow(ResultSet rs, int rowNum) throws SQLException {
33+
GeneratedAlwaysRecord record = new GeneratedAlwaysRecord();
34+
record.setId(rs.getInt(1));
35+
record.setFirstName(rs.getString(2));
36+
record.setLastName(rs.getString(3));
37+
record.setFullName(rs.getString(4));
38+
return record;
39+
}
40+
});
41+
```
1742

1843
## Executing Insert Statements
19-
TODO...
44+
Insert statements are a bit different - MyBatis Dynamic SQL generates a properly formatted SQL string for Spring, but instead of a map of parameters, the parameter mappings are created for the inserted record itself. So the parameters for the Spring template are created by a `BeanPropertySqlParameterSource`. Generated keys in Spring are supported with a `GeneratedKeyHolder`. The following is a complete example:
45+
46+
```java
47+
NamedParameterJdbcTemplate template = getTemplate();
2048

21-
### Returning Generated Keys
22-
TODO...
49+
GeneratedAlwaysRecord record = new GeneratedAlwaysRecord();
50+
record.setId(100);
51+
record.setFirstName("Bob");
52+
record.setLastName("Jones");
53+
54+
InsertStatement<GeneratedAlwaysRecord> insertStatement = insert(record)
55+
.into(generatedAlways)
56+
.map(id).toProperty("id")
57+
.map(firstName).toProperty("firstName")
58+
.map(lastName).toProperty("lastName")
59+
.build()
60+
.render(RenderingStrategy.SPRING_NAMED_PARAMETER);
61+
62+
SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(insertStatement.getRecord());
63+
KeyHolder keyHolder = new GeneratedKeyHolder();
64+
65+
int rows = template.update(insertStatement.getInsertStatement(), parameterSource, keyHolder);
66+
String generatedKey = (String) keyHolder.getKeys().get("FULL_NAME");
67+
```
2368

2469
## Executing Batch Inserts
25-
TODO...
70+
Batch insert support in Spring is a bit different than batch support in MyBatis3 and Spring does not support returning generated keys from a batch insert. The following is a complete example of a batch insert (note the use of `SqlParameterSourceUtils` to create an array of parameter sources from an array of input records):
71+
72+
```java
73+
NamedParameterJdbcTemplate template = getTemplate();
74+
75+
List<GeneratedAlwaysRecord> records = new ArrayList<>();
76+
GeneratedAlwaysRecord record = new GeneratedAlwaysRecord();
77+
record.setId(100);
78+
record.setFirstName("Bob");
79+
record.setLastName("Jones");
80+
records.add(record);
81+
82+
record = new GeneratedAlwaysRecord();
83+
record.setId(101);
84+
record.setFirstName("Jim");
85+
record.setLastName("Smith");
86+
records.add(record);
87+
88+
SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(records.toArray());
89+
90+
BatchInsert<GeneratedAlwaysRecord> batchInsert = insert(records)
91+
.into(generatedAlways)
92+
.map(id).toProperty("id")
93+
.map(firstName).toProperty("firstName")
94+
.map(lastName).toProperty("lastName")
95+
.build()
96+
.render(RenderingStrategy.SPRING_NAMED_PARAMETER);
97+
98+
int[] updateCounts = template.batchUpdate(batchInsert.getInsertStatementSQL(), batch);
99+
```
26100

27101
## Executing Delete and Update Statements
28-
TODO...
102+
Updates and deletes use the `MapSqlParameterSource` as with select statements, but use the `update` method in the template. For example:
103+
104+
```java
105+
NamedParameterJdbcTemplate template = getTemplate();
106+
107+
UpdateStatement updateStatement = update(generatedAlways)
108+
.set(firstName).equalToStringConstant("Rob")
109+
.where(id, isIn(1, 5, 22))
110+
.build()
111+
.render(RenderingStrategy.SPRING_NAMED_PARAMETER);
112+
113+
SqlParameterSource parameterSource = new MapSqlParameterSource(updateStatement.getParameters());
114+
115+
int rows = template.update(updateStatement.getUpdateStatement(), parameterSource);
116+
```

0 commit comments

Comments
 (0)