Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JdbcTemplate-DAO设计模式-连接查询_Spring_Design Patterns_Dao_Jdbctemplate - Fatal编程技术网

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

Spring JdbcTemplate-DAO设计模式-连接查询,spring,design-patterns,dao,jdbctemplate,Spring,Design Patterns,Dao,Jdbctemplate,我有一个Java+Spring+MySQL web应用程序,用于存储和显示书籍列表。有三个SQL表-Authors、Books和Book_Authors ------------ Authors ------------ author_id firstname surname ------------ ------------ Books ------------ book_id title ------------ ------------ Book_Authors -----------

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

------------ Authors ------------ author_id firstname surname ------------ ------------ Books ------------ book_id title ------------ ------------ Book_Authors ------------ author_id book_id ------------ ------------ 作者 ------------ 作者id 名字 姓 ------------ ------------ 书 ------------ 书号 标题 ------------ ------------ 图书作者 ------------ 作者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() {
        ...
    }

}
@服务(“书刀”)
公共类藏书刀
{
@资源(name=“jdbcTemplate”)
私有JdbcTemplate JdbcTemplate;
私有行映射器映射器=新建行映射器(){
...
};
公共列表selectAll(){
...
}
...
}
@服务(“authorDao”)
公共类AuthorDao
{
@资源(name=“jdbcTemplate”)
私有JdbcTemplate JdbcTemplate;
私有行映射器映射器=新建行映射器(){
...
};
公共列表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";
    }
}
公共课堂教材{
私人名单作者=。。。;
...
}
@控制器
公共类控制器
{
@资源(name=“authorDao”)
私家侦探;
@资源(name=“bookDao”)
私家书刀;
@RequestMapping(value=“/books.html”)
公共弦书()
{
图书目录=???;
...
归还“书籍”;
}
}

问题是,如何设计加载包含作者的书籍的操作(使用单个联接查询)?是否应由BookDao类负责加载包含作者的书籍?如果是这样,那么RowMapper应该是什么样子?或者我应该为此创建第三个Dao,比如说BookAuthorsDao吗?或者另一种方式?

在本例中,由于您的主要属性是book(由于我的不了解),如果我是您,我会将join查询放在BookDao中。创建另一把刀不是一个错误,但我认为没有必要

一项建议: 用
@Repository
注释DAO,并将它们放在用
@service
注释的服务类中 然后使用控制器中的服务类。 还将业务逻辑放在服务类中。 你可以在这里读更多