使用 Spring JdbcTemplate 进行多个数据库操作
Posted
技术标签:
【中文标题】使用 Spring JdbcTemplate 进行多个数据库操作【英文标题】:using Spring JdbcTemplate for multiple database operations 【发布时间】:2011-02-03 13:57:41 【问题描述】:我喜欢 JdbcTemplate 明显的简单性,但对它的工作原理有点困惑。似乎每个操作(query() 或 update())都从数据源获取连接并关闭它。
很漂亮,但是如何在同一个连接中执行多个 SQL 查询?
我可能想要按顺序执行多个操作(例如,SELECT 后跟 INSERT,然后提交)或者我可能想要执行嵌套查询(SELECT 然后根据每行的结果执行第二个 SELECT)。
我如何使用 JdbcTemplate 做到这一点。我是否使用了正确的课程?
【问题讨论】:
【参考方案1】:如何执行多个 SQL 同一连接中的查询?
这里的正确答案是"use transactions"。如果您开始事务,然后使用JdbcTemplate
执行多个操作,则这些操作中的每一个都将在事务的范围内,因此保证使用相同的连接。
如果您不想参与事务,那么另一种选择是在JdbcTemplate
上使用更原始的操作,例如execute(ConnectionCallback action)
,您提供ConnectionCallback
的实例,该实例被赋予@987654326 @,然后您可以在其上执行您选择的任何操作。当然,但是这样做你在任何实际操作中都得不到JdbcTemplate
的帮助。
在 Spring 中事务真的很简单,你应该考虑使用它们(见上面的链接)。
【讨论】:
您实际上不需要使用实际事务来使用相同的连接。但是,像在 Spring 中使用事务一样需要使用 TransactionProxyFactoryBean 或 Transaction Template。您使用 PROPAGATION_SUPPORTS 或 PROPAGATION_NEVER 进行传播,它将重用相同的连接,但不会启动真正的事务。 如果你使用的是连接池,你不用担心语句之间没有得到相同的连接吗?【参考方案2】:我假设您想要交易?如果是这样,请查看Spring, JdbcTemplate and Transactions。
另外,我建议您查看Ibatis。 Spring JDBC 看起来很方便,但它有一个主要问题:结果集到对象的默认映射使用 Spring 类,在处理大型结果集时实际上非常慢。您可以通过为这些查询编写自己的行映射器来解决这个问题,但我个人不想编写这种样板文件。
举个不同的例子:我有一个查询需要 50 秒,使用基于 Spring 反射的行映射器,而使用手动编码的行映射器需要 2 秒。
此外,Spring JDBC 使用内联 SQL。在 Java 中,这相当难看,因为 Java(令人讨厌)没有良好的多行字符串格式。
【讨论】:
“结果集到对象的默认映射使用 Spring 类”你能详细说明一下吗?我总是将 RowMappers 用于任何类似于查询对象的事情。还有什么其他选择? 我也很好奇这里的“默认映射”是什么意思以及他们如何使用反射。我认为 RowMappers 是 JdbcTemplate 的面包和黄油。 @mattb , @spaaaky21 Spring 可以将结果集映射到对象,例如使用BeanPropertyRowMapper
类(您可以使用它在谷歌上搜索示例)。简单查询就像:List<MyOrder> orders = jt.query("SELECT * FROM orders WHERE custId=?", new BeanPropertyRowMapper<MyOrders>(MyOrder.class), id);
然后您不必包装您的 RowMapper<T>
实现,而是将字段映射到 MyOrder
类的设置器。以上是关于使用 Spring JdbcTemplate 进行多个数据库操作的主要内容,如果未能解决你的问题,请参考以下文章
如何执行 IN() 和 WHERE=?使用 Spring 的 JDBCTemplate 进行 SQL 查询