2

我有一个 Java + Spring + MySQL Web 应用程序,它存储和显示书籍列表。共有三个 SQL 表 - Authors、Books 和 Book_Authors。

------------
作者
------------
author_id
名
姓
------------

------------
图书
------------
book_id
标题
------------

------------
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 应该是什么样子?或者我应该为此目的创建第三个名为 say BookAuthorsDao 的 Dao?还是另一种方式?

4

1 回答 1

1

在这种情况下,由于您的主要属性是书(由于我不理解),如果我是您,我会将连接查询放在 BookDao 中。创造另一个道不是错误,但我认为没有必要。

一个建议:注解 daos@Repository并将 em 放入注解@Service 的服务类中,然后在控制器中使用服务类。还将业务逻辑放在服务类中。您可以在此处阅读更多内容Spring 中的 @Component、@Repository 和 @Service 注释有什么区别?

于 2013-08-23T18:48:48.633 回答