The world's smallest Java DAO (with heavy lifting provided by Spring Framework):
public class SimpleDAO {
private final DataSourceTransactionManager transactionManager;
public SimpleDAO(DataSourceTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public <T> T dao(Dao<T> dao) {
return dao.using(transactionManager);
}
public interface Dao<T> {
default T using(DataSourceTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager).execute(
status -> on(new JdbcTemplate(transactionManager.getDataSource()), status));
}
T on(JdbcTemplate jdbcTemplate, TransactionStatus status);
}
} Usage:
class InviteesDAO {
private final SimpleDAO transact;
InviteesDAO(DatabaseTransactionManager transactionManager) {
transact = new SimpleDAO(tranactionManager);
}
List<String> getInvitees() {
return transact.dao((jdbcTemplate, status) -> jdbcTemplate.queryForList(
"SELECT username FROM invitees", String.class));
}
void invite(String username) {
transact.dao((jdbcTemplate, status) -> jdbcTemplate.update(
"INSERT INTO invitees (username) VALUES (?)", username));
}
}
UPDATE: Demonstrate with composition rather than inheritance.