Пример простой системы заказа товара. Часть 1, базовая бизнес логика.
ИС модели.
Реализуем данные простые модели:
Customer - Контрагент, имеет имя
Merchandise - Номенклатура, имеет имя
CОrder - Заказ, имеет дату, контрагента, итого, строки с товаром
OrderLine - Строка заказа, имеет товар, количество, цену, итого
Создание Мавен проекта.
* Все файлы должны быть в UTF-8 кодировке. Я рекомендую редактор Jeany.
Создайте папку проекта "myapp" в "programmer/java", и создайте pom.xml в ней:
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.myapp</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>ordering</artifactId>
<packaging>jar</packaging>
<name>My ordering business logic.</name>
<inceptionYear>2019</inceptionYear>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.7</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.beigesoft</groupId>
<artifactId>beige-blc</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
<useFile>false</useFile>
<trimStackTrace>false</trimStackTrace>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgs>
<!--<arg>-verbose</arg>-->
<arg>-Xlint:all,-options,-path</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
*pom.xml это главный файл в Мавен проекте. Он описывает данную библиотеку (Мавен артефакт): имя, группу, версию, тип архива (JAR в данном случае), используемые сторонние библиотеки (зависимости/dependencies). JAR это стандартный Java архив содержащий скомпилированные Java классы и другие файлы - настройки в текстовых и XML файлах, изображения и прочее.
Затем создайте папки для исходного кода:
myapp - src - main - java - org - myapp - ordering
myapp - src - main - resources - dbcp
myapp - src - main - resources - sqlite
myapp - src - main - resources - uvd - clsCs
myapp - src - main - resources - uvd - fldTyFs
Реализация моделей.
Согласно Базовая информация о ПО Беижсофт мы должны использовать org.beigesoft.mdlp.AIdLnNm для Контрагента (Customer), создайте файл "Customer.java" в папке "myapp - src - main - java - org - myapp - ordering":
package org.myapp.ordering;
import org.beigesoft.mdlp.AIdLnNm;
public class Customer extends AIdLnNm {
}
* Джава класс имеет поля(реквизиты), например поле nme строкового типа (String) используется для хранения имени. Данные поля доступны через методы Getters и Setters, например для поля "nme" метод "getNme()" возвращает его значение, а setNme(String pValue) устанавливает значение.
* В Джаве слово extends значит что данный класс расширяет другой класс (AIdLnNm в данном случае). Результирующий класс наследует (имеет) все поля и методы родительского класса.
* Как вы заметили, класс имеет имя такое-же как и его файл, а имя пакета (package) совпадает с папками начиная с папки "java".
Класс в данном случае реализует информационную сохраняемую (в БД) модель. Другие классы имеют функции сервиса, например сервис записывающий модель в базу данных.
Предположим что у нас несколько баз данных (офис 1 и офис 2) и большая номенклатура, поэтому будем использовать org.beigesoft.mdlp.AOrIdNm для товара:
package org.myapp.ordering;
import org.beigesoft.mdlp.AOrIdNm;
public class Merchandise extends AOrIdNm {
}
Нам нужно импортировать заказы в центральную базу, соответственно Заказ будет:
package org.myapp.ordering;
import java.util.List;
import java.util.Date;
import java.math.BigDecimal;
import org.beigesoft.mdlp.AOrId;
public class COrder extends AOrId {
private Date itsDate;
private Customer customer;
private BigDecimal itsTotal;
private List<OrderLine> itsLines;
//Simple getters and setters:
/**
* <p>Getter for itsDate.</p>
* @return Date
**/
public final Date getItsDate() {
return this.itsDate;
}
/**
* <p>Setter for itsDate.</p>
* @param pItsDate reference
**/
public final void setItsDate(final Date pItsDate) {
this.itsDate = pItsDate;
}
/**
* <p>Getter for customer.</p>
* @return Customer
**/
public final Customer getCustomer() {
return this.customer;
}
/**
* <p>Setter for customer.</p>
* @param pCustomer reference
**/
public final void setCustomer(final Customer pCustomer) {
this.customer = pCustomer;
}
/**
* <p>Getter for itsTotal.</p>
* @return BigDecimal
**/
public final BigDecimal getItsTotal() {
return this.itsTotal;
}
/**
* <p>Setter for itsTotal.</p>
* @param pItsTotal reference
**/
public final void setItsTotal(final BigDecimal pItsTotal) {
this.itsTotal = pItsTotal;
}
/**
* <p>Getter for itsLines.</p>
* @return List<OrderLine>
**/
public final List<OrderLine> getItsLines() {
return this.itsLines;
}
/**
* <p>Setter for itsLines.</p>
* @param pItsLines reference
**/
public final void setItsLines(final List<OrderLine> pItsLines) {
this.itsLines = pItsLines;
}
}
* для избежания коллизий с именами СКЛ (SQL) нам нужно именовать модели и поля осторожно, например если мы будем использовать "Order" для имени модели заказа то получим ошибку.
Строка заказа:
package org.myapp.ordering;
import java.math.BigDecimal;
import org.beigesoft.mdl.IOwnedOr;
import org.beigesoft.mdlp.AOrId;
public class OrderLine extends AOrId implements IOwnedOr<COrder> {
private COrder ownr;
private Merchandise product;
private BigDecimal itsQuantity;
private BigDecimal itsPrice;
private BigDecimal itsAmount;
/**
* <p>Getter for ownr.</p>
* @return COrder
**/
@Override
public final COrder getOwnr() {
return this.ownr;
}
/**
* <p>Setter for ownr.</p>
* @param pOwnr reference
**/
@Override
public final void setOwnr(final COrder pOwnr) {
this.ownr = pOwnr;
}
//Simple getters and setters:
/**
* <p>Getter for product.</p>
* @return Merchandise
**/
public final Merchandise getProduct() {
return this.product;
}
/**
* <p>Setter for product.</p>
* @param pProduct reference
**/
public final void setProduct(final Merchandise pProduct) {
this.product = pProduct;
}
/**
* <p>Getter for itsQuantity.</p>
* @return BigDecimal
**/
public final BigDecimal getItsQuantity() {
return this.itsQuantity;
}
/**
* <p>Setter for itsQuantity.</p>
* @param pItsQuantity reference
**/
public final void setItsQuantity(final BigDecimal pItsQuantity) {
this.itsQuantity = pItsQuantity;
}
/**
* <p>Getter for itsPrice.</p>
* @return BigDecimal
**/
public final BigDecimal getItsPrice() {
return this.itsPrice;
}
/**
* <p>Setter for itsPrice.</p>
* @param pItsPrice reference
**/
public final void setItsPrice(final BigDecimal pItsPrice) {
this.itsPrice = pItsPrice;
}
/**
* <p>Getter for itsAmount.</p>
* @return BigDecimal
**/
public final BigDecimal getItsAmount() {
return this.itsAmount;
}
/**
* <p>Setter for itsAmount.</p>
* @param pItsAmount reference
**/
public final void setItsAmount(final BigDecimal pItsAmount) {
this.itsAmount = pItsAmount;
}
}
Добавление XML конфигурации для импорта полной копии БД.
Скопируйте conf.xml из beige-blc/src/main/resources/dbcp в "myapp - src - main - resources - dbcp" и добавьте 4 новых модели:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>My ordering DBCP configuration</comment>
<entry key="clss">org.beigesoft.mdlp.DbInf,
org.beigesoft.mdlp.UsTmc,
org.beigesoft.mdlp.UsRlTmc,
org.beigesoft.mdlp.Lng,
org.beigesoft.mdlp.Cntr,
org.beigesoft.mdlp.DcSp,
org.beigesoft.mdlp.DcGrSp,
org.beigesoft.mdlp.UsPrf,
org.beigesoft.mdlp.MaFrn,
org.beigesoft.mdlp.MaFrnLn,
org.beigesoft.mdlp.CsvMth,
org.beigesoft.mdlp.CsvCl,
org.beigesoft.mdlp.EmAdr,
org.beigesoft.mdlp.EmCon,
org.beigesoft.mdlp.EmInt,
org.beigesoft.mdlp.EmStr,
org.beigesoft.mdlp.EmMsg,
org.beigesoft.mdlp.EmRcp,
org.beigesoft.mdlp.EmAtch,
org.myapp.ordering.Customer,
org.myapp.ordering.Merchandise,
org.myapp.ordering.COrder,
org.myapp.ordering.OrderLine</entry>
<entry key="stgClsNms">exlFlds,idFlds</entry>
<entry key="stgFldNms"></entry>
<entry key="exlFlds">isNew</entry>
</properties>
Порядок важен! OrderLine последняя так как содержит Merchandise и COrder.
Добавление XML конфигурации для ОРМ.
Скопируйте conf.xml из beige-blc/sqlite в "myapp - src - main - resources - sqlite" и добавьте модели:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>My ordering SQLite configuration</comment>
<entry key="clss">org.beigesoft.mdlp.DbInf,
org.beigesoft.mdlp.UsTmc,
org.beigesoft.mdlp.UsRlTmc,
org.beigesoft.mdlp.Lng,
org.beigesoft.mdlp.Cntr,
org.beigesoft.mdlp.DcSp,
org.beigesoft.mdlp.DcGrSp,
org.beigesoft.mdlp.UsPrf,
org.beigesoft.mdlp.MaFrn,
org.beigesoft.mdlp.MaFrnLn,
org.beigesoft.mdlp.CsvMth,
org.beigesoft.mdlp.CsvCl,
org.beigesoft.mdlp.EmAdr,
org.beigesoft.mdlp.EmCon,
org.beigesoft.mdlp.EmInt,
org.beigesoft.mdlp.EmStr,
org.beigesoft.mdlp.EmMsg,
org.beigesoft.mdlp.EmRcp,
org.beigesoft.mdlp.EmAtch,
org.myapp.ordering.Customer,
org.myapp.ordering.Merchandise,
org.myapp.ordering.COrder,
org.myapp.ordering.OrderLine</entry>
<entry key="stgClsNms">exlFlds,idFlds,vrAlg,cnstr</entry>
<entry key="stgFldNms">def,nul</entry>
<entry key="exlFlds">isNew</entry>
</properties>
ОРМ значит что вам не нужно делать SQL команды вручную. Например для создания нового Merchandise в БД:
Merchandise product1 = new Merchandise();
product1.setNme("Продукт 1"); //Код будет сгенерирован автоматически
this.orm.insIdLn(product1); //ОРМ сама делает SQL insert команду, и устанавливает сгенерированный код для товара
Затем скопируйте cmnst.xml из beige-blc/sqlite в "myapp - src - main - resources - sqlite" и измените имя базы данных:
...
<entry key="dbUrl">jdbc:sqlite:#currentDir#myordering.sqlite</entry>
...
Добавление XML конфигурации для ВЕБ-интерфейса.
Скопируйте conf.xml из beige-blc/uvd в "myapp - src - main - resources - uvd" и добавьте модели:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>UVD configuration</comment>
<entry key="clss">org.beigesoft.mdlp.UsTmc,
org.beigesoft.mdlp.UsRlTmc,
org.beigesoft.mdlp.Lng,
org.beigesoft.mdlp.Cntr,
org.beigesoft.mdlp.DcSp,
org.beigesoft.mdlp.DcGrSp,
org.beigesoft.mdlp.UsPrf,
org.beigesoft.mdlp.MaFrn,
org.beigesoft.mdlp.MaFrnLn,
org.beigesoft.mdlp.CsvMth,
org.beigesoft.mdlp.CsvCl,
org.beigesoft.mdlp.EmAdr,
org.beigesoft.mdlp.EmCon,
org.beigesoft.mdlp.EmInt,
org.beigesoft.mdlp.EmStr,
org.beigesoft.mdlp.EmMsg,
org.beigesoft.mdlp.EmRcp,
org.beigesoft.mdlp.EmAtch,
org.myapp.ordering.Customer,
org.myapp.ordering.Merchandise,
org.myapp.ordering.COrder,
org.myapp.ordering.OrderLine</entry>
<entry key="stgClsNms">exlFlds,idFlds,owdEnts,frmFds,lstFds,pickFds,selFds,selDpl</entry>
<entry key="stgFldNms">cnToSt,cnFrSt,inp,str,wde</entry>
<entry key="exlFlds"></entry>
</properties>
Затем создайте файл COrder.xml в "myapp - src - main - resources - uvd - clsCs":
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="frmFds">iid,idOr,dbOr,itsDate,customer,itsTotal</entry>
<entry key="owdEnts">org.myapp.ordering.OrderLine</entry>
</properties>
Он описывает какие поля должны быть заполнены и их порядок. Также здесь указываются владеемые списки (строки) которые должны отображаться в форме редактирования владельца.
Затем добавьте OrderLine.xml в "myapp - src - main - resources - uvd - clsCs":
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="frmFds">iid,idOr,dbOr,product,itsQuantity,itsPrice,itsAmount</entry>
</properties>
Затем скопируйте cnToSt.xml из beige-blc в "myapp - src - main - resources - uvd - fldTyFs" добавьте BigDecimal:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="java.util.Date">CnvDtTmStr</entry>
<entry key="java.math.BigDecimal">CnvPriStr</entry>
</properties>
Данный файл указывает какой конвертер в строковое представление будет использоваться для полей с данными типами.
Затем скопируйте str.xml из beige-blc в "myapp - src - main - resources - uvd - fldTyFs" и отредактируйте:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="java.lang.Long">str</entry>
<entry key="java.math.BigDecimal">str</entry>
<entry key="java.util.Date">dtTm</entry>
</properties>
Данный файл указывает какой виджет (JSP) будет использоваться для отображения полей согласно их типу.
Затем скопируйте inp.xml from beige-blc в "myapp - src - main - resources - uvd - fldTyFs" и отредактируйте:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="org.beigesoft.mdl.IHasNm">nme</entry>
<entry key="org.beigesoft.mdl.IHasId">hsid</entry>
<entry key="java.util.Date">dtTm</entry>
<entry key="java.lang.String">str</entry>
<entry key="java.lang.Long">int</entry>
<entry key="java.lang.Boolean">bln</entry>
<entry key="java.math.BigDecimal">pri</entry>
</properties>
Данный файл указывает какой виджет (JSP) будет использоваться для редактирования полей согласно их типу.
На данное время это все по базовой логике.