О весенних данных
Ведущий проект в весеннем сообществе в основном используется для упрощения доступа данных (реляционных и нереляционных). Если мы используем Spring Data для разработки программ, мы можем сохранить множество низкоуровневых операций доступа к данным, таких как написание операторов запросов данных, классы DAO и т. Д. Нам нужно только написать некоторые абстрактные интерфейсы и определить соответствующие операции. Spring создаст экземпляры прокси во время работы для реализации операций, определенных в нашем интерфейсе.
О подпроекте Spring Data
Данные Spring имеют много подпроектов, в дополнение к Spring Data JPA, есть также следующие субпроекты.
Spring Data Commons
Данные пружины Mongodb
Spring Data Redis
Пружинные данные Solr
ДАННЫЕ ДАННЫЕ ДАННЫЕ
Весенние данные отдыха
Весенние данные neo4j
О Spring Data JPA
Данные Spring JPA-это субпроект пружинных данных. В основном он используется для упрощения реализации уровня доступа к данным. Используя Spring Data JPA, вы можете легко реализовать добавление, удаление, модификацию, лиц, сортировку и т. Д.
Пример, Spring Boot + Spring Data JPA
1. Добавить файл pom.xml
Как показано ниже:
<? xml version = "1.0" Encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <dolidyversion> 4.0.0 </modelversion> <groupid> com.example </GroupId> <ArtifactId> demoId> </artifActid> demoId> </artifactid> </artifactid> </artifactid>. <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-data-jpa-example</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.4.RELEASE</version> <retailyPath/> <!-Поиск родителя от репозитория-> </parent> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceEncoding> <project.roport.outputencoding> utf-8 </project.proting.outputing> </Свойства> <Depertiencies> <dehyedency> <groupid> org.springframework.boot </GroupId> <straCactId> Spring-boot-starter-data-jpa </artifactid> </resemending> <dependency> <groupid> org.springframework.boot </artifactid> spring-boot-starter-webrame. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId> org.springframework.boot </GroupId> <ArtifactId> Spring-Boot-Starter-cache </artifactid> </dependency> </depertive> <buld> <blicins> <groupid> org.springframework.boot </Group> <artifactid> Spring-boot-maven-plugin </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </build> </project>
Среди них Spring-Boot-Starter-Parent будет загружать все конфигурации по умолчанию, необходимые для приложения Spring Boot;
Spring-Boot-Starter-Data-JPA загрузит все зависимости, необходимые для Spring Data JPA;
Добавить Spring-Boot-Starter-Web, потому что наш проект является веб-приложением;
Кроме того, наша база данных-MySQL, поэтому также требуется зависимость MySQL-Connector-Java;
Поскольку используется кэш, добавьте еще одну зависимость от Spring-Boot-Starter-Cache;
2. Напишите пользователь объекта
пакет com.example.domain; import java.io.serializable; import javax.persistence.column; импорт javax.persistence.entity; импорт javax.persistence.id; импорт javax.persistence.namedquery;@entity@write u name u where u where u where u where u whed u where u where u wry u wry u wry u wry un. Пользователь класса реализует Serializable {Private Static Long Long SerialVersionUID = 1L; @ID LONG ID; @Column (name = "name") String name; @Column (name = "address") строковой адрес; public long getId () {return id; } public void setId (long id) {this.id = id; } public String getName () {return name; } public void setName (string name) {this.name = name; } public String getAddress () {return Adder; } public void setAddress (строковый адрес) {this.address = address; }}Больше нечего сказать. Обратите внимание на аннотацию @namedquery здесь. Это примерно означает, что метод FindByName, который мы определяем в интерфейсе репозитория, не использует реализацию запроса по умолчанию, а вместо этого использует этот пользовательский оператор запроса для запроса. Если здесь нет аннотации, реализация по умолчанию будет использоваться.
3. Напишите интерфейс репозитория
Здесь мы напишем два интерфейса репозитория, которые используются только для примеров и могут быть объединены в один на практике:
UserJparePository
пакет com.example.repository; import org.springframework.data.jpa.repository.jparepository; import com.example.domain.user; Общедоступный интерфейс userJparePository Extends jParePository <Пользователь, Long> {}Интерфейс userJparePository здесь реализует интерфейс JparePository;
Фактически, JparePository реализует интерфейс PagingandSortingRepository, интерфейс PagingandSortingRepository реализует интерфейс Crudrepository, а интерфейс Crudrepository реализует интерфейс репозитория;
Краткое объяснение:
Интерфейс репозитория является идентификационным интерфейсом, и он пуст внутри;
Интерфейс Crudrepository определяет методы добавления, удаления, модификации и поиска;
Интерфейс PagingandSortingRepository используется для пейджинга и сортировки;
Поскольку интерфейс JparePository наследует все вышеперечисленные интерфейсы, он имеет все методы, объявленные ими;
Также обратите внимание, что принятие метода Findall в качестве примера, интерфейс JparePository возвращает список, PagingandSortingRepository и Crudrepository return iterator;
UserRepository
пакет com.example.repository; import java.util.list; импорт org.springframework.data.jpa.repository.query; import org.springframework.data.repository.repository; import.spramework.data.Repository.param. UserRepository Extends Repository <user, long> {list <user> findbynaindaddress (string name, string address); @Query (value = "От пользователя u, где u.name =: name") list <user> findbyname1 (@param ("name") String name); @Query (value = "select * From #{ #entityName} u, где u.name =? 1", nativequery = true) list <user> findbyname2 (string name); Список <user> findbyname (string name);}Интерфейс userRepository здесь в основном определяет некоторые методы запроса;
Например, мы можем выполнить непосредственно, не определяя другие операторы запроса здесь. Spring Data JPA автоматически реализует метод на основе имени атрибута и имени метода класса Entity; PS: Поскольку мы объявляем аннотацию @namequery в классе организации, на самом деле метод FindbyName будет использовать заявление запроса, аннотированное аннотацией @namedquery для запроса;
Кроме того, метод FindByName1 здесь использует запрос оператора HQL;
Метод FindByName2 использует исходный запрос оператора SQL;
4. Напишите службу
Интерфейс сервиса:
пакет com.example.service; import java.util.list; import com.example.domain.user; открытый интерфейс iuserservice {public list <user> findall (); public void SaidUser (пользовательская книга); Общественный пользователь Findone (Long Id); public void Delete (Long Id); Общедоступный список <user> findbyname (string name);}Класс реализации интерфейса:
пакет com.example.service.impl; import java.util.list; import org.springframework.beans.factory.annotation.autowired; import org.springframework.cache.annotation.cachable; импорт org.springframework.stepolype.service; com.example.domain.user; import com.example.repository.userRepository; import com.example.repository.userjporepository; import com.example.service.iuserservice;@service@transactionalpublic class userserviceimplements iuserservice {@Autowired private userJAperEpository; @Autowired private userRepository userRepository; public list <user> findall () {return userJparePository.findall (); } public List <user> findByName (string name) {list <user> userList1 = userRepository.findbyName1 (name); Список <user> userlist2 = userRepository.findbyname2 (name); Список <user> userlist3 = userRepository.findbynameanddaddress (name, "3"); System.out.println ("userList1:" + userList1); System.out.println ("userList2:" + userList2); System.out.println ("userList3:" + userList3); return userRepository.findbyname (name); } public void SaidUser (пользовательская книга) {userJparePository.save (book); } @Cachable ("users") public user findone (long id) {System.out.println ("Cached Pages"); return userJparePository.findone (id); } public void delete (long id) {userJparePository.delete (id); }}Об этом нечего сказать, просто вызовите метод интерфейса репозитория.
5. Напишите контроллер
О контроллере нечего сказать, просто позвоните в службу. Обратите внимание, что контроллер здесь аннотирован с использованием аннотации @RestController, а имя пути URL названо в соответствии с Restful Style;
пакет com.example.web; import java.util.list; import org.springframework.beans.factory.annotation.autowired; import org.springframework.web.bindation.annotation.pathvariable; импорт org.springframework.web.bindtation.Requestmaping; org.springframework.web.bind.annotation.restcontroller; import com.example.domain.user; import com.example.service.iuserservice;@restcontroller@requestmapping (value = "/users") public class usercontroller {@autowireder private iuserservice userservice; @RequestMapping (value = "/add/{id}/{name}/{Adder}") public usdUser (@pathvariable int id, @pathvariable String name, @pathvarible строкового адреса) {user user = new user (); user.setid (id); user.setname (имя); user.setAddress (адрес); userservice.saveuser (пользователь); вернуть пользователь; } @Requestmapping (value = "/delete/{id}") public void deletebook (@pathvariable int id) {userservice.delete (id); } @Requestmapping (value = "/") public list <uster> getBooks () {return userservice.findall (); } @RequestMapping (value = "/{id}") открытый пользователь getUser (@pathvariable int id) {user user = userservice.findone (id); вернуть пользователь; } @RequestMapping (value = "/search/name/{name}") public list <user> getBookbyName (@pathvarable String name) {list <user> users = userservice.findbyname (name); вернуть пользователей; }}6. Настройка DataSource
Добавьте следующую конфигурацию в файл Application.properties:
Spring.jpa.show-sql = truelogging.level.org.springframework.data = debugspring.jpa.hibernate.ddl-auto = spring.datasource.url = jdbc: mysql: // localhost: 33 06/demospring.datasource.username = rotspring.datasource.password = rotspring.datasource.driver-class-name = com.mysql.jdbc.driver
Если вы используете STS IDE, эти конфигурации атрибутов будут автоматически предложены, поэтому вы можете сохранить поиски.
Если вы хотите просмотреть конфигурацию spring.datasource, вы можете обратиться к этому классу: DataSourceProperties.java
7. Напишите класс стартапа
Это относительно просто. Обратите внимание, что уровень упаковки, к которому принадлежит этот класс, должен быть больше или равен другим классам, чтобы гарантировать, что аннотации других классов могут быть отсканированы.
пакет com.example; import org.springframework.boot.springapplication; импорт org.springframework.boot.autoconfigure.springbootapplication; импорт org.springframework.cache.annotation.enableCaching;@SpringbootPplication@ounableCachingPublicpriceplication spressAt. void main (string [] args) {springapplication.run (SpringDataJpaExampleApplication.class, args); }}Запустить и проверить программу
Запустите основной метод или введите его в пакет JAR для запуска;
Введите следующий URL в браузере и протестируйте его:
http: // localhost: 8080/users/
http: // localhost: 8080/users/add/100/110/111
http: // localhost: 8080/users/delete/100
http: // localhost: 8080/users/2
http: // localhost: 8080/users/search/name/2
Исходный код программы
https://github.com/peterchenhdu/spring-data-jpa-example
Ссылки
http://docs.spring.io/spring-data/jpa/docs/1.11.0.release/reference/html/
http://javabeat.net/spring-data-jpa/
https://spring.io/guides/gs/caching/
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.