The Spring Framework (
http://www.springframework.org) provides a JDBC abstraction framework that simplifies working at the plain JDBC level, including stored procedure support. It is typically used with SQL kept in Java classes, though. Spring's JDBC support also provides goodies like translation of SQLExceptions into Spring's generic DataAccessException hierarchy etc. In typical Spring style, all of this can be used as individual library or within a Spring application context.
If you want to externalize SQL statements in combination with simple O/R mapping (without transparent persistence), I recommend iBATIS Database Layer (
http://www.ibatis.com). It's a simple but nice alternative to a transparent persistence tool, if you want to work at the SQL level and don't need dirty detection and implicit updating. Note that as of the upcoming 1.0 M4, the Spring Framework features ibatis-db support, analogous to the existing JDBC, Hibernate, and DAO support.
In general, Spring provides the abstraction and integration means for all kinds of data access technologies. Its generic transaction management can work with all sorts of strategies, be it JtaTransactionManager, HibernateTransactionManager, or DataSourceTransactionManager for a single JDBC DataSource. You can easily let transactions span multiple data access operations, even when implemented with different tools. Spring also provides convenient factories for the involved resources.
In the particular case of HibernateTransactionManager, the transaction can be exposed to plain JDBC access code or ibatis-db access code by a simple configuration setting. The JDBC respectively ibatis-db access code does not have to be aware of working within a Hibernate transaction! Spring provides all the glue that makes this work behind the scenes. The data access objects are just concerned with the actual data access logic: They implicitly participate in an existing transaction, if any.
Juergen