我有一个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?或者另一种方式?
答案 0 :(得分:1)
在这种情况下,由于你的主要属性是书(由于我的未成年),如果我是你,我会把连接查询放在BookDao中。创建另一个dao并不是一个错误,但我认为没有必要。
一项建议:
使用@Repository
注释daos并将em放入使用@Service
注释的服务类中
然后使用控制器中的服务类。
还将业务逻辑放在Service类中。
您可以在此处阅读更多内容What's the difference between @Component, @Repository & @Service annotations in Spring?