JOOQ и весна - PullRequest
       40

JOOQ и весна

27 голосов
/ 17 декабря 2010

Кто-нибудь пробовал использовать JOOQ со средой Spring или я открываю новые возможности?

http://www.jooq.org

Ответы [ 8 ]

21 голосов
/ 19 декабря 2010

Да, многие люди (сейчас).И руководство jOOQ включает в себя учебное пособие о том, как начать использовать jOOQ , Spring, Spring-TX и BoneCP :

Существует также очень хороший учебник Петри Кайнулайнена, объясняющий каждый шаг по настройке проекта, здесь:

Вот сообщение в блоге о том, как использовать jOOQ с Spring Boot, особенно полезно, когда вам нужны коммерческие дистрибутивы jOOQ:

16 голосов
/ 23 июля 2011

Я искал возможность использовать 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);
7 голосов
/ 09 января 2013

запускать весенние транзакции с помощью jOOQ намного проще (если я что-то не забыл):

просто оберните ваш источник данных в

org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy

необязательно : чтобы отложить открытие соединения jdbc до тех пор, пока не произойдет первый фактический оператор SQL, используйте

org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy

чтобы в качестве примера сделать это, чтобы создать фабрику 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!
7 голосов
/ 08 сентября 2012

Все, что вам нужно сделать / знать, чтобы jOOQ работал с пружиной:

  1. Получите java.sql.Connection, привязанный к потоку менеджером транзакций.
  2. Правильная обработка транзакцийпреобразование исключений
  3. Следует понимать, что объекты jOOQ Factory (несмотря на имя) не являются поточно-ориентированными.и, следовательно, потребует создания нового объекта для каждого использования (не делайте этого другого ответ ).

Итак, для первого и второго случая я предлагаю эту суть: https://gist.github.com/3669307 который делает то, что Лукас рекомендует .

В третьем случае вы можете либо создать в основном фабрику фабрики (которая содержит 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
    }
}

Что касается слушателя настроек, вы можете использовать поддержку конфигурации JOOQ, чтобы избежать программного создания.

Я не будурасскажите, как вы настроили DataSource весной, как это описано во множестве других / лучших мест.

3 голосов
/ 06 апреля 2012

Надеюсь, это будет кому-то полезно ...

Конфигурация контекста приложения Spring.

 <bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName">
            <value>SYSTEM_PROPERTIES_MODE_OVERRIDE</value>
        </property>
        <property name="searchSystemEnvironment">
            <value type="boolean">true</value>
        </property>
    </bean>



    <bean id="dataSource" 
        class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="org.h2.Driver"/>
        <property name="url" 
        value="jdbc:h2://${user.home}
        ${file.separator}tracciabilitaCanarini${file.separator}db${file.separator}basedb"/>
        <property name="username" value="sa"/>
        <property name="password" value="sa"/>
    </bean>

    <bean id="datasourceConnection" 
     class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" 
      lazy-init="true" depends-on="dataSource">
        <property name="targetObject">
            <ref bean="dataSource"/>
        </property>
        <property name="targetMethod">
            <value>getConnection</value>
        </property>
    </bean>

    <bean id="publicFactory" class="dbLayer.db.PublicFactory" lazy-init="true"
      depends-on="datasourceConnection" >
        <constructor-arg index="0" ref="datasourceConnection"  />
    </bean>

Он автоматически заполняет общедоступную фабрику данным соединением (и да, это может быть соединение в пуле, с автоматическим закрытием и т. Д., См. Класс DriverManagerDataSource для более подробной настройки). А теперь публичный завод. Примечание: нет необходимости изменять исходную общедоступную фабрику, созданную jOOQ.

/**
 * This class is generated by jOOQ
 */
package dbLayer.db;

/**
 * This class is generated by jOOQ.
 */
@javax.annotation.Generated(value    = {"http://www.jooq.org", "2.0.5"},
                            comments = "This class is generated by jOOQ")
public class PublicFactory extends org.jooq.util.h2.H2Factory {

    private static final long serialVersionUID = -1930298411;

    /**
     * Create a factory with a connection
     *
     * @param connection The connection to use with objects created from this factory
     */
    public PublicFactory(java.sql.Connection connection) {
        super(connection);
    }

    /**
     * Create a factory with a connection and some settings
     *
     * @param connection The connection to use with objects created from this factory
     * @param settings The settings to apply to objects created from this factory
     */
    public PublicFactory(java.sql.Connection connection, org.jooq.conf.Settings settings) {
        super(connection, settings);
    }
}

В конце просто позвоните на фабрику.

 PublicFactory vs = (PublicFactory) SpringLoader.getBean("publicFactory");
    SimpleSelectQuery<VersionRecord> sq = vs.selectQuery(dbLayer.db.tables.Version.VERSION);
    VersionRecord v = null;
                try {
                    v = sq.fetchAny();
                } catch (Exception e) {
                    log.warn("Seems that version table does not exists!", e);
                }

Готово!

3 голосов
/ 05 апреля 2012

Предполагая, что вы используете Spring для создания веб-приложения, вы, вероятно, захотите сделать что-то вроде этого:

try {
  Connection conn = dataSource.getConnection();
  try {
    // Do something with JOOQ
    // No need to use a JdbcTemplate!
  }
  finally {
    if (conn != null) {
      conn.close();
    }
  }
} catch (SQLException e) {
  // your error handling
}

Возможно, вы хотите получить DataSource посредством внедрения зависимостей Spring, потому что ваш веб-контейнер,Tomcat или что-то еще, предоставляет DataSource и делает пул соединений.В одном из ваших конфигурационных файлов Spring у вас будет что-то вроде

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/>

Объект, в котором находится вышеуказанный код (или некоторый объект, который предоставляет этот код с источником данных), может иметь конфигурацию в файле Spring для создания экземпляраэто с источником данных, например

<bean id="fooService" class="com.fubar.FooServiceImpl">
  <constructor-arg ref="dataSource" type="javax.sql.DataSource" />
</bean>

Часть строки "jdbc / datasource" будет соответствовать имени ресурса, настроенному в веб-контейнере.Это варьируется, но для Tomcat это может быть файл контекста в conf / Catalina / localhost под домашним каталогом Tomcat, например,

<?xml version="1.0" encoding="UTF-8"?>
<Context debug="10" reloadable="true" useNaming="true" antiJARLocking="true">
    <Resource name="jdbc/datasource" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000" validationQuery="SELECT 1"
        username="foo" password="fubar" driverClassName="org.postgresql.Driver" 
        url="jdbc:postgresql://localhost/foobase"/>         
</Context>
2 голосов
/ 06 июля 2015

Для конфигурации Java (которая по умолчанию для Spring Boot) вы можете использовать следующий код:

/* JOOQ Configuration */
@Bean
public DataSourceConnectionProvider dataSourceConnectionProvider() {
    return new DataSourceConnectionProvider(dataSource());
}

@Bean
public DefaultConfiguration defaultConfiguration() {
    DefaultConfiguration defaultConfiguration = new DefaultConfiguration();
    defaultConfiguration.setConnectionProvider(dataSourceConnectionProvider());
    defaultConfiguration.setSQLDialect(SQLDialect.POSTGRES);
    return defaultConfiguration;
}

@Bean
public DSLContext dslContext() {
    return new DefaultDSLContext(defaultConfiguration());
}
1 голос
/ 24 июня 2014

Самый простой способ (я нашел) использовать Spring транзакции с jOOQ, приведен здесь: http://blog.liftoffllc.in/2014/06/jooq-and-transactions.html

Посмотрите на этот ответ для лучшего объяснения: https://stackoverflow.com/a/24380508/542108

...