Skip to content
This repository was archived by the owner on Oct 26, 2023. It is now read-only.

Commit 9ceebc6

Browse files
committed
* 'master' of https://github.com/SpringSource/spring-data-book: cleanup SQL Working on examples for Oracle Working on examples for Oracle Adding equals and hashCode to EmailAddress Working on examples for JDBC/Querydsl/Oracle Working on examples for JDBC/Querydsl Refactoring QueryDSL JDBC example and tests
2 parents b7db2eb + bbd6c43 commit 9ceebc6

File tree

22 files changed

+962
-85
lines changed

22 files changed

+962
-85
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ target/
88
.settings/
99
.springBeans
1010
bin/
11+
/out/

jdbc/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ dependencies {
2424
codegen "org.slf4j:slf4j-simple:$slf4jVersion"
2525

2626
compile "com.mysema.querydsl:querydsl-sql:2.6.0"
27-
compile "org.springframework.data:spring-data-jdbc-core:1.0.0.BUILD-SNAPSHOT"
27+
compile "org.springframework.data:spring-data-jdbc-core:$sdJdbcVersion"
2828

2929
compile("org.springframework:spring-tx:$springVersion") { force = true }
3030

jdbc/gradle.properties

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
# Logging
2-
slf4jVersion = 1.6.4
3-
logbackVersion = 1.0.3
42
log4jVersion = 1.2.16
53

6-
# Libraries
7-
springVersion = 3.1.1.RELEASE
8-
sdCommonsVersion = 1.3.0.RELEASE
9-
10-
# Languages
11-
groovyVersion = 1.8.6
12-
13-
# spring-data-book properties
14-
version = 1.0.0.BUILD-SNAPSHOT
4+
# Spring Data JDBC
5+
sdJdbcVersion = 1.0.0.RC3

jdbc/src/main/java/com/oreilly/springdata/jdbc/domain/AbstractEntity.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@
1515
*/
1616
package com.oreilly.springdata.jdbc.domain;
1717

18-
import com.mysema.query.annotations.QuerySupertype;
19-
2018
/**
2119
* @author Oliver Gierke
2220
* @author Thomas Risberg
2321
*/
24-
@QuerySupertype
2522
public class AbstractEntity {
2623

2724
private Long id;

jdbc/src/main/java/com/oreilly/springdata/jdbc/domain/Address.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,37 @@
55
public class Address extends AbstractEntity {
66
private String street, city, country;
77

8+
public Address() {
9+
}
10+
811
public Address(String street, String city, String country) {
912
this.street = street;
1013
this.city = city;
1114
this.country = country;
1215
}
1316

17+
public String getCountry() {
18+
return country;
19+
}
20+
21+
public void setCountry(String country) {
22+
this.country = country;
23+
}
24+
1425
public String getStreet() {
1526
return street;
1627
}
1728

29+
public void setStreet(String street) {
30+
this.street = street;
31+
}
32+
1833
public String getCity() {
1934
return city;
2035
}
2136

22-
public String getCountry() {
23-
return country;
37+
public void setCity(String city) {
38+
this.city = city;
2439
}
2540

2641
@Override

jdbc/src/main/java/com/oreilly/springdata/jdbc/domain/EmailAddress.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ public class EmailAddress {
1313

1414
private String value;
1515

16+
protected EmailAddress() {
17+
}
18+
1619
public EmailAddress(String emailAddress) {
1720
Assert.isTrue(isValid(emailAddress), "Invalid email address!");
1821
this.value = emailAddress;
@@ -22,13 +25,23 @@ public static boolean isValid(String source) {
2225
return PATTERN.matcher(source).matches();
2326
}
2427

25-
protected EmailAddress() {
28+
@Override
29+
public boolean equals(Object o) {
30+
if (this == o) return true;
31+
if (o == null || getClass() != o.getClass()) return false;
32+
33+
EmailAddress that = (EmailAddress) o;
34+
35+
if (value != null ? !value.equals(that.value) : that.value != null) return false;
36+
37+
return true;
38+
}
39+
40+
@Override
41+
public int hashCode() {
42+
return value != null ? value.hashCode() : 0;
2643
}
2744

28-
/*
29-
* (non-Javadoc)
30-
* @see java.lang.Object#toString()
31-
*/
3245
@Override
3346
public String toString() {
3447
return value;

jdbc/src/main/java/com/oreilly/springdata/jdbc/repository/CustomerRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*/
1111
public interface CustomerRepository {
1212

13-
Customer findOne(Long id);
13+
Customer findById(Long id);
1414

1515
List<Customer> findAll();
1616

jdbc/src/main/java/com/oreilly/springdata/jdbc/repository/QueryDslCustomerRepository.java

Lines changed: 61 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.oreilly.springdata.jdbc.repository;
22

3+
import com.mysema.query.sql.SQLQuery;
34
import com.mysema.query.sql.dml.SQLDeleteClause;
45
import com.mysema.query.sql.dml.SQLInsertClause;
56
import com.mysema.query.sql.dml.SQLUpdateClause;
67
import com.mysema.query.types.Path;
8+
import com.mysema.query.types.Predicate;
79
import com.oreilly.springdata.jdbc.domain.Address;
810
import com.oreilly.springdata.jdbc.domain.Customer;
911
import com.oreilly.springdata.jdbc.domain.EmailAddress;
@@ -38,45 +40,63 @@ public class QueryDslCustomerRepository implements CustomerRepository {
3840

3941
private final QAddress qAddress = QAddress.address;
4042

41-
private QueryDslJdbcTemplate template;
43+
private QueryDslJdbcTemplate qdslTemplate;
4244

4345
private Path[] customerAddressProjection;
4446

4547
@Autowired
4648
public void setDataSource(DataSource dataSource) {
47-
this.template = new QueryDslJdbcTemplate(dataSource);
49+
this.qdslTemplate = new QueryDslJdbcTemplate(dataSource);
4850
customerAddressProjection = new Path[] {
4951
qCustomer.id, qCustomer.firstName, qCustomer.lastName, qCustomer.emailAddress,
5052
qAddress.id, qAddress.customerId, qAddress.street, qAddress.city, qAddress.country};
5153
}
5254

5355
@Override
5456
@Transactional(readOnly = true)
55-
public Customer findOne(Long id) {
56-
return template.queryForObject(
57-
template.newSqlQuery()
58-
.from(qCustomer)
59-
.leftJoin(qCustomer._addressCustomerRef, qAddress)
60-
.where(qCustomer.id.eq(id)),
61-
new CustomerExtractor(),
62-
customerAddressProjection);
57+
public Customer findById(Long id) {
58+
if (id == null) {
59+
return null;
60+
}
61+
return findOne(qCustomer.id.eq(id));
6362
}
6463

6564
@Override
6665
@Transactional(readOnly = true)
6766
public List<Customer> findAll() {
68-
return template.query(
69-
template.newSqlQuery()
70-
.from(qCustomer)
71-
.leftJoin(qCustomer._addressCustomerRef, qAddress),
67+
SQLQuery allCustomersQuery = qdslTemplate.newSqlQuery()
68+
.from(qCustomer)
69+
.leftJoin(qCustomer._addressCustomerRef, qAddress);
70+
return qdslTemplate.query(
71+
allCustomersQuery,
7272
new CustomerListExtractor(),
7373
customerAddressProjection);
7474
}
7575

76+
@Override
77+
@Transactional(readOnly = true)
78+
public Customer findByEmailAddress(EmailAddress emailAddress) {
79+
if (emailAddress == null) {
80+
return null;
81+
}
82+
return findOne(qCustomer.emailAddress.eq(emailAddress.toString()));
83+
}
84+
85+
private Customer findOne(Predicate predicate) {
86+
SQLQuery oneCustomerQuery = qdslTemplate.newSqlQuery()
87+
.from(qCustomer)
88+
.leftJoin(qCustomer._addressCustomerRef, qAddress)
89+
.where(predicate);
90+
return qdslTemplate.queryForObject(
91+
oneCustomerQuery,
92+
new CustomerExtractor(),
93+
customerAddressProjection);
94+
}
95+
7696
@Override
7797
public void save(final Customer customer) {
7898
if (customer.getId() == null) {
79-
Long generatedKey = template.insertWithKey(qCustomer, new SqlInsertWithKeyCallback<Long>() {
99+
Long generatedKey = qdslTemplate.insertWithKey(qCustomer, new SqlInsertWithKeyCallback<Long>() {
80100
@Override
81101
public Long doInSqlInsertWithKeyClause(SQLInsertClause insert) throws SQLException {
82102
return insert.columns(qCustomer.firstName, qCustomer.lastName, qCustomer.emailAddress)
@@ -88,15 +108,15 @@ public Long doInSqlInsertWithKeyClause(SQLInsertClause insert) throws SQLExcepti
88108
customer.setId(generatedKey);
89109
}
90110
else {
91-
template.update(qCustomer, new SqlUpdateCallback() {
111+
qdslTemplate.update(qCustomer, new SqlUpdateCallback() {
92112
@Override
93113
public long doInSqlUpdateClause(SQLUpdateClause update) {
94114
return update.where(qCustomer.id.eq(customer.getId()))
95-
.set(qCustomer.firstName, customer.getFirstName())
96-
.set(qCustomer.lastName, customer.getLastName())
97-
.set(qCustomer.emailAddress,
98-
customer.getEmailAddress() == null ? null : customer.getEmailAddress().toString())
99-
.execute();
115+
.set(qCustomer.firstName, customer.getFirstName())
116+
.set(qCustomer.lastName, customer.getLastName())
117+
.set(qCustomer.emailAddress,
118+
customer.getEmailAddress() == null ? null : customer.getEmailAddress().toString())
119+
.execute();
100120
}
101121
});
102122
}
@@ -109,7 +129,7 @@ public long doInSqlUpdateClause(SQLUpdateClause update) {
109129
}
110130
// first delete any potentially removed addresses
111131
if (ids.size() > 0) {
112-
template.delete(qAddress, new SqlDeleteCallback() {
132+
qdslTemplate.delete(qAddress, new SqlDeleteCallback() {
113133
@Override
114134
public long doInSqlDeleteClause(SQLDeleteClause delete) {
115135
return delete.where(qAddress.customerId.eq(customer.getId())
@@ -120,7 +140,7 @@ public long doInSqlDeleteClause(SQLDeleteClause delete) {
120140
// then update existing ones and add new ones
121141
for(final Address a : customer.getAddresses()) {
122142
if (a.getId() != null) {
123-
template.update(qAddress, new SqlUpdateCallback() {
143+
qdslTemplate.update(qAddress, new SqlUpdateCallback() {
124144
@Override
125145
public long doInSqlUpdateClause(SQLUpdateClause update) {
126146
return update.where(qAddress.id.eq(a.getId()))
@@ -133,7 +153,7 @@ public long doInSqlUpdateClause(SQLUpdateClause update) {
133153
});
134154
}
135155
else {
136-
template.insert(qAddress, new SqlInsertCallback() {
156+
qdslTemplate.insert(qAddress, new SqlInsertCallback() {
137157
@Override
138158
public long doInSqlInsertClause(SQLInsertClause insert) {
139159
return insert.columns(qAddress.customerId, qAddress.street, qAddress.city, qAddress.country)
@@ -147,24 +167,22 @@ public long doInSqlInsertClause(SQLInsertClause insert) {
147167

148168
@Override
149169
public void delete(final Customer customer) {
150-
template.delete(qAddress, new SqlDeleteCallback() {
170+
qdslTemplate.delete(qAddress, new SqlDeleteCallback() {
151171
@Override
152172
public long doInSqlDeleteClause(SQLDeleteClause delete) {
153173
return delete.where(qAddress.customerId.eq(customer.getId())).execute();
154174
}
155175
});
156-
template.delete(qCustomer, new SqlDeleteCallback() {
176+
qdslTemplate.delete(qCustomer, new SqlDeleteCallback() {
157177
@Override
158178
public long doInSqlDeleteClause(SQLDeleteClause delete) {
159179
return delete.where(qCustomer.id.eq(customer.getId())).execute();
160180
}
161181
});
162182
}
163183

164-
@Override
165-
@Transactional(readOnly = true)
166-
public Customer findByEmailAddress(EmailAddress emailAddress) {
167-
return null;
184+
private static String columnLabel(Path<?> path) {
185+
return path.toString();
168186
}
169187

170188
private static class CustomerListExtractor extends OneToManyResultSetExtractor<Customer, Address, Integer> {
@@ -183,14 +201,14 @@ public CustomerListExtractor(ExpectedResults expectedResults) {
183201

184202
@Override
185203
protected Integer mapPrimaryKey(ResultSet rs) throws SQLException {
186-
return rs.getInt(qCustomer.id.toString());
204+
return rs.getInt(columnLabel(qCustomer.id));
187205
}
188206

189207
@Override
190208
protected Integer mapForeignKey(ResultSet rs) throws SQLException {
191-
String columnName = qAddress.addressCustomerRef.getLocalColumns().get(0).toString();
192-
if (rs.getObject(columnName) != null) {
193-
return rs.getInt(columnName);
209+
String fkPath = columnLabel(qAddress.addressCustomerRef.getLocalColumns().get(0));
210+
if (rs.getObject(fkPath) != null) {
211+
return rs.getInt(fkPath);
194212
}
195213
else {
196214
return null;
@@ -222,11 +240,11 @@ private static class CustomerMapper implements RowMapper<Customer> {
222240
@Override
223241
public Customer mapRow(ResultSet rs, int rowNum) throws SQLException {
224242
Customer c = new Customer();
225-
c.setId(rs.getLong(qCustomer.id.toString()));
226-
c.setFirstName(rs.getString(qCustomer.firstName.toString()));
227-
c.setLastName(rs.getString(qCustomer.lastName.toString()));
228-
if (rs.getString(qCustomer.emailAddress.toString()) != null) {
229-
c.setEmailAddress(new EmailAddress(rs.getString(qCustomer.emailAddress.toString())));
243+
c.setId(rs.getLong(columnLabel(qCustomer.id)));
244+
c.setFirstName(rs.getString(columnLabel(qCustomer.firstName)));
245+
c.setLastName(rs.getString(columnLabel(qCustomer.lastName)));
246+
if (rs.getString(columnLabel(qCustomer.emailAddress)) != null) {
247+
c.setEmailAddress(new EmailAddress(rs.getString(columnLabel(qCustomer.emailAddress))));
230248
}
231249
return c;
232250
}
@@ -238,11 +256,11 @@ private static class AddressMapper implements RowMapper<Address> {
238256

239257
@Override
240258
public Address mapRow(ResultSet rs, int rowNum) throws SQLException {
241-
String street = rs.getString(qAddress.street.toString());
242-
String city = rs.getString(qAddress.city.toString());
243-
String country = rs.getString(qAddress.country.toString());
259+
String street = rs.getString(columnLabel(qAddress.street));
260+
String city = rs.getString(columnLabel(qAddress.city));
261+
String country = rs.getString(columnLabel(qAddress.country));
244262
Address a = new Address(street, city, country);
245-
a.setId(rs.getLong(qAddress.id.toString()));
263+
a.setId(rs.getLong(columnLabel(qAddress.id)));
246264
return a;
247265
}
248266
}
Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
CREATE TABLE customer (id BIGINT IDENTITY PRIMARY KEY, first_name VARCHAR(255), last_name VARCHAR(255),
1+
CREATE TABLE customer (
2+
id BIGINT IDENTITY PRIMARY KEY,
3+
first_name VARCHAR(255),
4+
last_name VARCHAR(255),
25
email_address VARCHAR(255));
3-
CREATE TABLE address (id BIGINT IDENTITY PRIMARY KEY,
4-
customer_id BIGINT CONSTRAINT address_customer_ref FOREIGN KEY REFERENCES customer (id),
5-
street VARCHAR(255), city VARCHAR(255), country VARCHAR(255));
6+
CREATE UNIQUE INDEX ix_customer_email ON CUSTOMER (email_address ASC);
7+
CREATE TABLE address (
8+
id BIGINT IDENTITY PRIMARY KEY,
9+
customer_id BIGINT CONSTRAINT address_customer_ref REFERENCES customer (id),
10+
street VARCHAR(255),
11+
city VARCHAR(255),
12+
country VARCHAR(255));

0 commit comments

Comments
 (0)