国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Spring Data JPA的示例分析

發(fā)布時(shí)間:2021-07-27 11:45 來(lái)源:億速云 閱讀:0 作者:小新 欄目: 編程語(yǔ)言 歡迎投稿:712375056

這篇文章將為大家詳細講解有關(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í)歡迎投稿傳遞力量。

中文无码乱人伦中文视频在线| 美女黄网站人色视频免费国产| 国产综合久久久久久鬼色| JAPANESEHD熟女熟妇伦| 永久免费Av无码不卡在线观看 | 无码囯产精品一区二区免费|