JdbcTemplate - DAO设计模式 - 连接查询

时间:2013-08-23 17:58:37

标签: spring design-patterns dao jdbctemplate

我有一个Java + Spring + MySQL Web应用程序,用于存储和显示书籍列表。有三个SQL表 - 作者,书籍和Book_Authors。

------------
Authors
------------
author_id
firstname
surname
------------

------------
Books
------------
book_id
title
------------

------------
Book_Authors
------------
author_id
book_id
------------

请注意,书籍和作者之间的关系是M:N,即单个人可能是多本书的作者,同时一本书可以由多个人创作。

我有以下DAO课程。

@Service("bookDao")
public class BookDao
{
    @Resource(name="jdbcTemplate")
    private JdbcTemplate jdbcTemplate;

    private RowMapper<Book> mapper = new RowMapper<Book>() {
        ...
    };

    public List<Book> selectAll() {
        ...
    }

    ...
}

@Service("authorDao")
public class AuthorDao
{
    @Resource(name="jdbcTemplate")
    private JdbcTemplate jdbcTemplate;

    private RowMapper<Author> mapper = new RowMapper<Author>() {
        ...
    };

    public List<Author> selectAll() {
        ...
    }

}

对于我的一些观点,我需要加载(一部分)所有书籍,包括每个书籍的作者集。所以,我的数据类和控制器看起来应该是这样的。

public class Book {
    private List<Author> authors = ...;
    ...
}

@Controller
public class Controller 
{
    @Resource(name = "authorDao")
    private AuthorDao authorDao;

    @Resource(name = "bookDao")
    private BookDao bookDao;

    @RequestMapping(value = "/books.html")
    public String books()
    {
        List<Book> books = ???;
        ...
        return "books";
    }
}

问题是,如何设计加载包括作者在内的书籍的操作(使用单个JOIN查询)? BookDao类是否应负责加载包括作者在内的书籍?如果是这样,那么RowMapper应该如何?或者我应该为此目的创建一个叫做BookAuthorsDao的第三个Dao?或者另一种方式?

1 个答案:

答案 0 :(得分:1)

在这种情况下,由于你的主要属性是书(由于我的未成年),如果我是你,我会把连接查询放在BookDao中。创建另一个dao并不是一个错误,但我认为没有必要。

一项建议: 使用@Repository注释daos并将em放入使用@Service注释的服务类中 然后使用控制器中的服务类。 还将业务逻辑放在Service类中。 您可以在此处阅读更多内容What's the difference between @Component, @Repository & @Service annotations in Spring?