2013-08-23 63 views
2

我有一个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?或者另一种方式?

回答

1

在这种情况下,由于您的主要属性是书籍(由于我的不确定),如果我是你,我会将联接查询放在BookDao中。创建另一个dao并不是一个错误,但我认为这不是必需的。

一个建议: 标注的daos与@Repository并把他们放进与@Service 注解服务类,然后在控制器中使用该服务类。 也将业务逻辑放在Service类中。您可以在这里阅读更多What's the difference between @Component, @Repository & @Service annotations in Spring?