You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Maven项目中NamedParameterJdbcTemplate空指针异常求助

问题排查与解决方案

嘿,我来帮你搞定这个空指针异常的问题!咱们一步步来拆解问题、修复代码:

1. 空指针异常的根本原因

你代码里的NamedParameterJdbcTemplate namedPJT;只是声明了变量,但没有被Spring注入或者手动初始化——也就是说这个对象一直是null,当你调用namedPJT.update(...)时,自然就抛出了NullPointerException。

2. 修复依赖注入

你需要让Spring把NamedParameterJdbcTemplate的实例自动注入到EmployeeDaoImpl中,这里有两种常用且规范的方式:

方式1:使用@Autowired注解(简单直接)

在变量声明上添加@Autowired注解,让Spring自动完成注入:

@Autowired
NamedParameterJdbcTemplate namedPJT;

方式2:构造函数注入(更推荐,符合Spring最佳实践)

通过构造函数注入依赖,能保证对象在初始化时就拥有所需的实例,避免空指针风险:

private final NamedParameterJdbcTemplate namedPJT;

// 构造函数注入
public EmployeeDaoImpl(NamedParameterJdbcTemplate namedPJT) {
    this.namedPJT = namedPJT;
}

3. 修复SQL语句的错误

你的INSERT语句还存在几个语法和用法错误,一起修正:

  • 语法错误:VALUE应该改为VALUES
  • 字段名用单引号'是错误的,MySQL中字段名需用反引号`包裹(如果字段名不是关键字也可以省略)
  • 既然用了NamedParameterJdbcTemplate,就该使用命名参数(:参数名),而不是位置占位符?

修正后的SQL语句:

final String sql = "INSERT INTO authors(`FirstName`, `LastName`) VALUES(:FirstName, :LastName)";

4. 额外配置检查

确保你的Spring配置类里已经正确配置了数据源和NamedParameterJdbcTemplate的Bean,比如:

@Configuration
public class DatabaseConfig {
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/你的数据库名");
        dataSource.setUsername("你的数据库用户名");
        dataSource.setPassword("你的数据库密码");
        return dataSource;
    }

    @Bean
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate(DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
}

修复后的完整代码示例

package com.mariam.employee;

import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;

@Repository
public class EmployeeDaoImpl implements EmployeeDao {

    private final NamedParameterJdbcTemplate namedPJT;

    // 构造函数注入依赖
    public EmployeeDaoImpl(NamedParameterJdbcTemplate namedPJT) {
        this.namedPJT = namedPJT;
    }

    public SqlParameterSource getSqlP(Employee e) {
        MapSqlParameterSource m = new MapSqlParameterSource();
        m.addValue("FirstName", e.getFirstName());
        m.addValue("LastName", e.getLastName());
        // 注意:你的INSERT语句里没有用到id字段,若authors表的id是自增主键,这里可以去掉该行
        // m.addValue("id", e.getID());
        return m;
    }

    @Override
    public void save(Employee e) {
        final String sql = "INSERT INTO authors(`FirstName`, `LastName`) VALUES(:FirstName, :LastName)";
        namedPJT.update(sql, getSqlP(e));
        System.out.println("Passed");
    }
}

内容的提问来源于stack exchange,提问作者Momin Naveed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:02:31