真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringDataJPA的示例分析

這篇文章將為大家詳細(xì)講解有關(guān)Spring Data JPA的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司主營(yíng)李滄網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,App定制開(kāi)發(fā),李滄h5成都小程序開(kāi)發(fā)搭建,李滄網(wǎng)站營(yíng)銷(xiāo)推廣歡迎李滄等地區(qū)企業(yè)咨詢

關(guān)于Spring Data

Spring社區(qū)的一個(gè)頂級(jí)工程,主要用于簡(jiǎn)化數(shù)據(jù)(關(guān)系型&非關(guān)系型)訪問(wèn),如果我們使用Spring Data來(lái)開(kāi)發(fā)程序的話,那么可以省去很多低級(jí)別的數(shù)據(jù)訪問(wèn)操作,如編寫(xiě)數(shù)據(jù)查詢語(yǔ)句、DAO類等,我們僅需要編寫(xiě)一些抽象接口并定義相關(guān)操作即可,Spring會(huì)在運(yùn)行期間的時(shí)候創(chuàng)建代理實(shí)例來(lái)實(shí)現(xiàn)我們接口中定義的操作。

關(guān)于Spring Data子項(xiàng)目

Spring Data擁有很多子項(xiàng)目,除了Spring Data Jpa外,還有如下子項(xiàng)目。

Spring Data Commons

Spring Data MongoDB

Spring Data redis

Spring Data Solr

Spring Data Gemfire

Spring Data REST

Spring Data Neo4j

關(guān)于Spring Data Jpa

Spring Data Jpa是Spring Data的一個(gè)子項(xiàng)目,主要用于簡(jiǎn)化數(shù)據(jù)訪問(wèn)層的實(shí)現(xiàn),使用Spring Data Jpa可以輕松實(shí)現(xiàn)增刪改查、分頁(yè)、排序等。

例子,Spring Boot + Spring Data Jpa

1、添加POM.XML文件

如下所示:



  4.0.0
  com.example
  demo
  0.0.1-SNAPSHOT
  jar
  spring-data-jpa-example
  Demo project for Spring Boot

  
    org.springframework.boot
    spring-boot-starter-parent
    1.4.4.RELEASE
     
  

  
    UTF-8
    UTF-8
    1.7
  

  
    
      org.springframework.boot
      spring-boot-starter-data-jpa
    
    
      org.springframework.boot
      spring-boot-starter-web
    

    
      org.springframework.boot
      spring-boot-starter-test
      test
    

    
      MySQL
      mysql-connector-java
    

    
      org.springframework.boot
      spring-boot-starter-cache
    
  

  
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
    
  

其中,spring-boot-starter-parent會(huì)加載Spring Boot應(yīng)用所需的所有默認(rèn)配置;

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

添加spring-boot-starter-web是因?yàn)槲覀兊墓こ淌且粋€(gè)Web應(yīng)用;

另外我們的數(shù)據(jù)庫(kù)是mysql,所以還需要mysql-connector-java依賴;

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

2、編寫(xiě)實(shí)體類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注解,大致意思就是讓我們?cè)赗epository接口中定義的findByName方法不使用默認(rèn)的查詢實(shí)現(xiàn),取而代之的是使用這條自定義的查詢語(yǔ)句去查詢,如果這里沒(méi)有標(biāo)注的話,會(huì)使用默認(rèn)實(shí)現(xiàn)的。

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 {

}

這里的UserJpaRepository接口實(shí)現(xiàn)了JpaRepository接口;

實(shí)際上JpaRepository實(shí)現(xiàn)了PagingAndSortingRepository接口,PagingAndSortingRepository接口實(shí)現(xiàn)了CrudRepository接口,CrudRepository接口實(shí)現(xiàn)了Repository接口;

簡(jiǎn)單說(shuō)明下:

Repository接口是一個(gè)標(biāo)識(shí)接口,里面是空的;

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
{

  List findByNameAndAddress(String name, String address);

  @Query(value = "from User u where u.name=:name")
  List findByName1(@Param("name") String name);

  @Query(value = "select * from #{#entityName} u where u.name=?1", nativeQuery = true)
  List findByName2(String name);

  List findByName(String name);
}

這里的UserRepository接口主要定義了一些查詢方法;

比如這里的findByNameAndAddress和findByName方法,我們是不需要額外定義其它查詢語(yǔ)句就可以直接執(zhí)行的,Spring Data Jpa會(huì)根據(jù)實(shí)體類的屬性名字以及方法名自動(dòng)實(shí)現(xiàn)該方法;PS:由于我們?cè)趯?shí)體類中聲明了@NamedQuery注解,實(shí)際上findByName方法會(huì)使用@NamedQuery注解標(biāo)注的查詢語(yǔ)句去查詢;

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

findByName2方法使用了原始的sql語(yǔ)句查詢;

4、編寫(xiě)Service

service接口:

package com.example.service;

import java.util.List;

import com.example.domain.User;

public interface IUserService
{
  public List findAll();

  public void saveUser(User book);
  
  public User findOne(long id);

  public void delete(long id);

  public List findByName(String name);

}

接口實(shí)現(xiàn)類:

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 findAll()
  {
    return userJpaRepository.findAll();
  }

  public List findByName(String name)
  {
    List userList1 = userRepository.findByName1(name);
    List userList2 = userRepository.findByName2(name);
    List 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ō)的,調(diào)用Repository接口接口的方法即可。

5、編寫(xiě)Controller

Controller也沒(méi)啥好說(shuō)的,調(diào)用Service即可,注意下這里的Controller使用@RestController注解來(lái)標(biāo)注,另外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 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 getBookByName(@PathVariable String name)
  {
    List 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ì)自動(dòng)提示的,省的去查找。

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

7、編寫(xiě)啟動(dòng)類

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

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);
  }
}

運(yùn)行、測(cè)試程序

啟動(dòng)main方法,或打成jar包運(yùn)行;

瀏覽器輸入以下URL,測(cè)試即可:

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

關(guān)于“Spring Data JPA的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


文章題目:SpringDataJPA的示例分析
標(biāo)題鏈接:http://weahome.cn/article/jgcicc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部