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.