[JAVA] So verbinden Sie eine Tabelle ohne DBFlute und SQL

Einführung

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".

Hintergrund herausfordern

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.

Erklärung der Tabellenverbindungsmethode

Dieser Artikel verwendet DBFlute-1.0.5N und JAVA7.

Grundmechanismus von DBFlute

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.

Wenn zwischen zwei oder mehr Tabellen kein externer Schlüssel zugeordnet ist und Sie sie für geschäftliche Zwecke verknüpfen möchten, verwenden Sie die folgende Methode.

Beispiel:

Verwendungstabelle

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

So verbinden Sie eine Tabelle ohne DBFlute und SQL
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So führen Sie einen Vertrag mit web3j aus
So sortieren Sie eine Liste mit Comparator
[Schienen] So erstellen Sie eine Tabelle, fügen eine Spalte hinzu und ändern den Spaltentyp
So geben Sie Excel und PDF mit Excella aus
Realisieren Sie eine Entscheidungstabelle ohne bedingte Verzweigung
Ausführen einer Methode und Verspotten mit JUnit
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
So löschen Sie einen Controller usw. mit einem Befehl
Wie man Stimme oder Musik mit Javascript spielt
[Ethereum] So führen Sie einen Vertrag mit web3j-Teil 2 aus
So generieren Sie einen Primärschlüssel mit @GeneratedValue
Wenn Sie eine vollständige äußere Verknüpfung ausführen, ohne die vollständige äußere Verknüpfung zu verwenden
So löschen Sie alle Daten in einer bestimmten Tabelle
So aktualisieren Sie Benutzerinformationen ohne Kennwort
So löschen Sie benutzerdefinierte Adapterelemente mithilfe eines benutzerdefinierten Modells
So starten Sie den lokalen Server von Tomcat ohne Eclipse
So verwenden Sie Play Framework ohne typsicheren Aktivator
Wie man einen Cache erstellt, ohne zu viel nachzudenken
[Docker] Wie man mit einem Container in Heroku aktualisiert und wie man mit Migrate Error umgeht
So implementieren Sie ein kreisförmiges Profilbild mit CarrierWave und R Magick in Rails
Testen des Einschlusses von Bildern bei Verwendung von ActiveStorage und Faker
Wie hinterlasse ich einen Kommentar?
So entwickeln Sie in Xib-Dateien ohne Verwendung von Storyboard
Verwendung von Rails Join
Festlegen und Beschreiben von Umgebungsvariablen mit Rails zsh
So installieren Sie JDK 8 unter Windows ohne Verwendung des Installationsprogramms
So entwickeln und registrieren Sie eine Sota-App in Java
So installieren Sie PHP 7.4- und SQL Server-Treiber in CentOS 7.7
So fügen Sie ein Video ein
So erstellen Sie eine Methode
So erstellen und starten Sie eine Docker-Datei für Payara Micro
So registrieren Sie sich mit Tomcat als Kunde in Square
So autorisieren Sie mit graphql-ruby
So steuern Sie Transaktionen in Spring Boot ohne Verwendung von @Transactional
So erhalten Sie die neueste Live-Übermittlungs-ID für einen Kanal ohne Verwendung der YouTube-Daten-API
So erstellen Sie eine JAR-Datei und eine War-Datei mit dem Befehl jar
So erstellen Sie mit SPRING INITIALIZR einen Hinadan für ein Spring Boot-Projekt
[Rails 6] So erstellen Sie mit cocoon einen dynamischen Formular-Eingabebildschirm
Wie POST JSON in Java-Methode mit OkHttp3 und Methode mit HttpUrlConnection-
So laden Sie eine Spring-Upload-Datei und zeigen ihren Inhalt an
So lesen Sie eine Datei und behandeln sie als Standardeingabe
[Rails] So laden Sie Bilder mit Carrierwave und Fog-Aws in AWS S3 hoch
[Rails] So laden Sie Bilder mit refile und refile-s3 in AWS S3 hoch
[Swift5] So kommunizieren Sie von ViewController zu Model und übergeben einen Wert
Wie man mit der Generierung dynamischer SQL-Abfragen ein wenig knifflig baut
Wie man einen revolutionären Diamanten mit Java für Aussage macht wwww
Verwendung von StringBurrer und Arrays.toString.
Verwendung von EventBus3 und ThreadMode
So erstellen Sie einen Java-Container
[Java] Verwendung der Join-Methode
So erstellen Sie einen JDBC-Treiber
Aufrufen von Klassen und Methoden