我有一个Java + Spring + MySQL Web应用程序,它存储和显示书籍列表。有三个SQL表 - 作者,书籍和Book_Authors。JdbcTemplate - DAO设计模式 - 连接查询
------------ 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";
}
}
的问题是,我该如何设计装载书籍,其中包括作者(使用单个连接查询)操作? BookDao课程负责加载包括作者在内的图书是否应该负责?如果是这样的话,RowMapper应该如何?还是应该为此创建第三个叫做BookAuthorsDao的Dao?或者另一种方式?