В этой статье показано, как использовать 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 выпущен
Пример
активной записи:
предоставление внешнего ключа дает возможность предоставлять записи 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 и сложный запрос
- Отсутствие загрузки конфигурации означает быстрое тестирование