编写数据访问层的时候,可以使用DAO模式。DAO即Data Access Object的缩写,它没有什么神秘之处,实现起来基本如下:

    Spring提供了一个JdbcDaoSupport类,用于简化DAO的实现。这个JdbcDaoSupport没什么复杂的,核心代码就是持有一个JdbcTemplate

    1. public abstract class JdbcDaoSupport extends DaoSupport {
    2. private JdbcTemplate jdbcTemplate;
    3. public final void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    4. this.jdbcTemplate = jdbcTemplate;
    5. initTemplateConfig();
    6. }
    7. public final JdbcTemplate getJdbcTemplate() {
    8. return this.jdbcTemplate;
    9. }
    10. ...
    11. }

    它的意图是子类直接从JdbcDaoSupport继承后,可以随时调用getJdbcTemplate()获得JdbcTemplate的实例。那么问题来了:因为JdbcDaoSupportjdbcTemplate字段没有标记@Autowired,所以,子类想要注入,还得自己想个办法:

    如果使用传统的XML配置,并不需要编写@Autowired JdbcTemplate jdbcTemplate,但是考虑到现在基本上是使用注解的方式,我们可以编写一个AbstractDao,专门负责注入JdbcTemplate

    1. @Autowired
    2. private JdbcTemplate jdbcTemplate;
    3. @PostConstruct
    4. public void init() {
    5. super.setJdbcTemplate(jdbcTemplate);
    6. }
    7. }

    这样,子类的代码就非常干净,可以直接调用getJdbcTemplate()

    倘若肯再多写一点样板代码,就可以把AbstractDao改成泛型,并实现getById()getAll()deleteById()这样的通用方法:

    1. public abstract class AbstractDao<T> extends JdbcDaoSupport {
    2. private String table;
    3. private Class<T> entityClass;
    4. private RowMapper<T> rowMapper;
    5. public AbstractDao() {
    6. // 获取当前类型的泛型类型:
    7. this.entityClass = getParameterizedType();
    8. this.table = this.entityClass.getSimpleName().toLowerCase() + "s";
    9. this.rowMapper = new BeanPropertyRowMapper<>(entityClass);
    10. public T getById(long id) {
    11. return getJdbcTemplate().queryForObject("SELECT * FROM " + table + " WHERE id = ?", this.rowMapper, id);
    12. }
    13. public List<T> getAll(int pageIndex) {
    14. int limit = 100;
    15. int offset = limit * (pageIndex - 1);
    16. return getJdbcTemplate().query("SELECT * FROM " + table + " LIMIT ? OFFSET ?",
    17. new Object[] { limit, offset },
    18. this.rowMapper);
    19. }
    20. public void deleteById(long id) {
    21. getJdbcTemplate().update("DELETE FROM " + table + " WHERE id = ?", id);
    22. }
    23. ...
    24. }

    可见,DAO模式就是一个简单的数据访问模式,是否使用DAO,根据实际情况决定,因为很多时候,直接在Service层操作数据库也是完全没有问题的。

    从下载练习:使用DAO模式 (推荐使用快速下载)

    Spring提供了来便于我们实现DAO模式;

    使用DAO - 图1