我的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());
答案 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;
}