spring中的rowMappper是否可以将一行指定给另一个对象?

spring中的rowMappper是否可以将一行指定给另一个对象?,spring,Spring,我的spring项目中有一个DAO,它从其他表中获取两个变量。我希望在这个DAO中按ID获取一行,并希望将这两个变量作为对象返回。我编写了DAO类和rowMapper类,如下所示。但我无法获取author和publisher对象。我得到了nullPointerException。我应该如何在我的图书对象中获得这些对象(我的作者和出版商DAO工作正常) 2015年2月21日下午3:20:33 org.springframework.context.support.ClassPathXmlAppli

我的spring项目中有一个DAO,它从其他表中获取两个变量。我希望在这个DAO中按ID获取一行,并希望将这两个变量作为对象返回。我编写了DAO类和rowMapper类,如下所示。但我无法获取author和publisher对象。我得到了nullPointerException。我应该如何在我的图书对象中获得这些对象(我的作者和出版商DAO工作正常)

2015年2月21日下午3:20:33 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息:刷新org.springframework.context.support。ClassPathXmlApplicationContext@3d82c5f3:启动日期[美国东部时间2015年2月21日星期六15:20:33];上下文层次结构的根
2015年2月21日下午3:20:33 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息:从类路径资源[spring.XML]加载XMLbean定义
2015年2月21日下午3:20:33 org.springframework.jdbc.datasource.driverManager数据源setDriverClassName
信息:加载的JDBC驱动程序:com.mysql.JDBC.driver
线程“main”java.lang.NullPointerException中出现异常
在com.hojat.LibSpringProject.DAO.AuthorDAO.getauthordyid(AuthorDAO.java:17)
位于com.hojat.LibSpringProject.DAO.BookDAO$BookMapper.mapRow(BookDAO.java:185)
位于com.hojat.LibSpringProject.DAO.BookDAO$BookMapper.mapRow(BookDAO.java:1)
位于org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93)
位于org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60)
位于org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:708)
位于org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
位于org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)
位于org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727)
位于org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737)
位于org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:805)
位于com.hojat.LibSpringProject.DAO.BookDAO.getBookById(BookDAO.java:22)
位于com.hojat.LibSpringProject.service.TestService.main(TestService.java:26)
公共类BookDAO扩展了jdbcdao支持{
public Book getBookById(int bookId)抛出SQLException,
ClassNotFoundException{
String sql=“select*from library.tbl_book,其中bookId=?”;
返回此.getJdbcTemplate().queryForObject(sql,新对象[]{bookId},新BookMapper());
}
私有静态最终类BookMapper实现了RowMapper{
@凌驾
public Book mapRow(结果集rs,int rowNum){
书=新书();
作者=新作者();
Publisher Publisher=新Publisher();
AuthorDAO AuthorDAO=新的AuthorDAO();
PublisherDAO PublisherDAO=新PublisherDAO();
试一试{
簿记簿(rs.GEINT(“簿记ID”);
book.setTitle(rs.getString(“title”);
author=authorDAO.getAuthorById(rs.getInt(“authId”);
书的作者(作者);
publisher=publisherDAO.getPublisherById(rs.getInt(“pubId”);
图书出版商;
}catch(ClassNotFoundException | SQLException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
还书;
}
公共类AuthorDAO扩展了JDBCDAO支持{
公共作者getAuthorById(int authorId)抛出ClassNotFoundException,
SQLException{
String sql=“SELECT*FROM tbl_author,其中authord=?”;
返回此.getJdbcTemplate().queryForObject(sql,
新对象[]{authorId},新AuthorMapper());
公共类PublisherDAO扩展了JDBCDAO支持{
公共发布服务器getPublisherById(int publisherId)
抛出ClassNotFoundException、SQLException{
String sql=“select*from library.tbl_publisher,其中publisherId=?”;
返回此.getJdbcTemplate().queryForObject(sql,
新对象[]{publisherId},新PublisherMapper());

AuthorDAO和PublisherDAO基于JDBCDAO支持,因此它们应该由Spring创建,数据源将被插入。 尝试注入这些实现,而不是使用新操作符创建它

public class BookDAO extends JdbcDaoSupport {

    @Autowired
    AuthorDAO authorDAO;

    @Autowired
    PublisherDAO publisherDAO;

    public Book getBookById(int bookId) throws SQLException,
        ClassNotFoundException {
        String sql = "select * from library.tbl_book where bookId = ?";
    return this.getJdbcTemplate().queryForObject(sql,new Object[] { bookId }, new BookMapper());
}


private static final class BookMapper implements RowMapper<Book> {

@Override
public Book mapRow(ResultSet rs, int rowNum) {
    Book book = new Book();
    Author author = new Author();
    Publisher publisher = new Publisher();


    try {
        book.setBookId(rs.getInt("bookId"));
        book.setTitle(rs.getString("title"));
        author = authorDAO.getAuthorById(rs.getInt("authId"));
        book.setAuthor(author);
        publisher = publisherDAO.getPublisherById(rs.getInt("pubId"));
        book.setPublisher(publisher);

    } catch (ClassNotFoundException | SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return book;
}
public类BookDAO扩展了jdbcdao支持{
@自动连线
AuthorDAO AuthorDAO;
@自动连线
出版者道出版者道;
public Book getBookById(int bookId)抛出SQLException,
ClassNotFoundException{
String sql=“select*from library.tbl_book,其中bookId=?”;
返回此.getJdbcTemplate().queryForObject(sql,新对象[]{bookId},新BookMapper());
}
私有静态最终类BookMapper实现了RowMapper{
@凌驾
public Book mapRow(结果集rs,int rowNum){
书=新书();
作者=新作者();
Publisher Publisher=新Publisher();
试一试{
簿记簿(rs.GEINT(“簿记ID”);
book.setTitle(rs.getString(“title”);
author=authorDAO.getAuthorById(rs.getInt(“authId”);
书的作者(作者);
publisher=publisherDAO.getPublisherById(rs.getInt(“pubId”);
图书出版商;
}catch(ClassNotFoundException | SQLException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
还书;
}

您正在通过新操作员创建AuthorDAO和PublisherDAO。当您设置数据源或其他数据库连接时,我看不到位置。您能为这些DAO粘贴默认构造函数吗?我在原始问题中添加了AuthorDAO和PublisherDAO类。我在春季是新手,可能完全错了。当您询问一个例外时ion,始终发布异常的完整堆栈跟踪,并告诉它所指的行。异常已添加到原始问题中。
public class BookDAO extends JdbcDaoSupport {

    @Autowired
    AuthorDAO authorDAO;

    @Autowired
    PublisherDAO publisherDAO;

    public Book getBookById(int bookId) throws SQLException,
        ClassNotFoundException {
        String sql = "select * from library.tbl_book where bookId = ?";
    return this.getJdbcTemplate().queryForObject(sql,new Object[] { bookId }, new BookMapper());
}


private static final class BookMapper implements RowMapper<Book> {

@Override
public Book mapRow(ResultSet rs, int rowNum) {
    Book book = new Book();
    Author author = new Author();
    Publisher publisher = new Publisher();


    try {
        book.setBookId(rs.getInt("bookId"));
        book.setTitle(rs.getString("title"));
        author = authorDAO.getAuthorById(rs.getInt("authId"));
        book.setAuthor(author);
        publisher = publisherDAO.getPublisherById(rs.getInt("pubId"));
        book.setPublisher(publisher);

    } catch (ClassNotFoundException | SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return book;
}