- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Spring Data JPA的示例分析
這篇文章將為大家詳細講解有關(guān)Spring Data JPA的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
關(guān)于Spring Data
Spring社區的一個(gè)頂級工程,主要用于簡(jiǎn)化數據(關(guān)系型&非關(guān)系型)訪(fǎng)問(wèn),如果我們使用Spring Data來(lái)開(kāi)發(fā)程序的話(huà),那么可以省去很多低級別的數據訪(fǎng)問(wèn)操作,如編寫(xiě)數據查詢(xún)語(yǔ)句、DAO類(lèi)等,我們僅需要編寫(xiě)一些抽象接口并定義相關(guān)操作即可,Spring會(huì )在運行期間的時(shí)候創(chuàng )建代理實(shí)例來(lái)實(shí)現我們接口中定義的操作。
關(guān)于Spring Data子項目
Spring Data擁有很多子項目,除了Spring Data Jpa外,還有如下子項目。
Spring Data Commons
Spring Data
Spring Data
Spring Data Solr
Spring Data Gemfire
Spring Data REST
Spring Data Neo4j
關(guān)于Spring Data Jpa
Spring Data Jpa是Spring Data的一個(gè)子項目,主要用于簡(jiǎn)化數據訪(fǎng)問(wèn)層的實(shí)現,使用Spring Data Jpa可以輕松實(shí)現增刪改查、分頁(yè)、排序等。
例子,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"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demo</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> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId></groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
其中,spring-boot-starter-parent會(huì )加載Spring Boot應用所需的所有默認配置;
spring-boot-starter-data-jpa會(huì )下載所有Spring Data Jpa所需的依賴(lài);
添加spring-boot-starter-web是因為我們的工程是一個(gè)Web應用;
另外我們的數據庫是mysql,所以還需要mysql-connector-java依賴(lài);
由于使用了緩存,所以再添加一個(gè)spring-boot-starter-cache依賴(lài);
2、編寫(xiě)實(shí)體類(lèi)User
package com.example.domain; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.NamedQuery; @Entity @NamedQuery(name = "User.findByName", query = "select name,address from User u where u.name=?1") public class User implements Serializable { private static final long serialVersionUID = 1L; @Id long id; @Column(name = "name") String name; @Column(name = "address") String 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 address; } public void setAddress(String address) { this.address = address; } }
其它沒(méi)啥好說(shuō)的,注意下這里的@NamedQuery注解,大致意思就是讓我們在Repository接口中定義的findByName方法不使用默認的查詢(xún)實(shí)現,取而代之的是使用這條自定義的查詢(xún)語(yǔ)句去查詢(xún),如果這里沒(méi)有標注的話(huà),會(huì )使用默認實(shí)現的。
3、編寫(xiě)Repository接口
這里將編寫(xiě)兩個(gè)Repository接口,僅僅用于示例,實(shí)際中可以合并成一個(gè):
UserJpaRepository
package com.example.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.example.domain.User; public interface UserJpaRepository extends JpaRepository<User,Long> { }
這里的UserJpaRepository接口實(shí)現了JpaRepository接口;
實(shí)際上JpaRepository實(shí)現了PagingAndSortingRepository接口,PagingAndSortingRepository接口實(shí)現了CrudRepository接口,CrudRepository接口實(shí)現了Repository接口;
簡(jiǎn)單說(shuō)明下:
Repository接口是一個(gè)標識接口,里面是空的;
CrudRepository接口定義了增刪改查方法;
PagingAndSortingRepository接口用于分頁(yè)和排序;
由于JpaRepository接口繼承了以上所有接口,所以擁有它們聲明的所有方法;
另外注意下,以findAll方法為例,JpaRepository接口返回的是List, PagingAndSortingRepository和CrudRepository返回的是迭代器;
UserRepository
package com.example.repository; import java.util.List; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import org.springframework.data.repository.query.Param; import com.example.domain.User; public interface UserRepository extends Repository<User, Long> { List<User> findByNameAndAddress(String name, String address); @Query(value = "from User u where u.name=:name") List<User> findByName1(@Param("name") String name); @Query(value = "select * from #{#entityName} u where u.name=?1", nativeQuery = true) List<User> findByName2(String name); List<User> findByName(String name); }
這里的UserRepository接口主要定義了一些查詢(xún)方法;
比如這里的findByNameAndAddress和findByName方法,我們是不需要額外定義其它查詢(xún)語(yǔ)句就可以直接執行的,Spring Data Jpa會(huì )根據實(shí)體類(lèi)的屬性名字以及方法名自動(dòng)實(shí)現該方法;PS:由于我們在實(shí)體類(lèi)中聲明了@NamedQuery注解,實(shí)際上findByName方法會(huì )使用@NamedQuery注解標注的查詢(xún)語(yǔ)句去查詢(xún);
另外這里的findByName1方法使用了HQL語(yǔ)句查詢(xún);
findByName2方法使用了原始的sql語(yǔ)句查詢(xún);
4、編寫(xiě)Service
service接口:
package com.example.service; import java.util.List; import com.example.domain.User; public interface IUserService { public List<User> findAll(); public void saveUser(User book); public User findOne(long id); public void delete(long id); public List<User> findByName(String name); }
接口實(shí)現類(lèi):
package com.example.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.domain.User; import com.example.repository.UserRepository; import com.example.repository.UserJpaRepository; import com.example.service.IUserService; @Service @Transactional public class UserServiceImpl implements IUserService { @Autowired private UserJpaRepository userJpaRepository; @Autowired private UserRepository userRepository; public List<User> findAll() { return userJpaRepository.findAll(); } public List<User> findByName(String name) { List<User> userList1 = userRepository.findByName1(name); List<User> userList2 = userRepository.findByName2(name); List<User> userList3 = userRepository.findByNameAndAddress(name, "3"); System.out.println("userList1:" + userList1); System.out.println("userList2:" + userList2); System.out.println("userList3:" + userList3); return userRepository.findByName(name); } public void saveUser(User book) { userJpaRepository.save(book); } @Cacheable("users") public User findOne(long id) { System.out.println("Cached Pages"); return userJpaRepository.findOne(id); } public void delete(long id) { userJpaRepository.delete(id); } }
這個(gè)沒(méi)啥好說(shuō)的,調用Repository接口接口的方法即可。
5、編寫(xiě)Controller
Controller也沒(méi)啥好說(shuō)的,調用Service即可,注意下這里的Controller使用@RestController注解來(lái)標注,另外URL路徑命名按照RESTful風(fēng)格來(lái)命名;
package com.example.web; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.example.domain.User; import com.example.service.IUserService; @RestController @RequestMapping(value = "/users") public class UserController { @Autowired private IUserService userService; @RequestMapping(value = "/add/{id}/{name}/{address}") public User addUser(@PathVariable int id, @PathVariable String name, @PathVariable String address) { User user = new User(); user.setId(id); user.setName(name); user.setAddress(address); userService.saveUser(user); return user; } @RequestMapping(value = "/delete/{id}") public void deleteBook(@PathVariable int id) { userService.delete(id); } @RequestMapping(value = "/") public List<User> getBooks() { return userService.findAll(); } @RequestMapping(value = "/{id}") public User getUser(@PathVariable int id) { User user = userService.findOne(id); return user; } @RequestMapping(value = "/search/name/{name}") public List<User> getBookByName(@PathVariable String name) { List<User> users = userService.findByName(name); return users; } }
6、配置datasource
在application.properties文件中添加如下配置:
spring.jpa.show-sql = true logging.level.org.springframework.data=DEBUG spring.jpa.hibernate.ddl-auto= spring.datasource.url=jdbc:mysql://localhost:3306/demo spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
如果你使用STS IDE的話(huà),這些屬性配置都會(huì )自動(dòng)提示的,省的去查找。
想查看spring.datasource的配置,可以參考這個(gè)類(lèi):DataSourceProperties.java
7、編寫(xiě)啟動(dòng)類(lèi)
比較簡(jiǎn)單,注意下該類(lèi)所屬的包級別要大于或等于其它類(lèi),以保證其它類(lèi)的注解可以被掃描到。
package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; @SpringBootApplication @EnableCaching public class SpringDataJpaExampleApplication { public static void main(String[] args) { SpringApplication.run(SpringDataJpaExampleApplication.class, args); } }
運行、測試程序
啟動(dòng)main方法,或打成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
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站