Schön euch kennenzulernen, alle zusammen. Mein Name ist Wu und ich bin verantwortlich für diese Serie.
Es gibt drei typische O / R-Mapping-Tools (iBATIS, Torque, Hibernate): Dieses Mal möchte ich DBFlute als O / R-Mapping einführen.
Warum möchten Sie vermeiden, DBFlute so oft wie möglich außerhalb von SQL zu verwenden? Die folgenden zwei Gründe: (1) Wenn SQL-Anweisungen an verschiedenen Stellen im Quellcode geschrieben werden, müssen Sie sich immer der Probleme wie Auslassungen und Fehler in der Entwicklung bewusst sein. (2) Die O / R-Zuordnung reduziert die komplizierte Arbeit im Zusammenhang mit Datenbankoperationen zum Zeitpunkt der Implementierung und behebt "Fehlanpassungen".
Es gab eine DBFlute-Homepage, aber das Wissen ist verstreut. Um die Arbeit vor Ort nutzen zu können, müssen Sie die Einstellungsdatei (Additionalforeignkey.dfprop) organisieren und die Java-Quelle schreiben.
Dieser Artikel verwendet DBFlute-1.0.5N und JAVA7.
Grober Mechanismus der O / R-Zuordnung von DBFlute (1) Automatische Generierung in DBFlute DBFlute ist eine O / R-Zuordnung, die nur mit automatisch generierten Klassen funktioniert. (2) JAVA-Implementierung Verhalten Steuert die Verarbeitung aller DB-Zugriffe ConditionBean Erstellt Suchbedingungen Weitere Informationen finden Sie im Implementierungshandbuch.
Beispiel:
TableA | TableB | TableC |
---|---|---|
A_column_1 | B_column_1 | C_column_1 |
A_column_2 | B_column_1 | C_column_1 |
1, Erwartetes Ausführungsergebnis SQL (TableA- und TableB-Join): SELECT * FROM TableA A LEFT JOIN TableB B ON A.A_column_1 = B.B_column_1
Einstellungsdatei: ; FK_TableA_TO_TableB_BY_ID = map:{ ; localTableName = TableA ; foreignTableName = TableB ; localColumnName = A_column_1 ; foreignColumnName = B_column_1 ; fixedSuffix = ByID }
JAVA: //TableA情報の取得
TableACB cb = tableABhv.newMyConditionBean();
cb.setupSelect_TableBById();```
---------------------------------------
2. Erwartetes Ausführungsergebnis SQL (Join TableA / TableB und TableB / TableC):
SELECT *
FROM TableA A
INNER JOIN TableB B
ON A.A_column_1 = B.B_column_1
INNER JOIN TableC C
ON B.B_column_1 = C.C_column_1
Einstellungsdatei:
; FK_TableB_TO_TableC_BY_ID = map:{
; localTableName = TableB ; foreignTableName = TableC
; localColumnName = B_column_1 ; foreignColumnName = C_column_1
; fixedSuffix = ById
}
; FK_TableA_TO_TableB_BY_ID = map:{
; localTableName = TableA ; foreignTableName = TableB
; localColumnName = A_column_1 ; foreignColumnName = B_column_1
; fixedSuffix = ById
}
JAVA:
//TableA情報の取得
#### **`TableACB cb = tableABhv.newMyConditionBean();`**
```newMyConditionBean();
cb.setupSelect_TableBById();
cb.setupSelect_TableBById().join();
cb.setupSelect_TableBById().withTableCBId();
cb.setupSelect_TableBById().withTableCBId().join();```
---------------------------------------
3, Erwartetes Ausführungsergebnis SQL (TableA / TableB- und TableB / TableC- und TableA / TableC-Join):
SELECT *
FROM TableA A
LEFT JOIN TableB B
ON A.A_column_1 = B.B_column_1
LEFT JOIN TableC C
ON B.B_column_1 = C.C_column_1
AND A.A_column_2 = C.C_column_2
Einstellungsdatei:
; FK_TableA_TO_TableB_BY_ID = map:{
; localTableName = TableA ; foreignTableName = TableB
; localColumnName = A_column_1 ; foreignColumnName = B_column_1
; fixedSuffix = ById
}
; FK_TableA_TO_TableC_BY_ID = map:{
; localTableName = TableA ; foreignTableName = TableC
; localColumnName = A_column_2 ; foreignColumnName = C_column_2
; fixedCondition = `$$foreignAlias$$.C_column_1 = $$over($localTable.tableBById)$$.B_column_1`
; fixedSuffix = ById
}
JAVA:
//TableA情報の取得
#### **`TableACB cb = tableABhv.newMyConditionBean();`**
```newMyConditionBean();
cb.setupSelect_TableBById();
cb.setupSelect_TableCById();```
---------------------------------------
4, Ausführungsergebnis SQL (korrelierte Unterabfrage in fixedCondition):
SELECT *
FROM TableA A
INNER JOIN TableB B
ON A.A_column_1 = B.B_column_1
INNER JOIN TableC C
ON B.B_column_1 = C.C_column_1
AND A.A_column_2 = C.C_column_2
INNER JOIN
(SELECT TC.C_column_1
,MAX(CAST(TC.C_column_2 AS INT)) AS VER
FROM TableC TC
GROUP BY
TC.C_column_1
TC.C_column_2
) C_0
ON C_0.C_column_1 = C.C_column_1
Einstellungsdatei:
; FK_TableA_TO_TableB_BY_ID = map:{
; localTableName = TableA ; foreignTableName = TableB
; localColumnName = A_column_1 ; foreignColumnName = B_column_1
; fixedSuffix = ById
}
; FK_TableA_TO_TableC_BY_ID = map:{
; localTableName = TableA ; foreignTableName = TableC
; localColumnName = A_column_2 ; foreignColumnName = C_column_2
; fixedCondition = `$$foreignAlias$$.C_column_1 = $$over($localTable.tableBById)$$.B_column_1`
INNER JOIN
(SELECT TC.C_column_1
,MAX(CAST(TC.C_column_2 AS INT)) AS VER
FROM TableC TC
GROUP BY
TC.C_column_1
TC.C_column_2
) C_0
ON C_0.C_column_1 = `$$foreignAlias$$.C_column_1`
; fixedSuffix = ById
}
JAVA:
//TableA情報の取得
#### **`TableACB cb = tableABhv.newMyConditionBean();`**
```newMyConditionBean();
cb.setupSelect_TableBById();
cb.setupSelect_TableBById().join();
cb.setupSelect_TableCById();
cb.setupSelect_TableCById().join();```
---------------------------------------
#### Glossar der Einstellungsdatei
Ich denke, dass die oben gezeigten Macs die folgenden Bedeutungen haben und nach dem Verständnis verwendet werden.
`$$ ForeignAlias $$`: Elias der referenzierten Tabelle
`$$ localAlias $$`: Elias der Referrertabelle
`$$ over ([Tabellenname]. [Beziehungsname]) $$`: Elias der Tabelle einer anderen Relation
`$$ over ($ localTable. [Beziehungsname]) $$`: Fremdtabelle der lokalen Tabelle
`$$ over ($ ForeignTable. [Beziehungsname]) $$`: Fremdtabelle der Fremdtabelle
---------------------------------------
# Zusammenfassung
Wenn Sie die BDflute-Konfigurationsdatei und die JAVA-Quelle paarweise kombinieren, können Sie alle Tabellen ohne Verwendung von externem SQL verbinden.
Diese Erklärung ist eine Methode, um den Fall des Zusammenfügens mehrerer Tabellen zu behandeln, die häufig im Feld verwendet werden. In Wirklichkeit denke ich, dass es sich um viel detailliertes Know-how handelt, aber beim nächsten Mal werde ich das Know-how erläutern, das auf der JAVA-Seite implementiert werden soll.
---------------------------------------
# Referenzmaterial
~ Site-orientierter O / R-Mapper ~
http://dbflute.seasar.org/
Was ist AdditionalForeignKeyMap?
http://dbflute.seasar.org/ja/manual/reference/dfprop/additionalforeignkey/
Recommended Posts