我喜欢JdbcTemplate的明显简洁性,但对它的工作方式有些困惑。似乎每个操作(query()或update())都会从数据源中获取连接并关闭。
这很好,但如何在同一连接中执行多个SQL查询呢?
我可能希望按顺序执行多个操作(例如SELECT后跟INSERT再跟一个commit),或者我可能希望执行嵌套查询(基于每行结果执行SELECT,然后执行第二个SELECT)。
我该如何使用JdbcTemplate来实现这些功能?我是否正在使用正确的类?
我喜欢JdbcTemplate的明显简洁性,但对它的工作方式有些困惑。似乎每个操作(query()或update())都会从数据源中获取连接并关闭。
这很好,但如何在同一连接中执行多个SQL查询呢?
我可能希望按顺序执行多个操作(例如SELECT后跟INSERT再跟一个commit),或者我可能希望执行嵌套查询(基于每行结果执行SELECT,然后执行第二个SELECT)。
我该如何使用JdbcTemplate来实现这些功能?我是否正在使用正确的类?
如何在同一连接中执行多个 SQL 查询?
正确的答案是 "使用事务"。如果您开始了事务,然后使用 JdbcTemplate
执行多个操作,则每个操作都在事务范围内,因此保证使用相同的连接。
如果您不想涉及事务,则可以使用更原始的 JdbcTemplate
操作,例如 execute(ConnectionCallback action)
,其中您提供一个 ConnectionCallback
实例,该实例获得一个 Connection
,您可以在其上执行任何选择的操作。当然,这样做时,您将无法在任何实际操作中获得 JdbcTemplate
的帮助。
在 Spring 中,事务真的很容易,您应该考虑使用它们(请参见上面的链接)。
BeanPropertyRowMapper
类(您可以通过谷歌搜索使用它的示例)。简单查询如下:List<MyOrder> orders = jt.query("SELECT * FROM orders WHERE custId=?", new BeanPropertyRowMapper<MyOrders>(MyOrder.class), id);
然后您就不必包装RowMapper<T>
的实现,而是将字段映射到MyOrder
类的setter中。 - Dimitry K