JOOQ和Spring

don*_*ldh 27 java sql spring jooq

有人试过在Spring框架中使用JOOQ,还是我开辟了新天地?

http://www.jooq.org

Luk*_*der 21

是的,很多人(现在).jOOQ手册包含一个关于如何开始使用jOOQ,Spring,Spring-TX和BoneCP的教程:

Petri Kainulainen还有一个非常好的教程,解释了建立项目的每一步,在这里:


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)

  • 这是一个很好的集成示例.为什么选择spring来执行查询?由于jOOQ缺少行映射功能?还是缺乏交易处理? (6认同)
  • @LukasEder我的交易处理.我广泛使用AspectJ + Spring(对于跟踪感到抱歉......只是发生了另一个Q.你回答了问题). (2认同)

Ada*_*ent 7

所有你需要做/知道使jOOQ与春天一起工作:

  1. java.sql.Connection通过事务管理器获取绑定到线程.
  2. 通过异常翻译正确处理交易
  3. 了解jOOQ Factory对象(尽管名称)不是线程安全的.因此需要在每次使用时实例化一个新对象(不要做其他答案).

因此,对于第一个和第二个案例,我提供了这个要点:https://gist.github.com/3669307,这是Lukas推荐的.

对于第三种情况,您可以基本上创建工厂的工厂(包含它DataSource),或者只Factory使用DataSourcespring组件中的有线实例化每个方法中的新对象.

@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的配置支持来避免程序化创建.

我不会介绍你如何设置一个DataSourceSpring,因为它涵盖在无数其他/更好的地方.


小智 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)