spring中的rowMapper是否可以将行分配给另一个对象?

时间:2015-02-21 19:38:24

标签: spring

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

Feb 21, 2015 3:20:33 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3d82c5f3: startup date [Sat Feb 21 15:20:33 EST 2015]; root of context hierarchy
Feb 21, 2015 3:20:33 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [spring.xml]
Feb 21, 2015 3:20:33 PM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
INFO: Loaded JDBC driver: com.mysql.jdbc.Driver
Exception in thread "main" java.lang.NullPointerException
    at com.hojat.LibSpringProject.DAO.AuthorDAO.getAuthorById(AuthorDAO.java:17)
    at com.hojat.LibSpringProject.DAO.BookDAO$BookMapper.mapRow(BookDAO.java:185)
    at com.hojat.LibSpringProject.DAO.BookDAO$BookMapper.mapRow(BookDAO.java:1)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60)
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:708)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:805)
    at com.hojat.LibSpringProject.DAO.BookDAO.getBookById(BookDAO.java:22)
    at com.hojat.LibSpringProject.service.TestService.main(TestService.java:26)


public class BookDAO extends JdbcDaoSupport {
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();
        AuthorDAO authorDAO = new AuthorDAO();
        PublisherDAO publisherDAO = new PublisherDAO();

        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 class AuthorDAO extends JdbcDaoSupport {

public Author getAuthorById(int authorId) throws ClassNotFoundException,
        SQLException {
    String sql = "SELECT * FROM tbl_author where authorId = ?";
    return this.getJdbcTemplate().queryForObject(sql,
            new Object[] { authorId }, new AuthorMapper());

public class PublisherDAO extends JdbcDaoSupport {

public Publisher getPublisherById(int publisherId)
        throws ClassNotFoundException, SQLException {
    String sql = "select * from library.tbl_publisher where publisherId = ?";
    return this.getJdbcTemplate().queryForObject(sql,
            new Object[] { publisherId }, new PublisherMapper());

1 个答案:

答案 0 :(得分:0)

AuthorDAO和PublisherDAO基于JdbcDaoSupport,因此它们应该由Spring创建,并且DataSource将受到攻击。 尝试注入这些实现,而不是使用new运算符创建它。

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;
}