gpt4 book ai didi

java - Spring JDBCPreparedStatementCreator 无效的 Api 使用

转载 作者:太空宇宙 更新时间:2023-11-04 06:27:36 25 4
gpt4 key购买 nike

我想知道如何使用PreparedStatementCreatorFactory 。就我而言read它类似于下面的代码,除了在极少数示例中,不仅将 sql 提供给工厂,而且还提供 int[] 类型,但我不想传递数百种类型,因为如果将参数作为 object[] 传递,jdbc 通常会根据 java 类型检索类型。我正在使用 Spring 3.1.3 RELEASE。

   public int addEntityAndGetId(String name, String address){
String sql = "INSERT INTO mytable (NAME,ADDRESS) VALUES (?,?)";
Object[] params = new Object[]{name,address};
PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(sql);
PreparedStatementCreator psc = factory.newPreparedStatementCreator(params);
KeyHolder generatedKeyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(psc, generatedKeyHolder);
return generatedKeyHolder.getKey().intValue();
}

但我得到的只是 org.springframework.dao.InvalidDataAccessApiUsageException。

我真的需要这些类型吗?与每个 jdbc update 语句一样,您只需传递一个 object[] 就可以了。

这个问题的目的是通过让 jdbc 确定哪种列类型适合哪个对象来避免指定任何列类型的需要,并避免 CRUD 查询上的PreparedStatementSetters。

最佳答案

您有 2 个不同的错误。一种症状和一种原因。

首先是症状:你得到一个ClassNotFoundException:
org.springframework.dao.InvalidDataAccessApiUsageException
因为您在类路径中缺少 spring-tx 正如 M.Deinum 所说。添加它,因为如果不添加就会遇到麻烦。

接下来是原因。您可以使用newPreparedStatementCreatorFactory(sql);创建工厂。 javadoc 说:创建一个新工厂。需要通过addParameter(org.springframework.jdbc.core.SqlParameter)方法添加参数或者没有参数

您既不能在 PreparedStatementCreatorFactory 的构造函数中声明参数类型,也不能在对 newPreparedStatementCreator() 的调用中声明参数类型。所以 Spring 发出异常。

不,您不能简单地将 Object[] 传递给更新语句,因为底层 JBDC 调用将需要对象的实际类型(有 setIntsetString 等方法)。

现在进行修复。由于您将向更新方法传递 2 个字符串,因此您应该这样创建工厂:

PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(sql,
new int[]{Types.VARCHAR, Types.VARCHAR});

(假设列的类型为 VARCHAR)

但这还不够。由于您想取回新插入行的生成主键,因此必须声明它:

factory.setReturnGeneratedKeys(true);

最后,如果您使用 PosgreSQL,则可能必须使用

generatedKeyHolder.getKeys().get("id");

而不是简单地 generatedKeyHolder.getKey().intValue() (假设包含生成 key 的列的名称是 id )

关于java - Spring JDBCPreparedStatementCreator 无效的 Api 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26574534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com