激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring Data JPA例子代碼[基于Spring Boot、Mysql]

Spring Data JPA例子代碼[基于Spring Boot、Mysql]

2021-04-19 14:05風一樣的碼農 Java教程

這篇文章主要介紹了Spring Data JPA例子代碼[基于Spring Boot、Mysql],小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

關于Spring Data

Spring社區的一個頂級工程,主要用于簡化數據(關系型&非關系型)訪問,如果我們使用Spring Data來開發程序的話,那么可以省去很多低級別的數據訪問操作,如編寫數據查詢語句、DAO類等,我們僅需要編寫一些抽象接口并定義相關操作即可,Spring會在運行期間的時候創建代理實例來實現我們接口中定義的操作。

關于Spring Data子項目

Spring Data擁有很多子項目,除了Spring Data Jpa外,還有如下子項目。

Spring Data Commons

Spring Data MongoDB

Spring Data Redis

Spring Data Solr

Spring Data Gemfire

Spring Data REST

Spring Data Neo4j

關于Spring Data Jpa

Spring Data Jpa是Spring Data的一個子項目,主要用于簡化數據訪問層的實現,使用Spring Data Jpa可以輕松實現增刪改查、分頁、排序等。

例子,Spring Boot + Spring Data Jpa

1、添加POM.XML文件

如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?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>mysql</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會加載Spring Boot應用所需的所有默認配置;

spring-boot-starter-data-jpa會下載所有Spring Data Jpa所需的依賴;

添加spring-boot-starter-web是因為我們的工程是一個Web應用;

另外我們的數據庫是mysql,所以還需要mysql-connector-java依賴;

由于使用了緩存,所以再添加一個spring-boot-starter-cache依賴;

2、編寫實體類User

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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;
  }
}

其它沒啥好說的,注意下這里的@NamedQuery注解,大致意思就是讓我們在Repository接口中定義的findByName方法不使用默認的查詢實現,取而代之的是使用這條自定義的查詢語句去查詢,如果這里沒有標注的話,會使用默認實現的。

3、編寫Repository接口

這里將編寫兩個Repository接口,僅僅用于示例,實際中可以合并成一個:

UserJpaRepository

?
1
2
3
4
5
6
7
8
9
10
package com.example.repository;
 
import org.springframework.data.jpa.repository.JpaRepository;
 
import com.example.domain.User;
 
 
public interface UserJpaRepository extends JpaRepository<User,Long> {
 
}

這里的UserJpaRepository接口實現了JpaRepository接口;

實際上JpaRepository實現了PagingAndSortingRepository接口,PagingAndSortingRepository接口實現了CrudRepository接口,CrudRepository接口實現了Repository接口;

簡單說明下:

Repository接口是一個標識接口,里面是空的;

CrudRepository接口定義了增刪改查方法;

PagingAndSortingRepository接口用于分頁和排序;

由于JpaRepository接口繼承了以上所有接口,所以擁有它們聲明的所有方法;

另外注意下,以findAll方法為例,JpaRepository接口返回的是List, PagingAndSortingRepository和CrudRepository返回的是迭代器;

UserRepository

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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接口主要定義了一些查詢方法;

比如這里的findByNameAndAddress和findByName方法,我們是不需要額外定義其它查詢語句就可以直接執行的,Spring Data Jpa會根據實體類的屬性名字以及方法名自動實現該方法;PS:由于我們在實體類中聲明了@NamedQuery注解,實際上findByName方法會使用@NamedQuery注解標注的查詢語句去查詢;

另外這里的findByName1方法使用了HQL語句查詢;

findByName2方法使用了原始的sql語句查詢;

4、編寫Service

service接口:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
 
}

接口實現類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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);
  }
}

這個沒啥好說的,調用Repository接口接口的方法即可。

5、編寫Controller

Controller也沒啥好說的,調用Service即可,注意下這里的Controller使用@RestController注解來標注,另外URL路徑命名按照RESTful風格來命名;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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文件中添加如下配置:

?
1
2
3
4
5
6
7
8
9
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的話,這些屬性配置都會自動提示的,省的去查找。

想查看spring.datasource的配置,可以參考這個類:DataSourceProperties.java

7、編寫啟動類

比較簡單,注意下該類所屬的包級別要大于或等于其它類,以保證其它類的注解可以被掃描到。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
  }
}

運行、測試程序

啟動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

程序源碼

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/

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/chenpi/p/6357527.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色猫av | 在线播放av片| 中文字幕h | 国产一区视频在线观看免费 | 黄色电影免费网址 | 他也色在线视频 | 亚州欧美在线 | 337p粉嫩大胆噜噜噜亚瑟影院 | 在线免费av观看 | 日本特级a一片免费观看 | 黄在线观看 | 成年人免费高清视频 | 免费观看三级毛片 | 97久久精品一区二区三区观看 | 国产精品成人久久 | 欧美在线 | 亚洲 | 成人久久18免费 | 国产日韩一区二区三区在线观看 | 国产欧美日韩在线不卡第一页 | 国产毛片视频在线 | 特级毛片a级毛片100免费 | 牛牛热这里只有精品 | 久久精品超碰 | 免费看一级毛片欧美 | 精品国产一区二区三区在线观看 | 被摁着灌浓精囚禁高h1v1 | 国产亚洲精品久久 | 成人在线第一页 | 亚洲人成网站免费播放 | 看免费的毛片 | 精选久久 | 久久97视频| 国产一级毛片高清视频 | 久久夜夜视频 | 黄色影院网站 | 久久国产精品小视频 | 一级黄色片在线看 | 在线成人免费网站 | 国产五区 | 国产一区在线免费 | 欧美日日操 |