Mysql 获取我刚刚用Spring插入的主键

Mysql 获取我刚刚用Spring插入的主键,mysql,spring,Mysql,Spring,我在MySQL的表中插入一行。代码如下: public final String SQLADDPROJECT="insert into table(value1,value2,value3) values(?,?,?)"; getJdbcTemplate().update(SQLADDPROJECT, new Object[]{model.getValue1, model.getValue2(), model.getValue3()}); 此i

我在MySQL的表中插入一行。代码如下:

public final String SQLADDPROJECT="insert into table(value1,value2,value3) values(?,?,?)";
getJdbcTemplate().update(SQLADDPROJECT, new Object[]{model.getValue1, 
            model.getValue2(),
            model.getValue3()});
此insert语句工作正常,模型不为空。该表有一个主键是自动递增的,我希望获得该键,以便稍后在代码中使用它。我做了一些搜索,使用了一个钥匙夹,这样:

KeyHolder keyHolder = new GeneratedKeyHolder();
public final String SQLADDPROJECT="insert into table(value1,value2,value3) values(?,?,?)";
getJdbcTemplate().update(SQLADDPROJECT, new Object[]{model.getValue1, 
            model.getValue2(),
            model.getValue3()}, keyHolder);
Long pk=keyHolder.getKey().longValue();
但我收到一个例外:

java.sql.SQLException: Invalid argument value: java.io.NotSerializableException
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:3920)
com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3564)
org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:351)
org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:216)
org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:144)
org.springframework.jdbc.core.ArgPreparedStatementSetter.doSetValue(ArgPreparedStatementSetter.java:65)
org.springframework.jdbc.core.ArgPreparedStatementSetter.setValues(ArgPreparedStatementSetter.java:46)
org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:816)
org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:1)
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:812)
org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:868)
org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:876)
my.package.Dao.ProyectoDaoImp.saveProject(ProyectoDaoImp.java:54)
my.package.Services.ProyectoServiceImp.saveProject(ProyectoServiceImp.java:25)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:69)
org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:109)
org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:57)
org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)
org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:97)
org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84)
org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75)
org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188)
org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145)
org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51)
org.springframework.webflow.engine.ActionList.execute(ActionList.java:155)
org.springframework.webflow.engine.State.enter(State.java:193)
org.springframework.webflow.engine.Transition.execute(Transition.java:227)
org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:393)
org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214)
org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119)
org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555)
org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:388)
org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210)
org.springframework.webflow.engine.ViewState.handleEvent(ViewState.java:232)
org.springframework.webflow.engine.ViewState.resume(ViewState.java:196)
org.springframework.webflow.engine.Flow.resume(Flow.java:545)
org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:258)
org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:169)
org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183)
org.springframework.webflow.mvc.servlet.FlowController.handleRequest(FlowController.java:174)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

causa raíz

java.io.NotSerializableException: org.springframework.jdbc.support.GeneratedKeyHolder
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:3909)
com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3564)
   org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:351)
org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:216)
org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:144)
org.springframework.jdbc.core.ArgPreparedStatementSetter.doSetValue(ArgPreparedStatementSetter.java:65)
org.springframework.jdbc.core.ArgPreparedStatementSetter.setValues(ArgPreparedStatementSetter.java:46)
org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:816)
org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:1)
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:812)
org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:868)
org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:876)
my.package.Dao.ProyectoDaoImp.saveProject(ProyectoDaoImp.java:54)
my.package.Services.ProyectoServiceImp.saveProject(ProyectoServiceImp.java:25)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:69)
org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:109)
org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:57)
org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)
org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:97)
org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84)
org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75)
org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188)
org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145)
org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51)
org.springframework.webflow.engine.ActionList.execute(ActionList.java:155)
org.springframework.webflow.engine.State.enter(State.java:193)
org.springframework.webflow.engine.Transition.execute(Transition.java:227)
org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:393)
org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214)
org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119)
org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555)
org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:388)
org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210)
org.springframework.webflow.engine.ViewState.handleEvent(ViewState.java:232)
org.springframework.webflow.engine.ViewState.resume(ViewState.java:196)
org.springframework.webflow.engine.Flow.resume(Flow.java:545)
org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:258)
org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:169)
org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183)
org.springframework.webflow.mvc.servlet.FlowController.handleRequest(FlowController.java:174)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
我可以这样使用钥匙夹吗?如果没有,我如何获得刚刚插入的pk?多谢各位


注意:我的类扩展了JdbcDaoSupport

,因为在
jdbcdemplate
中没有带
update(String sql,Object[]args,KeyHolder generatedKeyHolder)
参数的方法

您只有
更新(PreparedStatementCreator psc,KeyHolder generatedKeyHolder)


您的方法调用正在调用一个重载方法
update(字符串sql、对象[]args、int[]argTypes)
这导致了
java.sql.SQLException:无效参数值:

我已经看到了他们使用
键盘夹的例子,但我发现当有一个更简单的方法可用时太麻烦了。我今天早上确实做了。您使用一个
SimpleJdbcInsert
对象,它将返回生成的密钥

SimpleJdbcInsert insertContactList = new SimpleJdbcInsert(jdbcTemplate)
            .withTableName("FOO_TABLE").usingColumns("Other", "Columns")
            .usingGeneratedKeyColumns("FooID");

Map<String,Object> insertParameters = new HashMap<String, Object>();
/* 
 * These key pair values must match the columns that you 
 * specified in the .usingColumns() call above. If you don't
 * want to insert any other data, just don't call the .usingColumns method,
 * and insert a blank map.
 */ 
insertParameters.put("Other", foo.getOther());
insertParameters.put("Columns", foo.getColumns());

Number generatedFooId = insertContactList.executeAndReturnKey(insertParameters);
return generatedFooId;
SimpleJDBCInsertContactList=new SimpleJDBCCinsert(jdbcTemplate)
.withTableName(“FOO_TABLE”)。使用列(“其他”、“列”)
.使用GeneratedKeyColumns(“FooID”);
Map insertParameters=new HashMap();
/* 
*这些密钥对值必须与您选择的列匹配
*在上面的.usingColumns()调用中指定。如果你不
*要插入任何其他数据,请不要调用.usingColumns方法,
*并插入一张空白地图。
*/ 
insertParameters.put(“其他”,foo.getOther());
insertParameters.put(“Columns”,foo.getColumns());
Number generatedFooId=insertContactList.executeAndReturnKey(insertParameters);
返回生成的fooid;
这个方法显然是假设您有一个可用的
JdbcTemplate
,并且您的PK是数据库生成的值


如果其中任何一个不清楚,请告诉我,我可以扩展我的答案。

我知道,但有一个带有签名更新的方法(字符串sql、对象…args),这意味着您可以向该方法添加任意数量的任何类型的参数。我原以为添加钥匙夹可以奏效,但实际上不行。我正在尝试,当我看到它是否奏效时,我会给你反馈。谢谢干得不错,谢谢!如果有人使用此答案,并且在其数据库中有任何“二进制”字段,并将其用作“true”或“false”,如果您执行“insertparameters.put”(“其他”,true);它将启动DataTruncationException。您必须执行“insertparameters.put”(“其他”,1)”