Spring JdbcTemplate / NamedParameterJdbcTemplate 传递空值作为参数值

Posted

技术标签:

【中文标题】Spring JdbcTemplate / NamedParameterJdbcTemplate 传递空值作为参数值【英文标题】:Spring JdbcTemplate / NamedParameterJdbcTemplate passing null value as a parameter value 【发布时间】:2012-02-15 02:01:16 【问题描述】:

我在使用 Spring 框架的 MapSqlParameterSource 将空值传递给 NamedParameterJdbcTemplate 时遇到问题。有人知道怎么做吗?

目前我的代码是:

String sql = "update person set project = :project where id = :id;";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("project ", null);
params.addValue("id ", 1);
int count = newNamedParameterJDBCTemplate().update(sql, params);

这是我得到 NullPointerException 的地方。

【问题讨论】:

你是否为从newNamedParameterJDBCTemplate()返回的NamedParameterJDBCTemplate设置了dataSource xSNRG,你能分享一下是什么问题吗? Titi 的回答与您的代码相同。 【参考方案1】:

这是我在 Spring 3.1 上的代码

String sql = "update user set name = :name where id = :id";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("name", null);
params.addValue("id", 1);
namedParameterJdbcTemplate.update(sql, params);

工作正常。 也许堆栈跟踪可能会有所帮助?

【讨论】:

【参考方案2】:

在纯 jdbc 中,它的 PreparedStatement.setNull(int,java.sql.Types.NULL); 从 MapSqlParameterSource api 有

addValue(String paramName, Object value,int sqlType)

尝试提供 java.sql.Types.NULL 作为 sqlType。

这可能会有所帮助。

【讨论】:

【参考方案3】:

参数名后面多了一个空格:

params.addValue("project ", null);
                        ↑   
params.addValue("id ", 1);
                   ↑

【讨论】:

【参考方案4】:

Map.of() 不支持 null

String sql = "update person set project = :project where id = :id;";

// ISSUE: Map.of doesn't support null values, but HashMap does:
Map<String, Object> params = new HashMap<>();
params.put("project", null);
params.put("id", 1);
int count = newNamedParameterJDBCTemplate().update(sql, params);

【讨论】:

谢谢,帮了我)【参考方案5】:

请确保是否为您的 jdbcTemplate 设置了数据源,如下所示 namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);

【讨论】:

【参考方案6】:

我认为分号在下面的代码中是多余的:

String sql = "update person set project = :project where id = :id;";

去掉id后面的分号。应该是这样的:

String sql = "update person set project = :project where id = :id";

【讨论】:

以上是关于Spring JdbcTemplate / NamedParameterJdbcTemplate 传递空值作为参数值的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 与 JdbcTemplate 一起工作

Spring之004: jdbcTemplate基本使用Spring实物控制

Spring JdbcTemplate+JdbcDaoSupport实例

Spring JdbcTemplate详解

Spring JdbcTemplate详解

Spring JdbcTemplate详解