为什么Spring的JDBC模板不使用表格默认值

问题描述:

我在MYSQL中有一个表格,并且我正在使用JDBC模板对该表格进行插入。为什么Spring的JDBC模板不使用表格默认值

其中一列有默认值,我没有在Map<String, Object> parameters地图中指定它。

我收到异常Column 'colName' cannot be null

任何人都可以解释这个吗?

感谢

* 编辑:代码*

contactDetailsInsertTemplate = new SimpleJdbcInsert(dataSource).withTableName("contactdetails").usingGeneratedKeyColumns("contactcode"); 
Map<String, Object> parameters = new HashMap<String, Object>(); 
Number newId = contactDetailsInsertTemplate.executeAndReturnKey(parameters); 
+0

请显示您使用的代码。 –

您需要限制在SQL插入中指定的列。

SimpleJdbcInsert.usingColumns()

如果你不这样做,将SQL语句需要的所有列和默认值的值不能使用。

例如使用

insert into mytable (col1, col2) values (val1, val2); 

,而不是

insert into mytable values (val1, val2); 

INSERT INTO mytable (1,null)是不一样的INSERT INTO mytable (1)。之前特别插入null,后者将决定留给DB(这将是默认值)。 Spring JDBC正在做前者。

+0

感谢您的回答。你的答案都是正确的,但NickJ的答案对于具体问题更准确。我希望我可以接受你们两个,但我会接受他,并upvote你:)。 – Gleeb

的问题是其他地方:当我使用SimpleJdbcInsert,并通过地图上的参数给它,我简单的希望创建插入statment只能用我提供的参数。我有DEFAULT值表中的NOT NULL列,我不想指定它。我也不想明确地将所有列名放在usingColumns()中,因为我只是在创建参数图时才这样做!我为什么要再做一次?问题是SimpleJdbcInsert希望更聪明,并添加所有列来插入不必要的语句。为什么不使用参数map提供的列创建语句?

请参见:http://forum.spring.io/forum/spring-projects/data/54209-simplejdbcinsert-and-columns-with-default-values

您可以添加其中有一个默认值作为参数传递给usingGeneratedKeyColumns()列。
作为该方法参数包含的列名将从生成的INSERT语句中省略。