0. Основной файл конфигурации
<config>
<data-source class="oracle.jdbc.pool.OracleDataSource"
url="jdbc:oracle:thin:@127.0.0.1:1521:db102"
user="bookstore" password="bookstore">
</data-source>
<mappings>
<file name="./bin/resources/test-mappings.xml"/>
<annotated-type class="ru.pan.magpie.mocks.Review" />
<annotated-object class="ru.pan.magpie.proxies.PKG_TEST_MAPPINGS" />
</mappings>
</config>
data-source: data-source используемый для получения соединений при всех обращениях к БД;
class: полноем имя класса, класс должен реализовывать javax.sql.DataSource интерфейс;
url: url БД;
user: схема-пользователь БД;
password: пароль.
mappings: ссылки на другие конфигурационные файлы, список классов, снабженных аннотациями;
file: файл маппингов, должен удовлетворять DTD
http://oracle-magpie.sourceforge.net/magpie-mappings-1.0.dtd;
annotated-type: имя класса, имеющего маппинг класса-сущности на объектный тип оракл, заданный аннотациями;
annotated-object:имя класса, имеющего маппинг java интерфейса к объекту оракл (пакету или типу), заданный аннотациями;
1. Маппинги типов
Маппинги классов-сущностей
<class-mapping class="tutor.model.Customer" db-type="TCUSTOMER" owner="BOOKSTORE">
<field name="customerId" db-name="customerId" />
<field name="orders" db-name="orders"
element-class="tutor.model.Order" collection-merging="update"/>
<field name="registrationDate" db-name="registrationDate" />
<property-group name="cuttedCustomer" behavior="skip" default="false">
<property name="orders" group="cuttedOrder"/>
<property name="customerId"/>
</property-group>
</class-mapping>
class-mapping: маппинг класса-сущности к объектному типу оракл;
class: полное имя класса, обязательный атрибут;
db-type: имя объектного типа, обязательный атрибут;
owner: имя схемы, содержащей объектный тип, необязательный атрибут,
значение по умолчанию - data-source схема;
Замечание: если схема, содержащая объектный тип, отличается от схемы по умолчанию,
последняя должна иметь select привилегии на следующие системные представления:
ALL_ARGUMENTS, ALL_TYPE_ATTRS, ALL_TYPES, ALL_COLL_TYPES.
field: маппинг поля java класса к полю объектного типа оракл,
поле должно иметь правильно определенные getter и setter методы;
name: имя поля в java классе, обязательный атрибут;
db-name: имя поля в объектном типе oracle, обязательный атрибут;
element-class: имя класса элемента коллекции,
атрибут обязателен для коллекций и массивов, игнорируется в ином случае;
collection-merging: тип обновления коллекции при возвращении экземпляра из oracle в java, возможные значения:
"reload": исходная коллекция очищается и заполняется значениями коллекции возвращаемого поля;
"append": значения поля возвращаемой коллекции добавляются к исходной коллекции;
"update": значения в исходной коллекции обновляются подходящими значения из возвращаемой коллекции (если найдутся).
Замечание: маппинг конкретного поля будет допустимым только в случае если существует java-oracle маппинг между типами этого поля.
property-group: группа полей класса, которая используется в вызовах хранимых процедур
с целью облегчения "веса" экземпляра объекта;
name: имя группы, обязательный атрибут;
behavior: ("skip"|"pass") группа полей будет передана/пропущена соответственно, значение по умолчанию - "pass";
default: ("true"|"false") "true" - группа полей является группой по умолчанию,
которая будет использоваться во всех вызовах, если специально не указана другая группа; значение по умолчанию - "false";
property: поле - элемент группы;
name: имя поля, обязательный атрибут;
property-group: ссылка на группу полей маппинга
класса данного поля, которая будет рекурсивно использована.
Маппинги классов-значений
<value-mapping class="java.lang.Boolean">
<sql-type name="NUMBER"
to-oracle-method="ru.pan.magpie.convert.standards.NumberConversions.booleanToBigDecimal"
from-oracle-method="ru.pan.magpie.convert.standards.NumberConversions.bigDecimalToBoolean" />
</value-mapping>
value-mapping: маппинг java класса к oracle sql типу;
class: полное имя класса, обязательный атрибут;
sql-type, name: имя sql типа, обязательный атрибут;
to-oracle-method: пользовательский статический метод,
конвертирующий экземпляр указанного класса в подходящий для данного sql-типа
экземпляр класса,сигнатура метода:
public static Object methodName(Object, Connection);
from-oracle-method: пользовательский статический метод,
конвертирующий в экземпляр указанного класса из экземпляра класса
по умолчанию используемого jdbc для данного sql типа, сигнатура метода:
public static Object methodName(Object);
2. Таблица предопределенных маппингов-значений
Маппинги заданы в файле default-mappings.xml
| Java class | SQL Data Type | Notes |
|---|---|---|
|
java.lang.String |
CHAR, VARCHAR2, CHARACTER, STRING, VARCHAR, LONG, CLOB, ROWID |
|
|
java.util.Date |
DATE,TIMESTAMP |
|
|
byte[] |
BLOB |
|
|
java.math.BigDecimal |
PLS_INTEGER, BINARY_INTEGER, NATURAL, NATURALN, POSITIVE, POSITIVEN, NUMBER, DEC, DECIMAL, NUMERIC, FLOAT, INT, SMALLINT, INTEGER, REAL |
|
|
java.math.BigInteger, byte, java.lang.Byte, java.lang.Short, short, int, java.lang.Integer, long, java.lang.Long, float, java.lang.Float, double, java.lang.Double |
NUMBER |
|
|
boolean, java.lang.Boolean |
NUMBER |
0-false, 1-true |
|
int, java.lang.Integer |
INTEGER, BINARY_INTEGER |
|
|
long, java.lang.Long |
INTEGER, LONG |
|
|
float, java.lang.Float |
BINARY_FLOAT |
|
|
double, java.lang.Double |
BINARY_DOUBLE |
<db-object object-is="package" class="tutor.proxies.PKG_BOOKS_API"
name="PKG_BOOKS_API" owner="BOOKSTORE" base-class="">
<procedure java-name="formatBookIsbns" db-name="formatBookIsbns"
in-group="" out-group="">
<return class="java.util.List" element-class="tutor.model.Customer" out-group=""/>
<argument position="0" class="java.util.List" db-name="books"
element-class="tutor.model.Book" collection-merging="reload"
in-group="" out-group=""/>
</procedure>
</db-object>
db-object: прокси-маппинг java интерфейса к объекту оракл (пакету хранимых процедур или объектному типу);
class: полное имя интерфейса, обязательный атрибут;
name: имя oracle пакета/типа, обязательный атрибут;
object-is: ("package" | "type") тип маппинга, значение по умолчанию - "package";
owner: имя схемы, содержащей оракл объект, необязательный атрибут,
значение по умолчанию - data-source пользователь;
base-class: имя класса-сущности замапленного на данный объектный тип оракл,
атрибут обязателен в случае object-is="type", игнорируется иначе.
procedure: маппинг хранимой процедуры к java методу;
java-name: имя java-метода, обязательный атрибут;
db-name: имя хранимой процедуры, обязательный атрибут;
in-group: в случае маппинга объектного типа,
группа передаваемых полей базового экземпляра класса (см
property-group в маппинге класса-сущности);
out-group: группа возвращаемых полей.
return: для функций, маппинг результата функции;
class: имя класса, обязательный атрибут;
element-class: если результат коллекция или массив, имя класса элемента коллекции;
out-group: группа полей класса возвращаемого результата.
argument: маппинг аргумента;
position: порядковый номер аргумента в java методе, начинается с 0, обязательный атрибут;
class: имя класса аргумента, обязательный атрибут;
db-name: имя аргумента хранимой процедуры, обязательный атрибут;
in-group: группа передаваемых полей класса аргумента;
out-group: группа возвращаемых полей класса аргумента;
element-class: если аргумент коллекция или массив, имя класса элемента коллекции;
collection-merging: для "OUT" аргументов-коллекций или массивов,
тип обновления коллекции при возвращении экземпляра из oracle в java, возможные значения:
"reload": исходная коллекция очищается и заполняется
значениями коллекции возвращаемого аргумента;
"append": значения возвращаемой
коллекции добавляются к исходной коллекции;
"update": значения в исходной коллекции обновляются
подходящими значения из возвращаемой коллекции (если найдутся).
| XML element | Annotation |
|---|---|
|
class-mapping |
DBType |
|
class-mapping.class |
- |
|
class-mapping.db-type |
DBType.name() |
|
class-mapping.owner |
DBType.owner() |
|
field |
DBTypeField |
|
field.name |
- |
|
field.db-name |
DBTypeField.name() |
|
field.element-class |
DBTypeField.elementClass() |
|
field.collection-merging |
DBTypeField.collectionMerging() |
|
property-group |
- |
|
value-mapping |
- |
|
db-object |
DBObject |
|
db-object.class |
- |
|
db-object.name |
DBObject.name() |
|
db-object.object-is |
DBObject.type() |
|
db-object.owner |
DBObject.owner() |
|
db-object.base-class |
DBObject.baseClass() |
|
procedure |
DBProcedure |
|
procedure.java-name |
- |
|
procedure.db-name |
DBProcedure.name() |
|
procedure.in-group |
DBProcedure.inPropertyGroup() |
|
procedure.out-group |
DBProcedure.outPropertyGroup() |
|
return |
- |
|
return.class |
- |
|
return.element-class |
DBProcedure.returnElementClass() |
|
return.out-group |
DBProcedure.returnOutPropertyGroup() |
|
argument |
DBArgument |
|
argument.position |
- |
|
argument.class |
- |
|
argument |
DBArgument |
|
argument.db-name |
DBArgument.name() |
|
argument.in-group |
DBArgument.inPropertyGroup() |
|
argument.out-group |
DBArgument.outPropertyGroup() |
|
argument.element-class |
DBArgument.elementClass() |
|
argument.collection-merging |
DBArgument.collectionMerging() |