- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道如何使用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.InvalidDataAccessApiUsageExceptionspring-tx
正如 M.Deinum 所说。添加它,因为如果不添加就会遇到麻烦。
接下来是原因。您可以使用newPreparedStatementCreatorFactory(sql);
创建工厂。 javadoc 说:创建一个新工厂。需要通过addParameter(org.springframework.jdbc.core.SqlParameter)方法添加参数或者没有参数
您既不能在 PreparedStatementCreatorFactory
的构造函数中声明参数类型,也不能在对 newPreparedStatementCreator()
的调用中声明参数类型。所以 Spring 发出异常。
不,您不能简单地将 Object[]
传递给更新语句,因为底层 JBDC 调用将需要对象的实际类型(有 setInt
、setString
等方法)。
现在进行修复。由于您将向更新方法传递 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/
我想知道如何使用PreparedStatementCreatorFactory 。就我而言read它类似于下面的代码,除了在极少数示例中,不仅将 sql 提供给工厂,而且还提供 int[] 类型,但我
我是一名优秀的程序员,十分优秀!