Es verwendet seit einiger Zeit Spring Data JPA. In dieser Zeit habe ich einige Dinge gelernt und auf einige Probleme gestoßen. Ich werde sie hier mit Ihnen teilen.
Vorwort:
Einführung in Frühlingsdaten:
Spring Data ist ein Open -Source -Framework zur Vereinfachung des Datenbankzugriffs und zur Unterstützung von Cloud -Diensten. Das Hauptziel ist es, den Zugriff auf Daten bequem und schnell zu erfüllen und MAP-Reduce-Framework- und Cloud-Computing-Datendienste zu unterstützen. Federdaten enthält mehrere Unterprojekte:
Commons - Bietet ein gemeinsames grundlegendes Framework, das für die Verwendung in jedem Unterprojekt geeignet ist und die Cross -Database -Persistenz unterstützt
JPA - vereinfacht die Fähigkeit, JPA -Datenzugriffsebenen und Persistenzstufen im gesamten Speicher zu erstellen
Hadoop - MapReduce -Job basierend auf der Hadoop -Jobkonfiguration von Spring und einem Pojo -Programmiermodell
Schlüsselwert - integriert Redis und Riak, um einfache Verpackungen in mehreren gemeinsamen Szenarien bereitzustellen
Dokument - Dokumentdatenbanken integrieren: CouchDB und MongoDB und bieten grundlegende Konfigurationszuordnung und Bibliotheksunterstützung
Graph - Integriertes NEO4J, um ein leistungsstarkes Pojo -basiertes Programmiermodell bereitzustellen
Graph Roo Addon - Roo -Unterstützung für NEO4J
JDBC -Erweiterungen - Unterstützt Oracle RAD, erweiterte Warteschlangen und erweiterte Datentypen
Mapping - Bereitstellung von Objektzuordnungsframework basierend auf Grails, die verschiedene Datenbanken unterstützt
Beispiele - Beispielprogramme, Dokumente und Grafikdatenbanken
Anleitung - Erweiterte Dokumentation
1. Einführung in Spring Data JPA
Spring Data JPA ist ein JPA -Anwendungsframework, das von Spring basierend auf den ORM -Framework- und JPA -Spezifikationen eingekapselt ist, und bietet einen vollständigen Satz von Datenzugriffsschichtlösungen.
2. Federdaten JPA -Funktionen
Spring Data JPA hat sehr leistungsstarke Funktionen. Hier überspringen wir den Umweltkonstruktionsschritt und werfen einen Blick auf die "Süße" von Frühlingsdaten JPA.
Spring Data JPA bietet Benutzern die folgenden Schnittstellen:
3. Springdaten JPA -Schnittstelle
1. CRURDREPOSORY -Schnittstelle
Erstellen Sie eine Entitätsklasse:
@Entity @table (name = "user") public class user {@ID @generatedValue private Integer id; // Konto private Zeichenfolgekonto; // Name privater Zeichenfolge Name; // Passwort private Zeichenfolge Passwort; // E -Mail private Zeichenfolge E -Mail; } Schreiben Sie eine Schnittstelle und erben Sie die Crudrepository -Schnittstelle:
Die öffentliche Schnittstelle userRepository erweitert Crudrepository <Benutzer, Integer> {} Schreiben Sie eine Testklasse (um den Effekt intuitiver zu sehen, verwenden alle Testklassen keine Behauptungen und drucke Anweisungen, die direkt verwendet werden):
public class userrepositoryTest {@autowired private userrepository dao; @Test // public void testsave () {user user = new user (); user.setName ("chhliu"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setPassword ("123456"); Dao.Save (Benutzer); } @Test // public void testsave1 () {list <Unter> user> user = new ArrayList <Beus> (); User user = new user (); user.setName ("tanjie"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setPassword ("123456"); users.Add (Benutzer); user = new user (); user.setName ("Esdong"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setPassword ("123456"); users.Add (Benutzer); user = new user (); user.setName ("qinhongfei"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setPassword ("123456"); users.Add (Benutzer); user = new user (); user.setName ("huizhang"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setPassword ("123456"); users.Add (Benutzer); user = new user (); user.setName ("kaicaner"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setPassword ("123456"); users.Add (Benutzer); Dao.Save (Benutzer); } @Test // public void testupdate () {user user = dao.findone (1); user.setPassword ("123890"); // Um die Aktualisierungsfunktion auf diese Weise zu implementieren, müssen Sie der Service Layer @test // public void testDelete () {Dao.Delete (2) @Transaction -Annotation hinzufügen. } @Test // alle public void testfindAll () {list <Unter> user = (list <Unter>) dao.findall (); System.out.println (json.tojonstring (Benutzer)); } @Test // Abfragen Sie, ob das angegebene ID -Objekt public void Testisexist () {boolean isExist = Dao.Exists (8) existiert; System.out.println (isExist); } @Test // public void testfinduserByIds () {list <Neger> listIds = new ArrayList <GanzEger> (); listIds.add (2); listIds.add (4); listIds.add (7); List <Beus> users = (List <Künstler>) DAO.FINDALL (ListIds); System.out.println (json.tojonstring (Benutzer)); }} Wie Sie sehen können, habe ich zu diesem Zeitpunkt nur eine Schnittstellenklasse geschrieben und diese Schnittstellenklasse nicht implementiert, sodass ich den grundlegenden CRUD -Betrieb abschließen konnte. Da diese Schnittstelle automatisch Methoden zum Hinzufügen, Löschen, Ändern und Suchen nach Domänenobjekten erstellt, um die Geschäftsschicht direkt zu verwenden.
Die Schnittstelle ist wie folgt definiert, und insgesamt 11 Methoden werden bereitgestellt, die im Grunde genommen einfache CRUD -Operationen und Chargenoperationen erfüllen können:
@Norepositorybean Public Interface crudrepository <t, id erweitert serialisierbar> Erweitert Repository <t, id> {<s erweitert T> Save (s Entity); // Save <s erweitert t> iterable <s> speichern (iterable <s> id -richter (id); Das Objekt hat iterable <t> findAll (); // alle Objekte iterable <t> findAll (iterable <id> ids); // Alle Objekte basierend auf der ID -Liste Long Count (); // Berechnen Sie die Gesamtzahl der Objekte void Löschen (ID ID); // VOID -LEGETELTELETEN (T>; // // books) ab, die die Objekte löschen (id -löschen). Void DeleteAll (); // Alle} löschen} löschen 2. PagagingandSortingRepository -Schnittstelle
Die PagagingandSortingRepository -Schnittstelle erbt die Crudrepository -Schnittstelle.
Schnittstellen schreiben und die PagagingandsortingRepository -Schnittstelle erben
Public Interface userRepositoryWithorder erweitert PagagingandSortingRepository <Benutzer, Integer> {} Testkurse schreiben:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:applicationContext-config.xml" }) @TransactionConfiguration(defaultRollback = false) @Transactional public class UserRepositoryWithOrderTest { @Autowired private UserRepositoryWithOrder dao; @Test public void TestOrder () {sortieren sort = new sort (Direction.desc, "id"); Pagable lehbar = neuer pageRequest (0, 5, sortiert); Page <Bener> page = dao.findall (beanstandbar); System.out.println (json.tojonstring (Seite)); System.out.println (page.getSize ()); }} Solange Sie diese Schnittstelle erben, bietet Ihnen Spring Data JPA bereits die Funktionen von Pagination und Sortierung. Die Schnittstelle ist wie folgt definiert, und es werden zwei Methoden zur Verwendung bereitgestellt, wobei t die zu betriebene Entitätsklasse ist und ID der Typ der Entitätsklassen -Primärschlüssel ist
@NorepositoryBean Public Interface PagagingandSortingRepository <t, id erweitert serialisierbar> erweitert crudrepository <t, id> {iterable <t> findAll (sortieren); // sortieren ohne Paging -Seite <T> findall (pagabierbar); // sortieren Sie mit Paging}, mit Paging} -Staging} -Paging «,} mit Paging«} mit Paging « A. JParepository -Schnittstelle
Wenn das Unternehmen CRUD -Operationen bereitstellen und auch Paging- und Sortierfunktionen bereitstellen muss, können Sie diese Schnittstelle direkt erben. Diese Schnittstelle erbt die PagagingandSortingRepository -Schnittstelle.
Die Schnittstelle ist wie folgt definiert:
Öffentliche Schnittstelle JParepository <t, id erweitert serialisierbar> Erweitert PagagingandSortingRepository <t, id> {list <T> findAll (); // Abfragen Sie alle Objekte, sortieren Sie nicht die Liste <T> findall (sortieren). Synchronisiert mit der Datenbank t SareAnDflush (t Entity); // Speichern und Kraft synchronisieren Sie void deletEinBatch (iterable <t> Entitäten); // Batch Löschen Sie void DeleteAlLinBatch (); // alle} löschen} 4. JPaspecificationExecutor -Schnittstelle
Diese Schnittstelle bietet Unterstützung für JPA -Kriterienanfragen. Beachten Sie, dass diese Schnittstelle etwas ganz Besonderes ist und nicht zum Repository -System gehört. Federdaten JPA scannt und erkennt nicht automatisch, sodass die entsprechende Bean nicht gefunden wird. Wir müssen nur eine Unterabmesser erben, die das Repository erbt oder die Repository-Schnittstelle direkt erbt. Spring Data JPA scannt und erkennt und erkennen und führt ein einheitliches Management durch.
Die Schnittstelle ist wie folgt geschrieben:
öffentliche Schnittstelle SpecificationExecutorRepository erweitert Crudrepository <Benutzer, Integer>, jpaspecificificationExecutor <Bener> {} Serviceklasse:
@Service Public Class SpecificationExecutorRepositoryManager {@autowired private SpecificationExecutorrepository dao; / *** Beschreibung: Abfragen Sie den Benutzer basierend auf dem Namen*/ public User FindUserByName (endgültiger Zeichenfolge Name) {return Dao.findone (neue Spezifikation <Benetzels> () {@Override public Predicate Topredicate (Root <Benutzer> root, criteriaQuery <> query, criteriaBuilder cb) {predicate predicate = cb.equal ("root. }); } / *** Beschreibung: Fragen Sie den Benutzer anhand des Namens und der E -Mail an* / öffentlicher Benutzer findUserbynamEandemail (endgültiger Zeichenfolgenname, endgültiger Zeichenfolgen -E -Mail) {return dao.findone (neue Spezifikation <Benutzer> () {@Override public Predicate Topredicate (Root <User> Root, Kriterien <? Prädikat prognostizieren. } /** * Description: Combination query*/ public User findUserByUser(final User userVo){ return dao.findOne(new Specification<User>() { @Override public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate predict = cb.equal(root.get("name"), userVo.getName()); cb.and (Prädikat, cb.equal (root.get ("E -Mail"), uservo.getPassword ()); } / *** Beschreibung: Bereichsabfrage in der Methode, z. B. Abfragen des Benutzer mit Benutzer -ID in [2,10]* / publiclist <Benutzer> findUserByIds (endgültige Liste <Integer> IDs) {return Dao.Findall (Neue Spezifikation <Benutzer> () {@Override öffentliche Vorkenntnisse topredicate (Root <UseraTr. root.in (ids); } / *** Beschreibung: Bereichsabfrage GT -Methode, z. cb.gt (root.get ("id"). As (Integer.class), id); } / *** Beschreibung: Bereichsabfrage LT -Methode, z. cb.lt (root.get ("id"). As (Integer.class), id); } / *** Beschreibung: Bereichsabfrage zwischen Methoden, wie z. cb.between (root.get ("id"). as (Integer.class), start, ende); } / *** Beschreibung: Sortier- und Paginierungsvorgänge* / public page <Bener> findUserAndorder (endgültige int id) {sort Sort = new sort.desc, "id"); return dao.findAll (neue Spezifikation <Benetzbuchs> () {@Override public Predicate Topredicate (Root <Benote> root, Kriterien <?> Abfrage, Kriterien cb) {return cb.gt (root.get ("id"). As (integer.class), id); } / *** Beschreibung: Nur Sortieren von Operationen* / publiclist <Bener> findUerArterSecondMethod (endgültige int id) {return Dao.findall (neue Spezifikation <Benote> () {@Override public Predicate Topredicate (root user> root, criteriaquery <? cb.gt (root.get ("id"). AS (Integer.class), ID); }} Testklasse:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:applicationContext-config.xml" }) @TransactionConfiguration(defaultRollback = false) @Transactional public class SpecificationExecutorRepositoryManagerTest { @Autowired private SpecificationExecutorRepositoryManager manager; @Test public void testfinduserByName () {user user = Manager.FinduserByName ("chhliu"); System.out.println (json.tojonstring (Benutzer)); } @Test public void testfinduserbynameAnDemail () {user user = Manager.FinduserBynamEandemail ("Chhliu", "chhliu @.com"); System.out.println (json.tojonstring (Benutzer)); } @Test public void testfinduserByUServo () {user user = new user (); user.setName ("chhliu"); user.setemail ("[email protected]"); Benutzer u = Manager.FinduserByUser (Benutzer); System.out.println (json.tojonstring (u)); } @Test public void testfinduserbyIds () {list <Unter> user = Manager.FinduserByIds (NeuarrayList <Grayser> (Arrays.aslist (1,3,5,6)); System.out.println (json.tojonstring (Benutzer)); } @Test public void testfinduserByGTID () {list <Unter> user = Manager.FinduserByGTID (5); System.out.println (json.tojonstring (Benutzer)); } @Test public void testfinduserByltid () {list <Unter> user = Manager.FinduserByltid (5); System.out.println (json.tojonstring (Benutzer)); } @Test public void testfinduserBetweenId () {list <Unter> user = Manager.FinduserBetweenID (4, 9); System.out.println (json.tojonstring (Benutzer)); } @Test public void testfinduserAndOrder () {Page <Unter> user = Manager.Finduserandorder (1); System.out.println (json.tojonstring (Benutzer)); } @Test public void testfinduserArderSecondMethod () {list <Unter> user = Manager.FinduserArtorSecondMethod (1); System.out.println (json.tojonstring (Benutzer)); }} 5. Repository -Schnittstelle
Diese Schnittstelle ist die grundlegendste Schnittstelle, sie ist nur eine ikonische Schnittstelle, und es werden keine Methoden definiert. Wie verwendet diese Schnittstelle also? Da Spring Data JPA diese Schnittstelle bietet, ist sie natürlich nützlich. Zum Beispiel einige Methoden, die wir nicht extern bereitstellen möchten. Zum Beispiel möchten wir nur Additions- und Modifikationsmethoden bereitstellen und keine Methoden löschen, dann können die vorherigen Schnittstellen dies nicht tun. Zu diesem Zeitpunkt können wir diese Schnittstelle erben und die entsprechenden Methoden in der Crudrepository -Schnittstelle zur Repository -Schnittstelle kopieren.
Zusammenfassung: Wie sollten Entwickler die oben genannten fünf Schnittstellen auswählen? Tatsächlich ist die Grundlage sehr einfach. Wählen Sie einen von ihnen gemäß den spezifischen Geschäftsbedürfnissen. Weil zwischen jeder Schnittstelle kein Problem der Stärke und Stärke besteht.
4. Springdaten JPA -Abfrage
1. Erstellen Sie eine Abfrage mit @Query
Die Verwendung von @Query Annotation ist sehr einfach. Sie müssen nur die Annotation auf der deklarierten Methode kennzeichnen und eine JP QL -Abfrageanweisung angeben. Viele Entwickler verwenden beim Erstellen von JP QL gerne die Parameter anstelle von Positionsnummern, und @Query unterstützt dies auch. In der JP QL -Anweisung werden Parameter im Format von ": variable" angegeben, und gleichzeitig wird @Param vor den Methodenparametern verwendet, um den benannten Parametern in JP QL zu entsprechen. Darüber hinaus können Entwickler mit @Query auch eine Aktualisierungsoperation durchführen. Dazu müssen wir @Modifying verwenden, um die Operation als modifizierte Abfrage bei der Verwendung @Query zu identifizieren, damit das Framework schließlich einen aktualisierten Betrieb generiert, nicht um einen Abfragebetrieb.
Schreiben Sie eine Schnittstelle wie folgt:
/*** Beschreibung: benutzerdefinierte Abfrage. Wenn Springdaten JPA nicht bereitstellen können, ist eine benutzerdefinierte Schnittstelle erforderlich. Diese Methode kann zu diesem Zeitpunkt verwendet werden. /*** Indexparameter* Beschreibung: Verwenden? Platzhalter*/ @Query ("Wählen Sie u aus dem Benutzer u, wobei U.Email =? 1") // 1 den ersten Parameter -Benutzer FindUserByEmail (String -E -Mail) angibt; /*** Beschreibung: Updates können über @modifying und @query* erhalten werden. Der Rückgabewert der Änderung von Abfragen kann nur ungültig oder int/Integer sein*/@modifikation @Query aktualisieren u.Name =: name wob } HINWEIS: @Modifiking Annotation hat eine Konfiguration löschen
Es heißt, dass der zugrunde liegende Persistenzkontext gelöscht werden kann, nämlich die EntityManager -Klasse. Wir wissen, dass die zugrunde liegende Implementierung von JPA einen sekundären Cache hat, dh nach der Aktualisierung der Datenbank werden Sie das Objekt überprüft, wenn Sie dieses Objekt später verwenden. Dieses Objekt wird auf der ersten Ebene zwischengespeichert, wird jedoch nicht mit der Datenbank synchronisiert. Zu diesem Zeitpunkt wird Clearautomatic = true verwendet, um den ersten Hibernate -Cache der ersten Ebene zu aktualisieren. Andernfalls werden Sie ein Objekt in derselben Schnittstelle aktualisieren und dann dieses Objekt abfragen, dann ist das von Ihnen gefundene Objekt immer noch der vorherige Status, der zuvor nicht aktualisiert wurde.
Testklasse:
@Runwith (SpringJunit4ClASSRunner.class) @ContextConfiguration (SOLITIONEN = {"CLASSPATH: ApplicationContext-config.xml"}) @TransactionConfiguration (defaULtrollback = false) @transactional class userDefinebyselftest {@Antowired private teufransedelebyselfyselftest {@Antowired-private teurer-teufransedelebyselfyselftest | @Test public void testfinduserByName () {user user = dao.finduserbyname ("chhliu"); Assert.asserTequals ("chhliu", user.getName ()); System.out.println (user.getName ()); } @Test public void testfinduserByemail () {user user = dao.finduserByemail ("chhliu @.com"); Assert.asserTequals ("chhliu", user.getName ()); System.out.println (user.getName ()); } @Test public void testupdateuserById () {Dao.UpdateuserById ("Tanjie", 4); }} Aus dem Testcode können wir sehen, dass wir die Schnittstelle nur ohne Implementierungsklasse definieren, sondern die von uns benötigten Funktionen implementieren.
2. Erstellen Sie eine Abfrage mit @NamedQueries
Die benannte Abfrage ist eine Funktion, die von JPA bereitgestellt wird, die Abfrageanweisungen von der Methodenkörper zum Teilen mehrerer Methoden trennen. Spring Data JPA bietet auch gute Unterstützung für benannte Abfragen. Benutzer müssen die Abfrageanweisung nur in der ORM.xml -Datei oder im Code gemäß der JPA -Spezifikation definieren. Das einzige, was sie tun müssen, ist, die Namensregeln von "DomainClass.Methodname ()" zu erfüllen, wenn die Erklärung benannt wird.
Schreiben einer Schnittstelle:
public interface findUserByNamedQueryRepository erweitert JParepository <Benutzer, Integer> {Benutzer findUserWitHName (@param ("Name") String -Name; } Eine Klasse schreiben:
@Entity @namedQuery (value = {@NamedQuery (name = "user.finduserWitHName", query = "Select u von Benutzer u wobei u.: name")}) // Hinweis: Wenn es hier mehrere Methoden gibt, müssen Sie @NameDQuery verwenden. Wenn es nur eine Methode gibt, können Sie @NamedQuery verwenden. Die Schreibmethode lautet wie folgt: @NamedQuery (name = "user.finduserWitHName", query = "SELECT U VON UMSER U WO U.NAME =: name") öffentliche Klasse FindUserBynamedQuery { / *** HINWEIS: Diese Entitätsklasse muss hier definiert werden. } HINWEIS: Die im Artikel rot gekennzeichneten Teile müssen nacheinander entsprechen, andernfalls erfüllen sie die JPA -Spezifikationen nicht.
Testklasse:
@Runwith (SpringJunit4ClASSRunner.class) @ContextConfiguration (SOPITATIONS = {"CLASSPATH: applicationContext-config.xml"}) @TransactionConfiguration (defaUltrollback = False) @Transactional Class findUserynyNeryRepositoryRepositoryToryRepositorytoryToryToryToryToryToryToryRepositorytoryToryRepositorytoryToryToryTeToryToryToryTest { @| @Test public void testfinduserByName () {user user = dao.finduserWitHname ("kaicaner"); System.out.println (json.tojonstring (Benutzer)); }} 3. Erstellen Sie eine Abfrage, indem Sie den Methodennamen analysieren
Wie der Name schon sagt, soll eine Abfrage basierend auf dem Namen der Methode erstellt werden. Vielleicht klingt es zunächst unglaublich, aber nach dem Test stellte ich fest, dass alles möglich ist.
Schreiben einer Schnittstelle:
Die öffentliche Schnittstelle SimpleConditionQueryRepository erweitert JParePository <Benutzer, Integer> { /*** Beschreibung: Gemäß den durch Federdaten definierten Regeln beginnt die Abfragemethode mit Find | Read | Get* Wenn es um bedingte Abfragen geht, sind die Eigenschaften der Bedingung mit bedingten Schlüsselwörtern verbunden. Es ist zu beachten, dass: Der erste Buchstabe des bedingten Attributs muss ein Großbuchstaben sein*// ** HINWEIS: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei U.Name =: Name und U.Email =: E -Mail* Parametername ist der erste Buchstabe des Bedingungsnamens, und der Parameter. BYNAMEANNDEMAIL (Zeichenfolge Name, Zeichenfolgen -E -Mail); / ** * HINWEIS: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei u.name =? 1 oder u.password =? 2 */ list <Unter> findByNameorpassword (String -Name, String -Passwort); / ** * Hinweis: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei u.id zwischen? 1 und? 2 */ list <Benutzer> findByIdbetween (Ganzzahlstart, Ganzzahlende); / ** * Hinweis: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei u.id zwischen? 1 und? 2 */ list <Benutzer> findByIdbetween (Ganzzahlstart, Ganzzahlende); / ** * HINWEIS: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei U.Id <1 */ list <Benutzer> findByIdlessHan (Ganzzahlende); / ** * HINWEIS: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei U.Id>? 1 */ list <Benutzer> findByIdGreaterThan (Ganzzahlstart); / ** * Hinweis: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei U.Name null ist / ** * Hinweis: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei U.Name nicht null ist / ** * Hinweis: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei U.Name wie? 1 */ list <Benutzer> findBynamelike (String -Name); / ** * HINWEIS: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wo U.Name nicht gefällt? 1 */ list <Benutzer> findBynamenotlike (String -Name); / ** * Hinweis: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei u.password =? 1 order nach u.id Desc */ list <Benutzer> findBypassWordOrdbyIdDesc (String -Passwort); / ** * HINWEIS: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei U.Name <>? 1 */ list <Benutzer> findBynamenot (String -Name); / ** * HINWEIS: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei U.ID in? 1 */ list <Benutzer> findByIdin (List <Ganzzahl> ids); / ** * Hinweis: Diese Schnittstelle hier entspricht dem Senden eines SQL: Wählen Sie u aus dem Benutzer u, wobei U.ID nicht in? 1 */ list <Benutzer> findByIdnotin (List <Ganzzahl> ids); } Testklasse (der Kommentarteil ist die tatsächliche gesendete SQL -Anweisung):
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:applicationContext-config.xml" }) @TransactionConfiguration(defaultRollback = false) @Transactional public class SimpleConditionQueryRepositoryTest { @Autowired private SimpleConditionQueryRepository dao; /*** Wählen Sie user0_.id as id0_, user0_.account asconto0_, user0_.email as -E -Mail0_, user0_.name as name0_, user0_password as password0_ von user user0_ wo user0_.name =? und user0_.email =? Grenze? */ @Test public void testfinduserbynameAnDemail () {user user = dao.findbynameAnDemail ("chhliu", "chhliu @.com"); System.out.println (json.tojonstring (Benutzer)); } /*** Wählen Sie user0_.id as id1_, user0_.account asconto1_, user0_.email als E -Mail1_, user0_.name als name1_, user0_.password as password1_ von user0_where0_.name =? oder user0_.password =? */ @Test public void testfinduserByNameorpassword () {list <Unter> user = dao.findbyNameorpassword ("chhliu", "123456"); System.out.println (json.tojonstring (Benutzer)); } /*** Wählen Sie user0_.id als id1_, user0_.account asconto1_, user0_.email als E -Mail1_, user0_.name als name1_, user0_.password as password1_ from user0_.id zwischen? Und ? */ @Test public void testfindbyIdBetween () {list <Unter> user = dao.findbyIdBetween (5, 8); System.out.println (json.tojonstring (Benutzer)); } /*** Wählen Sie user0_.id as id1_, user0_.account asconto1_, user0_.email als E -Mail1_, user0_.name as name1_, user0_.password as password1_ von user0_.id user0_.id <? */ @Test public void testfindbyIdlessTHAN () {list <Unter> user = Dao.FindbyIdlessHan (4); System.out.println (json.tojonstring (Benutzer)); } /*** Wählen Sie user0_.id as id0_, user0_.account asconto0_, user0_.email als E -Mail0_, user0_.name als name0_, user0_.password as password0_ von user0_where0_.id>? */ @Test public void testfindbyIdGreaterThan () {list <Unter> users = dao.findbyIdGreaterThan (6); System.out.println (json.tojonstring (Benutzer)); } /** * select user0_.id as id0_, user0_.account as account0_, user0_.email as email0_, user0_.name as name0_, user0_.password as password0_ from USER user0_ where user0_.name is null */ @Test public void testFindByNameIsNull(){ List<User> users = dao.findByNameIsNull(); System.out.println (json.tojonstring (Benutzer)); } / ** * Wählen Sie user0_.id as id1_, user0_.account asconto1_, user0_.email as E -Mail1_, user0_.name als name1_, user0_.password as password1_ von user0_.name.name ist nicht null * / @Test public void testfindbynOnnot () {oder dao.findbynameisnotnull (); System.out.println (json.tojonstring (Benutzer)); } /*** Wählen Sie user0_.id as id1_, user0_.account asconto1_, user0_.email als E -Mail1_, user0_.name als name1_, user0_.password as password1_ von user0_where0_.name mögen? */ @Test public void testfindbynamelike () {list <Unter> user = Dao.findbynamelike ("chhliu"); System.out.println (json.tojonstring (Benutzer)); } /*** Wählen Sie user0_.id as id0_, user0_.account asconto0_, user0_.email als E -Mail0_, user0_.name als name0_, user0_.password as password0_ from user0_.name0_.name nicht mögen? */ @Test public void testfindbynamenotlike () {list <Unter> users = dao.findbynamenotlike ("chhliu"); System.out.println (json.tojonstring (Benutzer)); } /*** Wählen Sie user0_.id as id0_, user0_.account asconto0_, user0_.email als E -Mail0_, user0_.name as name0_, user0_.password as password0_ von user0_ Where user0_.password =? bestellen von user0_.id Desc */ @test public void testfindByPassWordOrdByIdDesc () {list <Unter> users = dao.findbyPassWorderByIdDesc ("123456"); System.out.println (json.tojonstring (Benutzer)); } /*** Wählen Sie user0_.id as id1_, user0_.account asconto1_, user0_.email als E -Mail1_, user0_.name als name1_, user0_.password as password1_ von user0_where0_.name <>? */ @Test public void testfindbynamenot () {list <Unter> user = Dao.Findbynamenot ("chhliu"); System.out.println (json.tojonstring (Benutzer)); } /** * select user0_.id as id1_, user0_.account as account1_, user0_.email as email1_, user0_.name as name1_, user0_.password as password1_ from USER user0_ where user0_.id in ( ? , ? , ? , ? ) */ @Test public void testFindByIdIn(){ List<User> users = dao.findByIdIn(new ArrayList <NeGeger> (arrays.aslist (3,4,6,8)); System.out.println (json.tojonstring (Benutzer)); } / ** * Wählen Sie user0_.id as id0_, user0_.account asconto0_, user0_.email als E -Mail0_, user0_.name as name0_, user0_.password as password0_ von user user0_ous0_.id nicht in (?,? Dao.FindbyIdnotin (New ArrayList <Geauner> (Arrays.aSlist (3, 4, 6, 8))); System.out.println (json.tojonstring (Benutzer)); }} Hier definieren wir nur eine Schnittstelle. Es gibt nur Methoden in der Schnittstelle, aber es gibt keine Implementierung, aber verschiedene Vorgänge werden abgeschlossen.
Nachdem sie dies gesehen haben, werden viele Menschen wahrscheinlich fragen, wie sich Frühlingsdaten JPA gemacht haben. Wenn das Framework den Methodamen analysiert, fängt es zunächst die überschüssigen Präfixe des Method -Namens ab, z. B. Finden, Finden, Lesen, Readby, Get, Getby und dann den verbleibenden Teil analysieren. Und wenn der letzte Parameter der Methode von Sortier oder vorliegendem Typ ist, werden auch relevante Informationen zur Sortier- oder Paginierungsabfrage nach Regeln extrahiert. Beim Erstellen einer Abfrage drücken wir sie aus, indem wir Attributnamen im Methodennamen verwenden, z. B. findByIdin (). Wenn das Framework diese Methode analysiert, beseitigt es zuerst FindBy und analysiert dann die verbleibenden Attribute.
Bei der Abfrage müssen normalerweise gleichzeitig mehrere Attribute abfragen, und die Abfragebedingungen sind auch unterschiedliche Formate (größer als ein bestimmter Wert, in einem bestimmten Bereich usw.). Spring Data JPA enthält einige Schlüsselwörter zum Ausdrücken einer bedingten Abfrage, ungefähr wie folgt:
Und --- Das Äquivalent zum und dem Schlüsselwort in SQL, wie z.
Oder --- äquivalent zu oder Schlüsselwörter in SQL, wie z.
Zwischen --- zwischen Keyword äquivalent zu SQL, wie z.
LessThan --- äquivalent zu "<" in SQL, wie FindBysalarylessHan (int max)
Greaterthan --- äquivalent zu ">" in SQL, wie FindBySalaryGreaterthan (int min)
Isnull --- äquivalent zu "is null" in SQL, wie FindByUnernameisnull ()
Isnotnull --- äquivalent zu "ist nicht null" in SQL, wie z. B. findByusernameIsnotnull ()
Notnull --- äquivalent zu isnotnull
Wie --- äquivalent zu "Like" in SQL, wie z. B. findByusernamelik (String-Benutzer)
Nicht wie --- äquivalent zu "nicht wie" in SQL, wie z. B. findByusernamenotik (String-Benutzer)
OrderBy ---- äquivalent zu "order by" in SQL, wie z.
Nicht --- äquivalent zu "!
In --- äquivalent zu "in" in SQL, z. B. findByusernameIn (Sammlung <string> userList). Die Parameter der Methode können vom Typ an Sammlung oder einem Array oder einem unbestimmten Längenparameter sein.
NOTIN --- Equivalent zu "nicht in" in SQL, wie FindByUnernamenotin (Sammlung <string> UserList). Die Parameter der Methode können vom Typ an Sammlung oder einem Array oder einem unbestimmten Längenparameter sein.
5. Die Reihenfolge der Erstellung von Fragen
Welche Strategie sollte beim Erstellen eines Proxy -Objekts für eine Schnittstelle für eine Schnittstelle zuerst festgestellt werden, dass mehrere der oben genannten Situationen gleichzeitig verfügbar sind? Dazu bietet <JPA: Repositories> die Eigenschaft für Abfrage-Lookup-Strategie zur Angabe der Reihenfolge der Suchvorgänge. Es hat die folgenden drei Werte:
Erstellen --- Erstellen Sie eine Abfrage, indem Sie den Methodennamen auflösen. Auch wenn es eine passende benannte Abfrage oder die nach der Methode über @Query angegebene Abfrageanweisung gibt, wird sie ignoriert.
Create-wenn-nicht-gefunden --- Wenn die Methode eine Abfrageanweisung über @Query angibt, wird die Abfrage implementiert. Wenn nicht, wird festgestellt, ob eine benannte Abfrage, die den Kriterien erfüllt, definiert ist, falls gefunden wird die benannte Abfrage verwendet. Wenn keiner gefunden wird, wird die Abfrage durch Parsen des Method -Namens erstellt. This is the default value of the query-lookup-strategy property.
use-declared-query --- 如果方法通过@Query 指定了查询语句,则使用该语句实现查询;如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该命名查询;如果两者都没有找到,则抛出异常。
六、Spring Data JPA 对事务的支持
细心的读者也许从上面的代码中看出了一些端倪,我们在使用Spring data JPA的时候,只是定义了接口,在使用的时候,直接注入就可以了,并没有做与事物相关的任何处理,但实际上,事物已经起到效果了,这又是为什么了?
默认情况下,Spring Data JPA 实现的方法都是使用事务的。针对查询类型的方法,其等价于@Transactional(readOnly=true);增删改类型的方法,等价于@Transactional。可以看出,除了将查询的方法设为只读事务外,其他事务属性均采用默认值。
如果用户觉得有必要,可以在接口方法上使用@Transactional 显式指定事务属性,该值覆盖Spring Data JPA 提供的默认值。同时,开发者也可以在业务层方法上使用@Transactional 指定事务属性,这主要针对一个业务层方法多次调用持久层方法的情况。持久层的事务会根据设置的事务传播行为来决定是挂起业务层事务还是加入业务层的事务。
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.