Статьи

Производительность на примере: Liferay с JOOQ

В этой статье показано, как использовать jOOQ для модели данных Liferay.
Minuteproject генерирует артефакты JOOQ для Liferay.
Основной интерес использования минутного проекта для создания артефактов jOOQ: 

  • База данных Liferay не имеет внешнего ключа, но минутный проект способен обнаруживать отношения на основе шаблонов.
  •  Может потребоваться адаптация некоторых соглашений по именованию БД на уровне Java
    • Таблицы БД, заканчивающиеся на ‘_’, будут лишены подчеркивания
    • Имя столбца, оканчивающееся на «_id», соответствующее PK или FK, удалит эту частицу, если не совпадает с другой переменной
  • Код является обновляемым, что означает, что вы можете изменить его часть или полностью, и последующее поколение сохранит ваши изменения

Для получения дополнительной информации об обогащении, сделанном поверх Liferay by minuteproject, проверьте еще один пост, нацеленный на
Liferay с JPA2 .

Здесь обратный инжиниринг нацелен на фреймворк jOOQ, а в конфигурации упоминается ссылка на трек jOOQ

конфигурация

МП-конфигурация-LifeRay-JOOQ.xml

<!DOCTYPE root>
<generator-config>
 <configuration>
  <conventions>
   <target-convention type="enable-updatable-code-feature" />
  </conventions>
  <model name="liferay" version="1.0" package-root="net.sf.mp.demo">
   <data-model>
    <driver name="mysql" version="5.1.16" groupId="mysql"
     artifactId="mysql-connector-java"></driver>
    <dataSource>
     <driverClassName>org.gjt.mm.mysql.Driver</driverClassName>
     <url>jdbc:mysql://127.0.0.1:3306/lportal</url>
     <username>root</username>
     <password>mysql</password>
    </dataSource>
    <schema>lportal</schema>
    <primaryKeyPolicy oneGlobal="true">
     <primaryKeyPolicyPattern name="none"></primaryKeyPolicyPattern>
    </primaryKeyPolicy>
   </data-model>
   <business-model>
    <generation-condition>
     <condition type="exclude" startsWith="QUARTZ"></condition>
    </generation-condition>
    <enrichment>
     <conventions>
      <entity-naming-convention type="apply-strip-table-name-suffix"
       pattern-to-strip="_" />
      <!-- manipulate the structure and entities BEFORE manipulating the 
       entities -->
      <foreign-key-convention
       type="autodetect-foreign-key-based-on-similarity-and-map"
       column-ending="id" column-starting="" />
      <column-naming-convention type="apply-strip-column-name-suffix"
       pattern-to-strip="ID" />
      <reference-naming-convention
       type="apply-referenced-alias-when-no-ambiguity" is-to-plurialize="true" />
     </conventions>
    </enrichment>
   </business-model>
  </model>
  <targets>
   <target refname="JOOQ" name="JOOQ" fileName="mp-template-config-JOOQ.xml"
    outputdir-root="../../dev/JOOQ/liferay" templatedir-root="../../template/framework/jooq">
    <property name="jooq-version" value="2.0.4"></property>
   </target>
   <target refname="LIB" fileName="mp-template-config-bsla-LIB-features.xml"
    templatedir-root="../../template/framework/bsla">
   </target>
  </targets>
 </configuration>
</generator-config>

выполнение

Установить Liferay mysql 6.0.6 под управлением

Скачать минутный проект Удалить
этот конфиг
в / mywork / config

и выполнить генерацию модели. (Sh / cmd) mp-config-LIFERAY-JOOQ.xml

Результат

Артефакты

Полученные артефакты

  • Проект Maven со следующими зависимостями
    • jOOQ
    • JUnit
    • MySQL диск
  • артефакты JOOQ
    • фабрика, ключи, таблицы, записи …
  • модульный тест

Артефакты создаются в / dev / JOOQ / liferay

Если вы строите, в артефактах jOOQ будет ошибка компиляции:

таблица ‘expandotable’ имеет вызов поля ‘table’, который сталкивается с методом Jooq.

Но просто изменив код для удаления ошибки компиляции и установки флажка, чтобы учесть эту модификацию:

в ExpandotableRecord

   • заменить getTable на getTable_

   • исключить код из перезаписанного: строка 24 // MP-MANAGED-UPDATABLE-BEGINNING-ENABLE

 //MP-MANAGED-UPDATABLE-BEGINNING-ENABLE @jooq-record-pk-liferay@
 /**
  * An uncommented item
  * 
  * PRIMARY KEY
  */
    public void setTable(java.lang.Long value) {
        setValue(net.sf.mp.demo.liferay.tables.Expandotable.__EXPANDOTABLE.TABLE, value);
    }
 /**
  * An uncommented item
  * 
  * PRIMARY KEY
  */
    public java.lang.Long getTable_() {
        return getValue(net.sf.mp.demo.liferay.tables.Expandotable.__EXPANDOTABLE.TABLE);
    }
 //MP-MANAGED-UPDATABLE-ENDING

Примечание : в будущей версии эта проблема будет решена, но интересно посмотреть, как можно настроить код без потери производительности последующих поколений.

В конце концов запустите: mvn clean package
  • Набор юнит-теста выполняются:
    • Модульный тест по умолчанию состоит в извлечении первой строки каждого объекта.
  • Пакет JOOQ выпущен
Код

Код можно скачать с минутного проекта googlecode
здесь .

Пример

активной записи:

предоставление внешнего ключа дает возможность предоставлять записи jOOQ с некоторыми методами

Один-ко-многим

// todo

тестирование

/**
 * This class is generated by minuteproject 4 jOOQ
 */
package net.sf.mp.demo.liferay.tables;

import net.sf.mp.demo.liferay.tables.records.UserRecord;
import net.sf.mp.demo.liferay.Liferay;
import net.sf.mp.demo.liferay.Keys;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import net.sf.mp.demo.liferay.LiferayFactory;
import static net.sf.mp.demo.liferay.tables.User.__USER;

import org.jooq.Record;
import org.jooq.Result;
import org.junit.Test;

//MP-MANAGED-ADDED-AREA-BEGINNING @import@
import static net.sf.mp.demo.liferay.tables.Company.__COMPANY;
import static net.sf.mp.demo.liferay.tables.Account.__ACCOUNT;
//MP-MANAGED-ADDED-AREA-ENDING @import@

//MP-MANAGED-ADDED-AREA-BEGINNING @class-annotation@
//MP-MANAGED-ADDED-AREA-ENDING @class-annotation@
@javax.annotation.Generated(value = { "http://www.jooq.org", "2.0.4" }, comments = "This class is generated by minuteproject 4 jOOQ")
public class TestUser {

 @Test
 public void testUser() {
  Connection conn = null;
  String userName = "root";
  String password = "mysql";
  String url = "jdbc:mysql://127.0.0.1:3306/lportal";

  try {
   Class.forName("org.gjt.mm.mysql.Driver").newInstance();
   conn = DriverManager.getConnection(url, userName, password);
   LiferayFactory create = new LiferayFactory(conn);

   // MP-MANAGED-UPDATABLE-BEGINNING-ENABLE
   // @jooq-unittest-testUser-liferay@
   // write your own tests, just set DISABLE to ENABLE in the comment
   // above
   // future generation will not erase your code 😉
   Result<Record> result = create
     .select(__USER.FIRSTNAME, __USER.LASTNAME, __COMPANY.WEB, __ACCOUNT.NAME)
     .from(__USER).join(__COMPANY)
     .on(__USER.COMPANY.equal(__COMPANY.COMPANY))
     .join(__ACCOUNT)
     .on(__COMPANY.ACCOUNT.equal(__ACCOUNT.ACCOUNT))
     .where(__COMPANY.WEB.like("%ray.com"))
     .orderBy(__USER.LASTNAME.asc().nullsFirst()).limit(10)
     .fetch();
   for (Record r : result) {
    String firstname = r.getValue(__USER.FIRSTNAME);
    String lastname = r.getValue(__USER.LASTNAME);
    String web = r.getValue(__COMPANY.WEB);
    String accountname = r.getValue(__ACCOUNT.NAME);

    System.out.println(" firstname : " + firstname + " lastname : "
      + lastname + " web : " + web + " accountname : "
      + accountname);
   }
   // MP-MANAGED-UPDATABLE-ENDING

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (conn != null) {
    try {
     conn.close();
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
 }

 // MP-MANAGED-ADDED-AREA-BEGINNING @implementation@
 // MP-MANAGED-ADDED-AREA-ENDING @implementation@

}

Дача при исполнении

 firstname :  lastname :  web : liferay.com accountname : Liferay
 firstname : Joe lastname : Bloggs web : liferay.com accountname : Liferay
 firstname : Test lastname : DLC 1 web : liferay.com accountname : Liferay
 firstname : Test lastname : DLC 10 web : liferay.com accountname : Liferay
 firstname : Test lastname : DLC 2 web : liferay.com accountname : Liferay
 firstname : Test lastname : DLC 3 web : liferay.com accountname : Liferay
 firstname : Test lastname : DLC 4 web : liferay.com accountname : Liferay
 firstname : Test lastname : DLC 5 web : liferay.com accountname : Liferay
 firstname : Test lastname : DLC 6 web : liferay.com accountname : Liferay
 firstname : Test lastname : DLC 7 web : liferay.com accountname : Liferay

JOOQ быстрый обзор

//сделать

  • Typesafe запрос ускоряет процесс разработки
  • Нет ORM 
  • Фокус на CRUD и сложный запрос 
  • Отсутствие загрузки конфигурации означает быстрое тестирование