2010-04-01 236 views
3

我喜欢JdbcTemplate的显而易见的简单性,但对于它的工作原理我有点困惑。看来每个操作(query()或update())都会从数据源获取连接并关闭它。使用Spring JdbcTemplate进行多个数据库操作

很漂亮,但是如何在同一个连接中执行多个SQL查询?我可能想要按顺序执行多个操作(例如,SELECT后跟INSERT,然后是提交),或者我可能想要执行嵌套查询(SELECT,然后根据每行的结果执行第二个SELECT)。

我该如何做到这一点与JdbcTemplate。我使用正确的课程吗?

回答

6

如何在同一连接中执行多个SQL 查询?

这里的正确答案是"use transactions"。如果您开始交易,然后使用JdbcTemplate执行多个操作,那么每个操作都将在交易范围内,因此保证使用相同的连接。

如果你不想卷入到交易,那么备选方案是使用上JdbcTemplate更基本的操作,像execute(ConnectionCallback action),在那里,您提供的被赋予了ConnectionConnectionCallback一个实例,可以在其上,然后执行您选择的任何操作。当然,但是这样做并不会在任何实际操作中得到JdbcTemplate的帮助。

在Spring中交易真的很容易,你应该考虑使用它们(参见上面的链接)。

+0

您实际上不需要使用实际的事务来使用相同的连接。然而,就像在Spring中使用事务一样,需要使用TransactionProxyFactoryBean或事务模板。您使用PROPAGATION_SUPPORTS或PROPAGATION_NEVER进行传播,它将重用相同的连接,但不会启动真实的事务。 – 2011-11-06 03:28:01

+0

如果您正在使用连接池,您不必担心语句之间没有获得相同的连接吗? – 2013-10-29 19:21:08

4

我假设你想交易?如果是这样,看看Spring, JdbcTemplate and Transactions

在附注上,我建议你看看Ibatis。 Spring JDBC似乎很方便,但它有一个主要问题:结果集到对象的默认映射使用Spring类,在处理大型结果集时实际上非常慢。你可以通过为这些查询编写自己的行映射器来解决这个问题,但是我个人并不想写这种样板文件。

给你一个区别的例子:我有一个查询需要50秒的时间,而基于Spring反射的行映射器花了2秒钟的时间用一个手工编码的行映射器。

此外,Spring JDBC使用内联SQL。在Java中,这很糟糕,因为Java(令人讨厌)没有很好的多行String格式。

+0

“结果集默认映射到对象使用Spring类”你能详细说明吗?我总是使用RowMappers来处理类似于查询对象的任何事情。还有什么其他选择? – 2010-04-01 23:59:43

+0

我也很好奇“默认映射”在这里的含义以及它们如何使用反射。我认为RowMappers是JdbcTemplate的面包和黄油。 – spaaarky21 2012-04-20 21:45:10

+0

@mattb,@ spaaarky21 Spring可以将结果集映射到对象,例如使用'BeanPropertyRowMapper'类(您可以使用它的谷歌示例)。简单的查询如下:'List orders = jt.query(“SELECT * FROM orders WHERE custId =?”,new BeanPropertyRowMapper (MyOrder.class),id);'然后你不必包装你的实现'RowMapper ',而是将字段映射到'MyOrder'类的setter。 – 2014-04-13 20:18:59

相关问题