Ich werde ein Memorandum aufbewahren, wenn ich Spring Data JPA mit STS ausprobiert habe. Hauptsächlich für mich. Spring Data JPA ist der O / R-Mapper von Spring. Modellschicht-Framework.
Eine Datensatzzeile in einer DB-Tabelle oder -Ansicht Als eine Java-Instanz behandeln Tabellen und Instanzen Das Modul, dem zugeordnet werden soll. Ich werde später etwas detaillierter schreiben.
Modell der MVC (Modell, Ansicht, Controller). DB selbst, CRUD zu DB (** C ** reate, ** R ** ead, ** U ** pdate, ** D ** elete), Der logische Teil der Anwendung.
Was sind die Stärken von Spring Data JPA? Namenskonventionen für Klassen und Methoden usw. Wenn Sie Ihr Versprechen halten, erstellen Sie einfach eine Schnittstelle Sie können CRUD. Praktisch.
Wenn Sie jedoch SQL schreiben müssen JPQL statt SQL ** Enge Dialekte wie SQL gemischt mit Java ** Es scheint, dass es viele Muster zum Schreiben von SQL gibt.
Mit anderen Worten, es kann nur mit der Schnittstelle implementiert werden Eine einfache CRUD entspricht möglicherweise nicht Ihren Anforderungen. Es kann Fälle geben, in denen Sie es anpassen möchten. Aber ich möchte kein JPQL schreiben. Sie möchten in SQL schreiben, richtig? ** Ich kann schreiben. ** ** **
Für diejenigen wie mich in diesem Artikel Wir werden SQL direkt schreiben und implementieren. In diesem Artikel wird R (Lesen) von CRUD als Beispiel verwendet. Ich werde vorstellen, wie man es benutzt.
Es ist eine gute Idee, also verwenden Sie STS Machen wir es mit dem Spring Boot-Projekt. Keine Validierung durch eine Webanwendung Ich möchte von JUnit überprüfen. Das Betriebssystem des Verifizierungs-PCs ist übrigens Windows 7.
Zunächst STS herunterladen. Laden Sie die Zip One herunter.
STS ist eine Eclipse-basierte IDE Um die Verwendung jedes Spring-Produkts zu vereinfachen Es ist angepasst.
Apropos STS = Spring Tool Suite Wie "Legen Sie alle Frühlingsbeläge" Es ist eine Nuance.
Entpacken Sie nach dem Herunterladen die Zip-Datei. Ich habe es auf c: \ sts erweitert. Es dauerte ungefähr 20 Minuten.
Gehen Sie zu C: \ sts \ sts-bundle \ sts- (Versionsnummer) .RELEASE, Starten Sie sts.exe.
Beachten Sie hier. Es ist ein allgemeines Muster, Error: Failed to load the JNI shared library Beginnt nicht mit. Diese Fehlermeldung ist auf die Anwendungs- und Betriebssystembits zurückzuführen Tritt auf, wenn sie nicht übereinstimmen. Beispielsweise sind Windows und Java 64-Bit, STS 32-Bit. Zum Zeitpunkt des Schreibens dieses Artikels befindet sich auf der oberen Seite von STS eine 32-Bit-Zip. Es war eine Falle für mich.
Deshalb habe ich STS gestartet.
Klicken Sie mit der rechten Maustaste auf Paket-Explorer. Erstellen Sie ein neues Projekt.
Der Typ ist Spring Boot> Spring Starter-Projekt.
Als nächstes folgt die Vorbereitung der DB. Ich habe es gewagt, Oracle zu verwenden. Der Grund ist die Kombination von Spring Boot + Oracle, Ich dachte, es würde später in der Praxis sein.
Und "wage" ist Datenbanktreiber in MySQL oder STS Während einige DBs enthalten sind Dies bedeutet, dass Oracle nicht enthalten ist.
Die Verbindungszieldatenbank lautet Oracle Database 11g Express Edition. Ich habe es mit Bezug auf [hier] gemacht (https://qiita.com/GohanOmori/items/0b58a656174c767e239e). Es ist praktisch, einen DB-Benutzer mit Administratorrechten über einen Browser zu erstellen.
Wie auch immer, aus dem Spring Boot-Projekt Ich kann keine Verbindung zur Oracle-Datenbank herstellen Laden Sie den Treiber von Oracle herunter (http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html). Maven Repository Ich konnte es nicht finden Ich habe die Bibliothek direkt zu meinem Projekt hinzugefügt. Es ist ein roter Kerl. Ursprünglich Maven oder Gradle Es wird empfohlen, das Projekt zu verwalten. Es war nicht da.
Fügen Sie der erstellten Datenbank die folgenden Tabellen und Datensätze hinzu.
CREATE TABLE USER (
USER_ID VARCHAR2(20),
USER_NAME VARCHAR2(20),
AGE NUMBER(3,0),
CONSTRAINT PK_USER PRIMARY KEY(USER_ID)
);
Hier ist eine kleine Ergänzung zum O / R-Mapper. Bereiten Sie für die obige Tabelle die folgende Klasse vor.
** UserInfo.java ** Klasse entsprechend der Tabelle USER_INFO
package jp.co.illmatics.app.samples.entity;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class UserInfo {
@Id
public String userId;
public String userName;
public Integer age;
/**
*Konvertieren Sie den erfassten Datensatz in eine Zeichenfolge
*/
public String toString() {
return "userId = " + userId +
", userName = " + userName +
", age = " + age;
}
}
Tabellenname und Spaltenname Durch den Wechsel von Upper Snake Case zu Lower Camel Case Es ist mit dem Klassennamen und dem Feldnamen verknüpft.
in diesem Fall, Der Tabellenname USER_INFO ist der Klassenname UserInfo. Die Spalte USER_ID ist der Feldname userId, Und so weiter.
Hier ist übrigens das Projekt, das ich gemacht habe.
Als nächstes werde ich jede Klasse vorstellen. Übrigens ist in diesem Artikel die Klasse "SpringApplication.run" Ich werde es nicht benutzen, also werde ich die Einführung weglassen.
** UserInfo Repository **
package jp.co.illmatics.app.samples.repository;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import jp.co.illmatics.app.samples.entity.UserInfo;
public interface UserInfoRepository
extends JpaRepository<UserInfo, String> {
public Optional<UserInfo> findByUserId(String userId);
}
Versprechen, JpaRepository zu erweitern, Geben Sie die Entitäts- und ID-Klassen in Generika an.
** Die Entität der Klasse, die auf die Datenbank zugreift. ** Schreiben Sie hier SQL.
package jp.co.illmatics.app.samples.repository.impl;
import java.util.List;
import java.util.Optional;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Component;
import jp.co.illmatics.app.samples.entity.UserInfo;
import jp.co.illmatics.app.samples.repository.UserInfoRepository;
@Component
public class UserInfoRepositoryImpl implements UserInfoRepository {
@Autowired
EntityManager manager;
@SuppressWarnings("unchecked")
@Override
public Optional<UserInfo> findByUserId(String userId) {
String sql = "select * from USER_INFO "
+ "where USER_ID = :userId";
Query query = manager.createNativeQuery(sql, UserInfo.class);
query.setParameter("userId", userId);
UserInfo rawResult = (UserInfo) query.getSingleResult();
Optional<UserInfo> result = Optional.ofNullable(rawResult);
return result;
}
// abbreviated
}
** JUnit-Testfall ** Es wurde bestätigt, dass dies funktioniert.
package jp.co.illmatics.app.samples.repository.impl;
import static org.junit.Assert.*;
import java.util.Optional;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import jp.co.illmatics.app.samples.entity.UserInfo;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserInfoRepositoryImplTest {
private String userId = "user001";
@Autowired
UserInfoRepositoryImpl userInfoRepositoryImpl;
@Test
public void testFindByUserId() {
Optional<UserInfo> result =
userInfoRepositoryImpl.findByUserId(userId);
assertTrue(result.isPresent());
System.out.println(result.get().toString());
}
}
Der Punkt ist die der Klasse angehängte Anmerkung.
@RunWith(SpringRunner.class)Sie können die Klasse mit Spring mit testen.
Spring Runner steht für Spring JUnit 4 Class Runner.
Danach können Sie DI für die Klassen im Projekt mit `` `@ SpringBootTest``` verwenden.
** application.properties ** Konfigurationsdatei
```properties
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=xxxxxx
spring.datasource.password=xxxxxx
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.jpa.show-sql=true
Das JUnit-Ausführungsprotokoll wird extrahiert.
Hibernate: select * from USER_INFO where USER_ID = ?
userId = user001, userName = userName001, age = 40
Vielen Dank für das Lesen bis zum Ende.