Некоторое время он использовал DATA DATA Spring. В течение этого периода я узнал некоторые вещи и столкнулся с некоторыми проблемами. Я поделюсь ими с вами здесь.
Предисловие:
Введение в данные Spring:
Данные Spring - это структура с открытым исходным кодом для упрощения доступа к базе данных и поддержки облачных сервисов. Его основная цель-сделать доступ к данным удобным и быстрым, а также поддержать карт-кразон и сервисы данных облачных вычислений. Данные пружины содержат несколько подпроектов:
Commons - предоставляет общую базовую структуру, подходящую для использования в каждом подпроекте, и поддерживает упорство по перекрестной датабазе
JPA - упрощает возможность создания уровней доступа к данным JPA и уровней стойкости по всему хранению
Hadoop - MapReduce Работа на основе конфигурации работы Hadoop's Hadoop и модели программирования POJO
Value - интегрирует Redis и Riak, чтобы обеспечить простую упаковку в нескольких общих сценариях
Документ - Интеграция баз данных документов: CouchDB и MongoDB и предоставление базового отображения конфигурации и поддержки библиотеки
График - интегрированный NEO4J для обеспечения мощной модели программирования на основе POJO
График Roo Addon - поддержка ROO для NEO4J
Расширения JDBC - поддерживает Oracle RAD, расширенные очереди и расширенные типы данных
Отображение - предоставленная структура отображения объектов на основе Грааля, поддерживающая различные базы данных
Примеры - выборки программ, документы и графические базы данных
Руководство - передовая документация
1. Введение в данные Spring JPA
Spring Data JPA - это структура приложения JPA, инкапсулированную Spring на основе спецификаций ORM и спецификаций JPA, и предоставляет полный набор решений по уровню доступа к данным.
2. Функции ДПА Spring Data JPA
Spring Data JPA имеет очень мощные функции. Здесь мы пропускаем шаг построения окружающей среды и рассмотрим «сладость» Spring Data JPA.
Spring Data JPA предоставляет пользователям следующие интерфейсы:
3. Весенний интерфейс JPA Data Data
1. Crudrepository Interface
Создайте класс сущности:
@Entity @Table (name = "user") public class user {@id @generatedvalue private integer id; // учетная запись частной строки; // Имя частного имени строки; // пароль частной строки пароль; // электронная почта частной строки электронной почты; } Напишите интерфейс и наследуйте интерфейс Crudrepository:
Общественный интерфейс userRepository расширяет CrudRepository <user, Integer> {} Напишите тестовый класс (чтобы увидеть эффект более интуитивно, все тестовые классы не используют утверждения, и печатные операторы, которые используются непосредственно):
открытый класс 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 (пользователь); } @Test // Сохранить public void testSave1 () {list <user> users = new ArrayList <user> (); Пользователь пользователь = новый пользователь (); user.setname ("tanjie"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setpassword ("123456"); users.add (пользователь); user = new user (); user.setname ("esdong"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setpassword ("123456"); users.add (пользователь); user = new user (); user.setname ("Qinhongfei"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setpassword ("123456"); users.add (пользователь); user = new user (); user.setname ("huizhang"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setpassword ("123456"); users.add (пользователь); user = new user (); user.setname ("caican"); user.setAccount ("10000"); user.setemail ("[email protected]"); user.setpassword ("123456"); users.add (пользователь); dao.save (пользователи); } @Test // Обновление public void testupDate () {user user = dao.findone (1); user.setPassword ("123890"); // Для реализации функции обновления таким образом вам необходимо добавить аннотацию @transaction thing в уровень службы} @test // Удалить public void testdelete () {dao.delete (2); } @Test // Запросить все public void testfindall () {list <user> users = (list <user>) dao.findall (); System.out.println (json.tojsonstring (пользователи)); } @Test // Запрос, существует ли указанный объект идентификатора public void testisexist () {boolean isexist = dao.exists (8); System.out.println (isexist); } @Test // Query public void testfinduserbyids () {list <Integer> listids = new ArrayList <Integer> (); listIds.add (2); listIds.add (4); listIds.add (7); Список <user> users = (list <user>) dao.findall (listids); System.out.println (json.tojsonstring (пользователи)); }} Как вы можете видеть, на данный момент я написал только один класс интерфейса и не реализовал этот класс интерфейса, чтобы я мог выполнить основную операцию CRUD. Поскольку этот интерфейс автоматически создаст методы для добавления, удаления, изменения и поиска объектов домена, для прямого использования бизнес -уровня.
Интерфейс определяется следующим образом, и предоставляется в общей сложности 11 методов, которые в основном могут соответствовать простым операциям CRUD и пакетным операциям:
@Norepositorybean public interface crudrepositority <t, id Extends serializable> Extends Repository <T, id> {<s extends t> s save (s entity); // Сохранить <s extends t> iterable <s> Сохранить (итератный <s> intities); // bather save in findone (идентификатор); // Query на основе объекта на основе на основе объекта на основе идентификатора); Объект имеет инициативу <t> findall (); // Запросить все объекты итерационные <t> findall (iterable <id> ids); // Запрос всех объектов на основе списка идентификатора long count (); // Вычислять общее количество объектов void delete (id id); // delete void delete (t entity); // delete delete void delete (idatable <intelected <) delete (idatable <intelected <) delete (idatable <) deleteds <intealby <estite). Delete void deleteall (); // удалить все} 2. PagingandSortingRepository Interface
Интерфейс PagingandSortingRepository наследует интерфейс CrudRepository.
Напишите интерфейсы и наследуйте интерфейс PagingandSortingRepository Interface
Публичный интерфейс userRepositorywithorder Extens PagingandSortingRepository <user, Integer> {} Напишите классы тестирования:
@Runwith (springjunit4classrunner.class) @contextconfiguration (locations = {"classpath: ApplicationContext-config.xml"}) @TransactionConfiguration (Defaultrollback = false) @Transactional Public Class UserRepositoryWithorderTest {@Autowired Private UserRepoSitory DaipoStoryTestStest {@Autowired Private UserRepoStory; @Test public void testorder () {sort sort = new Sort (direction.desc, "id"); Пегсный нанесенный = новый PageRequest (0, 5, Sort); Page <user> page = dao.findall (Pagable); System.out.println (json.tojsonstring (page)); System.out.println (page.getSize ()); }} Пока вы наследуете этот интерфейс, Spring Data JPA уже предоставит вам функции страниц и сортировки. Интерфейс определяется следующим образом, и для использования предусмотрены два метода, где T - класс объектов, который будет управлять, а ID - тип первичного ключа класса объекта
@NorePositoryBean Публичный интерфейс PagingandSortingRepository <T, ID расширяет Serializable> Extends CrudRepository <T, id> {uterable <t> findall (sort sort); // sort без страницы Paging <t> findall (Pagable Pagable); // Сортировать с пейджином} 3. jparepository interface
Если бизнес необходимо обеспечить операции CRUD, а также предоставить функции пейджинга и сортировки, вы можете напрямую наследовать этот интерфейс. Этот интерфейс наследует интерфейс PagingandSortingRepository.
Интерфейс определяется следующим образом:
Публичный интерфейс jparePository <T, ID Extens Serializable> Extends PagingandSortingRepository <T, id> {list <t> findall (); // Запрос всех объектов, не сортируйте список <t> findall (sort sort); // Запрос всех объектов и сортировки <s extends t> sail <s> save (iterable <s> Enterities);//sort extends t> save save (итерабируемые <s> envities);//sortends fuse sail (sailable <s> envities);///sortends t> save save (итерабируемые <s>);///sortends t> save (sailable <s>); Синхронизируются с базой данных t saveAndflush (t entity); // Сохранить и синхронизировать void deleteInbatch (iterable <t> entities); // пакетная удаление void deleteallinbatch (); // Удалить все} 4. jpaspecificationexecutor interface
Этот интерфейс обеспечивает поддержку запросов критериев JPA. Обратите внимание, что этот интерфейс очень особенный и не принадлежит системе репозитория. Spring Data JPA не будет автоматически сканировать и распознавать, поэтому соответствующий фасоль не будет найден. Нам нужно только унаследовать любое подпозит, который наследует репозиторий или непосредственно наследует интерфейс репозитория. Spring Data JPA автоматически сканирует и распознает и выполняет унифицированное управление.
Интерфейс написан следующим образом:
Спецификация общедоступного интерфейса ExeCutorRepository Extens CrudRepository <user, Integer>, jpaspecificationExecutor <user> {} Класс обслуживания:
@Service public class specificationexecutorrepositorymanager {@autowired private specificationexecutorrepository dao; / **! }); } / **! Predict1 = CB.Equal (root.get ("name"); } / **! uservo.getName ()); } / *** Описание: запрос диапазона в методе, такой как запрос пользователя с идентификатором пользователя в [2,10]* / public <user> finduserbyids (окончательный список <Integer> ids) {return dao.findall (new Specification <user> () {@override public Predicat root.in (ids); } / *** Описание: Метод запроса диапазона gt, такой как запрос всех пользователей с идентификатором пользователя, превышающим 9* / public <user> finduserbygtid (final int id) {return dao.findall (новая спецификация <user> () {@override public Predicate toperredicat cb.gt (root.get ("id"). as (integer.class), id); } / *** Описание: Метод LT QUERY LIT, такой как запросы пользователей с идентификатором пользователя менее 10* / public <user> findUserByltid (final Int Id) {return dao.findall (новая спецификация <user> () {@Override public Predicat cb.lt (root.get ("id"). as (integer.class), id); } / *** Описание: Запрос диапазона между методами, такими как запросы пользователей с идентификаторами между 3 и 10* / public <user> findUserbetweenid (final int start, final int end) {return dao.findall (новая спецификация <user> () {@Override public Predicat CB.WENSE (root.get ("id"). as (integer.class), start, end); } / **! вернуть dao.findall (новая спецификация <user> () {@override public Predicate topredicate (root <user> root, criteriaquery <?> Query, Criteriabuilder cb) {return cb.gt (root.get ("id"). as (integer.class), id);}}, new Pagerquest (0, 5,, сортинг); } / **! cb.gt (root.get ("id"). as (integer.class), id); }} Тестовый класс:
@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.tojsonstring (пользователь)); } @Test public void testfinduserbynameandemail () {user user = Manager.finduserBynameAndemail ("chhliu", "chhliu @.com"); System.out.println (json.tojsonstring (пользователь)); } @Test public void testfinduserbyuservo () {user user = new user (); user.setname ("chhliu"); user.setemail ("[email protected]"); Пользователь u = Manager.finduserByuser (пользователь); System.out.println (json.tojsonstring (u)); } @Test public void testfinduserbyids () {list <user> users = manager.finduserbyids (новый ArrayList <Integer> (Arrays.aslist (1,3,5,6))); System.out.println (json.tojsonstring (пользователи)); } @Test public void testfinduserBygtid () {list <user> users = manager.finduserbygtid (5); System.out.println (json.tojsonstring (пользователи)); } @Test public void testfinduserByltid () {list <user> users = manager.finduserbyltid (5); System.out.println (json.tojsonstring (пользователи)); } @Test public void testfinduserweewneid () {list <user> users = manager.finduserweewneid (4, 9); System.out.println (json.tojsonstring (пользователи)); } @Test public void testfinduserandorder () {page <user> users = manager.finduserandorder (1); System.out.println (json.tojsonstring (пользователи)); } @Test public void testfinduserandordersecondmethod () {list <user> users = manager.finduserandordersecondmethod (1); System.out.println (json.tojsonstring (пользователи)); }} 5. Интерфейс репозитория
Этот интерфейс является самым основным интерфейсом, это всего лишь знаковый интерфейс, и никакие методы не определены, так что же использует этот интерфейс? Поскольку Spring Data JPA предоставляет этот интерфейс, это, конечно, полезно. Например, некоторые методы, которые мы не хотим предоставлять внешне. Например, мы хотим предоставить только методы сложения и модификации, а не методы удаления, тогда предыдущие интерфейсы не могут этого сделать. В настоящее время мы можем унаследовать этот интерфейс и скопировать соответствующие методы в интерфейсе Crudrepository до интерфейса репозитория.
Резюме: Как разработчики должны выбрать вышеупомянутые пять интерфейсов? На самом деле, основа очень проста. Выберите один из них в соответствии с конкретными потребностями бизнеса. Потому что нет проблем с силой и силой между каждым границей.
4. Запрос JPA Spring Data JPA
1. Создайте запрос, используя @Query
Использование аннотации @Query очень просто. Вам просто нужно пометить аннотацию на объявленном методе и предоставить заявление QL QL JP. Многим разработчикам нравится использовать названные параметры вместо номеров позиций при создании JP QL, а @Query также оказывает поддержку для этого. В операторе JP QL параметры определяются через формат «: переменная», и в то же время @Param используется перед параметрами метода, чтобы соответствовать именованным параметрам в JP QL. Кроме того, разработчики также могут выполнить операцию обновления с помощью @Query. Для этого нам нужно использовать @Modification для определения операции в качестве модифицированного запроса при использовании @Query, чтобы фреймворк в конечном итоге генерировал обновленную операцию, а не операцию запроса.
Напишите интерфейс следующим образом:
/*** Описание: пользовательский запрос. Когда данные Spring JPA не могут предоставить, требуется пользовательский интерфейс. Этот метод может использоваться в настоящее время*/ public interface userdefinebyself extends jparepository <user, integer> {/ *** с именем параметров* Описание: Рекомендуется использовать этот метод, вы можете игнорировать местоположение параметров*/ @Query ("Select U из пользователя u, где u.name =: name") пользователь finducerbyname (@param (wome); /*** Параметры индекса* Описание: Использовать? Placeholder*/ @Query ("Выберите u из пользователя u, где u.email =? 1") // 1 Указывает первое параметр пользователя FinderByemail (строка Email); /*** Описание: Обновления могут быть достигнуты с помощью @modification и @Query* Примечание: возвращаемое значение модифицирующих запросов может быть void или int/integer*/@modifying @Query («Обновление пользователя u Set u.name =: name where u.id =: id») int updateUserByid (@param («name»). } Примечание: @Modifing Annotation имеет конфигурацию ClearAutomaticaly
В нем говорится, что основной контекст настойчивости может быть очищен, который является классом EntityManager. Мы знаем, что базовая реализация JPA будет иметь вторичный кэш, то есть после обновления базы данных, если вы используете этот объект позже, вы проверите объект. Этот объект кэширован на первом уровне, но он не синхронизирован с базой данных. В настоящее время, ClearAutomaticals = true будет использоваться для обновления кэша первого уровня Hibernate. В противном случае вы будете обновлять объект в том же интерфейсе, а затем запросить этот объект, тогда обнаруженным вами объектом все еще является предыдущее состояние, которое не было обновлено ранее.
Тестовый класс:
@Runwith (springjunit4classrunner.class) @contextconfiguration (locations = {"classPath: ApplicationContext-config.xml"}) @TransactionConfiguration (defaultrollback = false) @Transactional публичного класса пользовательский класс @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); }} Из тестового кода мы видим, что мы определяем интерфейс только без какого -либо класса реализации, но реализуем необходимые нам функции.
2. Создайте запрос с помощью @namedqueries
Названный запрос - это функция, предоставленная JPA, которая отделяет операторы запросов от тела метода для обмена несколькими методами. Spring Data JPA также обеспечивает хорошую поддержку для названных запросов. Пользователям необходимо определить оператор запроса в файле ORM.XML или в коде в соответствии со спецификацией JPA. Единственное, что им нужно сделать, - это соответствовать правилам именования «domainclass.methodname ()», когда называют утверждение.
Написание интерфейса:
Общедоступный интерфейс findureuserbynamedqueryrepository extends jparepository <user, integer> {user finducerwithname (@param ("name") String name); } Написание класса:
@Entity @NamedQuery (value = {@NamedQuery (name = "user.finduserWithName", Query = "Выберите U из пользователя u, где u.name =: name")}) // Примечание: если здесь есть несколько методов, вам нужно использовать @namedquery. Если есть только один метод, вы можете использовать @namedquery. Метод написания следующим образом: @namedquery (name = "user.finduserwithname", Query = "Выберите U из пользователя u, где u.name =: name") открытый класс Finduuserbynamedquery { / *** Примечание: этот класс объектов должен быть определен здесь, в противном случае будет сообщено о исключении* / @id @generatedvalue private Integer id; } ПРИМЕЧАНИЕ. Части, отмеченные красным в статье, должны соответствовать одному, иначе они не будут соответствовать спецификациям JPA.
Тестовый класс:
@Runwith (springjunit4classrunner.class) @contextconfiguration (locations = {"classpath: ApplicationContext-config.xml"}) @transactionConfiguration (Defaultrollback = false) @Transactional Public Class FindeSerbynaMedqueryReporyTestTest {@autowowired privateRephyReporyReporyReporyReporyReporyReporyReporyReporyReporyReporyReporyReporyReporyReporyReporyTerpoStoryTestEsteSter @Test public void testfinduserbyname () {user user = dao.finduserwithname ("caican"); System.out.println (json.tojsonstring (пользователь)); }} 3. Создайте запрос, анализируя имя метода
Как следует из названия, он должен создать запрос на основе имени метода. Может быть, сначала это звучит невероятно, но после тестирования я обнаружил, что все возможно.
Написание интерфейса:
Общедоступный интерфейс SimpleConditionQueryRepository Extends jParePository <Пользователь, Integer> { /*** Описание: Согласно правилам, определяемым данными Spring, метод запроса начинается с поиска | Read | GET* Когда дело доходит до условного запроса, свойства условия связаны с условными ключевыми словами. Следует отметить, что: первая буква условного атрибута должна быть верхней передачей*// *** Примечание. Этот интерфейс здесь эквивалентна отправке SQL: выберите U из пользователя u, где u.name =: name and u.email =: электронная почта* Имя параметра - это верхняя буква, исходная буква условного названия - это верхний, а параметры параметров в параметрах параметра в параметрах параметра в параметрах параметра в параметрах параметра в параметрах параметра в параметрах в параметрах в параметрах. FindBynaMeandEmail (имя строки, строка электронная почта); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где u.name =? 1 или u.password =? 2 */ list <user> findbynameorpassword (string name, string пароль); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где u.id между? 1 и? 2 */ list <user> findbyIdweed (Integer Start, Integer End); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где u.id между? 1 и? 2 */ list <user> findbyIdweed (Integer Start, Integer End); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где u.id <? 1 */ list <user> findbyidlessthan (целое число); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где u.id>? 1 */ list <user> findbyidgreaterthan (целое число); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где U.Name is null */ list <user> findbynameisnull (); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где U.Name не является null */ list <user> findbyNameIsnotnull (); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где U.name like? 1 */ list <user> findbynaMelike (String name); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где U.name не так, как? 1 */ list <user> findbynamenotlike (String name); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где u.password =? 1 Порядок от U.Id desc */ list <user> findBypassWordByidDesc (String пароль); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где u.name <>? 1 */ list <user> findbymantot (String name); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где u.id in? 1 */ list <user> findbyidin (list <Integer> ids); / ** * Примечание: этот интерфейс здесь эквивалентен отправке SQL: выберите u из пользователя u, где u.id не в? 1 */ list <user> findbyidnotin (list <Integer> ids); } Тестовый класс (часть комментария является фактическим отправленным заявлением SQL):
@Runwith (springjunit4classrunner.class) @contextconfiguration (locations = {"classpath: ApplicationContext-config.xml"}) @transactionConfiguration (Defaultrollback = false) @Transactional Public Class SimpleConditionQueryRepositoryTest {@Autowired Private SimpleConditionquery DaoPositoryReporyReporyReporyRepory /*** Выберите user0_.id как id0_, user0_.account as account0_, user0_.email как email0_, user0_.name как name0_, user0_.password as password0_ из пользователя user0_ user0_.name =? и user0_.email =? предел? */ @Test public void testfinduserbynameandemail () {user user = dao.findbynameandemail ("chhliu", "chhliu @.com"); System.out.println (json.tojsonstring (пользователь)); } /*** Выберите user0_.id как id1_, user0_.account as account1_, user0_. или user0_.password =? */ @Test public void testfinduserbynameorpassword () {list <user> users = dao.findbynameorpassword ("chhliu", "123456"); System.out.println (json.tojsonstring (пользователи)); } /*** Выберите user0_.id как id1_, user0_.account as account1_, user0_. и ? */ @Test public void testfindbyIdweed () {list <user> users = dao.findbyIdweed (5, 8); System.out.println (json.tojsonstring (пользователи)); } /*** Выберите user0_.id как id1_, user0_.account as account1_, user0_. */ @Test public void testfindbyidlessthan () {list <user> users = dao.findbyidlessthan (4); System.out.println (json.tojsonstring (пользователи)); } /*** Выберите user0_.id как id0_, user0_.account as account0_, user0_. */ @Test public void testfindbyidgreaterthan () {list <user> users = dao.findbyidgreaterthan (6); System.out.println (json.tojsonstring (пользователи)); } / ** * Выберите user0_.id как id0_, user0_.account as account0_, user0_. System.out.println (json.tojsonstring (пользователи)); } / ** * SELECT user0_.id as ID1_, user0_.account as account1_, user0_.email как email1_, user0_.name как name1_, user0_.password as password1_ user user0_, где user0_.name не является null * / @test public void stepfindb dao.findbynameisnotnull (); System.out.println (json.tojsonstring (пользователи)); } /*** Выберите user0_.id как id1_, user0_.account as account1_, user0_. */ @Test public void testfindbynamelike () {list <user> users = dao.findbynamelike ("chhliu"); System.out.println (json.tojsonstring (пользователи)); } /*** Выберите user0_.id как id0_, user0_.account as account0_, user0_. */ @Test public void testfindbynamenot -like () {list <user> users = dao.findbynamenotlike ("chhliu"); System.out.println (json.tojsonstring (пользователи)); } /*** Выберите user0_.id как id0_, user0_.account as account0_, user0_. Заказ от пользователя0_.id desc */ @test public void testfindbypasswordordordydesc () {list <user> users = dao.findbypasswordorderbyiddesc ("123456"); System.out.println (json.tojsonstring (пользователи)); } /*** Выберите user0_.id как id1_, user0_.account as account1_, user0_. */ @Test public void testfindbynamenot () {list <user> users = dao.findbynamenot ("chhliu"); System.out.println (json.tojsonstring (пользователи)); } / ** * SELECT user0_.id as ID1_, user0_.account as account1_, user0_.email as emike1_, user0_.name как name1_, user0_.password as password1_ user user0_ user0_.id in (?,?,? ArrayList <Integer> (Arrays.aslist (3,4,6,8))); System.out.println (json.tojsonstring (пользователи)); } / ** * SELECT user0_.id AS AS ID0_, user0_.account as account0_, user0_.email как email0_, user0_.name как name0_, user0: dao.findbyidnotin (новый Arraylist <Integer> (Arrays.aslist (3, 4, 6, 8))); System.out.println (json.tojsonstring (пользователи)); }} Здесь мы определяем только один интерфейс. В интерфейсе есть только методы, но реализации нет, но различные операции завершены.
Увидев это, многие люди, вероятно, спросят, как это сделали Spring Data JPA? Оказывается, что когда структура анализирует имя метода, он сначала перехватит избыточные префиксы имени метода, такие как Find, Findby, Read, Readby, Get, Getby, а затем анализируйте оставшуюся часть. И если последний параметр метода является сообразительным или переночным типом, соответствующая информация также будет извлечена для сортировки или запроса на страницу по правилам. При создании запроса мы выражаем его, используя имена атрибутов в имени метода, например, findbyidin (). Когда структура анализирует этот метод, он сначала устраняет Findby, а затем анализирует оставшиеся атрибуты.
При запросе обычно необходимо запросить на основе нескольких атрибутов одновременно, а условия запроса также имеют разные форматы (больше определенного значения, в определенном диапазоне и т. Д.). Данные Spring JPA предоставляет некоторые ключевые слова для выражения условного запроса, примерно следующим образом:
И --- эквивалент ключевого слова в SQL, такой как FindByuserNameAndPassword (String User, Striang Pwd)
Или --- эквивалент или ключевых слов в SQL, таких как FindByuserNameorAddress (String User, String Addr)
Между --- между ключевым словом, эквивалентным SQL, таким как FindBysalaryweed (int max, int min)
Менее --- эквивалент «<» в SQL, например, FindBysalary Than (int max)
Большой --- эквивалент «>» в SQL, например, Findbysalarygreaterthan (int min)
Isnull --- эквивалент «is is null» в SQL, такой как Findbyusernameisnull ()
Isnotnull --- эквивалент «не является нулевым» в SQL, такой как FindByusernameisnotnull ()
Notnull --- эквивалент isnotnull
Как --- эквивалент «любить» в SQL, например, FindByuserNamelike (String User)
Не нравится --- эквивалентно «не как» в SQL, например, FindByusernameNotlike (String User)
Orderby ---- эквивалент «order by» в SQL, такой как FindByuserNamorderBysalaryASC (String User)
Не --- эквивалент "! =" В SQL, например, FindByuserNamenot (строковый пользователь)
В --- эквивалентно «в» в SQL, например, FindByuserNamein (Collection <string> пользовательский список). Параметры метода могут иметь тип сбора, или массив или параметр неопределенной длины.
Не-эквивалентно «не в» в SQL, таком как Findbyusernamenotin (Collection <string> пользовательский список). Параметры метода могут иметь тип сбора, или массив или параметр неопределенной длины.
5. Порядок создания запросов
При создании прокси -объекта для интерфейса, если он обнаруживает, что множество вышеупомянутых ситуаций доступны одновременно, какую стратегию она должна принять первым? Для этого <JPA: Repositories> предоставляет свойство стратегии-стратегии запроса для указания порядка поиска. Он имеет следующие три значения:
Создать --- Создать запрос, разрешив имя метода. Даже если есть соответствующий именованный запрос или оператор запроса, указанный методом через @Query, его игнорируют.
Create-if-not-found --- Если метод определяет оператор запроса через @Query, запрос реализован; Если нет, то обнаруживается, определяется ли определяется именованный запрос, который соответствует критериям, если обнаружен, именованный запрос используется; if neither is found, the query is created by parsing the method name. 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 指定事务属性,这主要针对一个业务层方法多次调用持久层方法的情况。持久层的事务会根据设置的事务传播行为来决定是挂起业务层事务还是加入业务层的事务。
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.