Dav*_*vid 16
我希望使用jOOQ作为构建器库,为Spring的JdbcTemplate和相关类提供查询.不幸的是,jOOQ似乎将两个概念组合到同一组类中:SQL生成和查询执行.在我的情况下,我想要前者但是想让Spring处理后者.但它确实有效.例如,你可以这样做(使用jOOQ 2.x API):
Factory create = new Factory(null, SQLDialect.ORACLE);
getJdbcTemplate().query(
create.select(create.field(ID_COL),
create.field(VALUE_COL))
.from(FOO_TABLE)
.where(create.field(ID_COL).equals("ignored"))
.getSQL(),
myRowMapper,
id);
Run Code Online (Sandbox Code Playgroud)
所有你需要做/知道使jOOQ与春天一起工作:
java.sql.Connection
通过事务管理器获取绑定到线程.因此,对于第一个和第二个案例,我提供了这个要点:https://gist.github.com/3669307,这是Lukas推荐的.
对于第三种情况,您可以基本上创建工厂的工厂(包含它DataSource
),或者只Factory
使用DataSource
spring组件中的有线实例化每个方法中的新对象.
@Service
public class MyDaoOrService {
@Autowired
private void DataSource dataSource;
@Transactional
public void doSomeJooq(){
Settings s = new Settings();
//You could instead put this jooq configuration xml
s.getExecuteListeners().add("com.snaphop.jooq.SpringExceptionTranslationExecuteListener");
MyGeneratedFactory f = new MyGeneratedFactory(dataSource, s);
f.select(); //etc
}
}
Run Code Online (Sandbox Code Playgroud)
至于设置监听器,您可以使用JOOQ的配置支持来避免程序化创建.
我不会介绍你如何设置一个DataSource
Spring,因为它涵盖在无数其他/更好的地方.
小智 7
使用jOOQ运行spring事务要简单得多(除非我忘记了):
只需将您的数据源包装进去
org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
Run Code Online (Sandbox Code Playgroud)
可选:延迟打开jdbc连接,直到第一个实际的sql语句发生使用
org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy
Run Code Online (Sandbox Code Playgroud)
所以这样做是为了创建一个应用了'transactions'和'lazyness'的jOOQ工厂
DataSource rawDS = /* your actual data source */
// (optional) make access lazy
final DataSource lazyDS = new LazyConnectionDataSourceProxy(rawDataSource);
// make spring transactions available in plain jdbc context
final DataSource txDS = new TransactionAwareDataSourceProxy(lazyDS);
// create jOOQ factory
Factory jooq = new Factory(txDS, /* dialect */, /* settings */)
// voila!
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14628 次 |
最近记录: |