0

嗨,我是这个 Spring 、MVC 和 JdBC 支持的新手。我希望能够连接到 mysql 数据库..但是当我运行我的网络时它返回 null。我相信下面的代码应该很简单,我在这里缺少什么?感谢所有回复

以下是我尝试查询 URL 时的错误

java.lang.NullPointerException
com.simple.myacc.dao.JdbcContactDao.findAll(JdbcContactDao.java:55)
com.simple.myacc.ContactController.getAll(ContactController.java:44)

我的 spring.xml

.....

<context:component-scan base-package="com.simple.myacc" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/jsp/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/webcontact" />
    <property name="username" value="root" />
    <property name="password" value="password" />
</bean>

<bean id="jdbcContactDao" class="com.simple.myacc.dao.JdbcContactDao">
    <property name="dataSource" ref="dataSource" />
</bean>

我的 JdbcContactDao

public class JdbcContactDao {
protected static Logger logger = Logger.getLogger("service");
private DataSource dataSource;
private JdbcTemplate jdbcTemplate;

public JdbcContactDao() {

}

public List<Contact> findAll() {

    String sql = "select * from contact";
    List<Contact> contacts = new ArrayList<Contact>();
    List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
    for (Map rs : rows) {
        Contact contact = new Contact();
        contact.setId((Integer) rs.get("id"));
        contact.setFirstname((String) rs.get("firstname"));
        contact.setLastname((String) rs.get("lastname"));
        contact.setEmail((String) rs.get("email"));
        contact.setPhone((String) rs.get("phone"));
        contacts.add(contact);
    }
    return contacts;
}

@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;

} }

我的控制器,它的一部分

@RequestMapping(value="/contact/list2",method = RequestMethod.GET)
public String getAll(ModelMap model) {
    dao=new JdbcContactDao();
    List<Contact> contacts = dao.findAll();

     // Attach persons to the Model
     model.addAttribute("contacts", contacts);


     return "contact.list";

}

这是说 NULL 的行

        List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
4

4 回答 4

1

使用 JdbcTemplate 类时的一个常见习惯用法是在 Spring 配置文件中配置 DataSource,然后将共享的 DataSource bean 依赖注入到 DAO 类中;JdbcTemplate 在数据源的设置器中创建。私有 JdbcTemplate jdbcTemplate;

public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

您可以在此处阅读更多信息

您的代码将如下所示

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/webcontact" />
<property name="username" value="root" />
<property name="password" value="password" />

你不需要这个

<bean id="jdbcContactDao" class="com.simple.myacc.dao.JdbcContactDao">
<property name="dataSource" ref="dataSource" />

而是这样做

 @Autowired
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

并用 @Repository 注释你的 JdbcContactDao 类我认为这应该工作

于 2012-07-17T15:38:51.393 回答
0

我猜 JdbcContactDao 的第 55 行是这个List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql); 你声明了 jdbcTemplate,但从不给它一个值,它也没有为注入注解,所以它总是为空。因此,当您尝试使用它时,您将获得 NPE。

于 2012-07-17T15:25:33.183 回答
0

您已经在配置文件中配置了 dataSource 和 JdbcContactDAO bean。因此,您需要以同样的方式将 jdbcContactDAO bean 注入到您的控制器中。

<bean id="myController" class="mypath.MyController">
<property name="dao" ref="jdbcContactDao"/>
</bean>

在你的控制器中......

public JdbcContactDao dao;

@Resource(name="dao")
public void setDao(JdbcContactDao dao){
    this.dao = dao;
}


@RequestMapping(value="/contact/list2",method = RequestMethod.GET)
public String getAll(ModelMap model) {

    List<Contact> contacts = dao.findAll();

    // Attach persons to the Model
    model.addAttribute("contacts", contacts);


    return "contact.list";

}
于 2012-07-17T15:45:51.743 回答
0

有一个类似的问题是使用 java/jdbc String sql = "select user_name from table" 连接到旧表

jdbc.queryForList(sql); 

queryReturnList = jdbc.queryForList(sql);  

    for (Map mp : queryReturnList){          
        String userName = (String)mp.get("user_name");          
}

用户名始终为空。查看返回值的映射发现该映射没有使用用户名,而是在“用户名”表上设置的标签必须有 DBA 的修复。希望这可以帮助

于 2015-09-22T20:17:59.717 回答