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实物控制