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