欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年04月03日 10:11:34   作者:風(fēng)一樣的碼農(nóng)  
這篇文章主要介紹了Spring Data JPA例子代碼[基于Spring Boot、Mysql],小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

關(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)操作,如編寫數(shù)據(jù)查詢語(yǔ)句、DAO類等,我們僅需要編寫一些抽象接口并定義相關(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文件

如下所示:

<?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會(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、編寫實(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、編寫Repository接口

這里將編寫兩個(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í)現(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<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方法,我們是不需要額外定義其它查詢語(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、編寫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í)現(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<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ō)的,調(diào)用Repository接口接口的方法即可。

5、編寫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<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ì)自動(dòng)提示的,省的去查找。

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

7、編寫啟動(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

程序源碼

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/

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • idea中使用maven?archetype新建項(xiàng)目時(shí)卡住問(wèn)題解決方案

    idea中使用maven?archetype新建項(xiàng)目時(shí)卡住問(wèn)題解決方案

    這篇文章主要介紹了idea中使用maven?archetype新建項(xiàng)目時(shí)卡住,解決本問(wèn)題的方法,就是在maven的runner加上參數(shù)-DarchetypeCatalog=local就可以了,不需要下載xml文件再放到指定目錄,需要的朋友可以參考下
    2023-08-08
  • Java調(diào)用第三方http接口的常用方式總結(jié)

    Java調(diào)用第三方http接口的常用方式總結(jié)

    這篇文章主要介紹了Java調(diào)用第三方http接口的常用方式總結(jié),具有很好的參考價(jià)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Eclipse+Java+Swing實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)的實(shí)例代碼

    Eclipse+Java+Swing實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)的實(shí)例代碼

    這篇文章主要介紹了Eclipse+Java+Swing實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • SpringLDAP連接LDAPS證書(shū)報(bào)錯(cuò)問(wèn)題及解決

    SpringLDAP連接LDAPS證書(shū)報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了SpringLDAP連接LDAPS證書(shū)報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 詳解SpringMVC組件之HandlerMapping(二)

    詳解SpringMVC組件之HandlerMapping(二)

    這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(二),HandlerMapping組件是Spring?MVC核心組件,用來(lái)根據(jù)請(qǐng)求的request查找對(duì)應(yīng)的Handler,在Spring?MVC中,有各式各樣的Web請(qǐng)求,每個(gè)請(qǐng)求都需要一個(gè)對(duì)應(yīng)的Handler來(lái)處理,需要的朋友可以參考下
    2023-08-08
  • 布隆過(guò)濾器(Bloom Filter)的Java實(shí)現(xiàn)方法

    布隆過(guò)濾器(Bloom Filter)的Java實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇布隆過(guò)濾器(Bloom Filter)的Java實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • 提高開(kāi)發(fā)效率Live?Templates使用技巧詳解

    提高開(kāi)發(fā)效率Live?Templates使用技巧詳解

    這篇文章主要為大家介紹了提高開(kāi)發(fā)效率Live?Templates使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 基于微信簽名signature獲取(實(shí)例講解)

    基于微信簽名signature獲取(實(shí)例講解)

    下面就為大家?guī)?lái)一篇基于微信簽名signature獲取(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • JDK、J2EE、J2SE、J2ME四個(gè)易混淆概念區(qū)分

    JDK、J2EE、J2SE、J2ME四個(gè)易混淆概念區(qū)分

    這篇文章將向你詳細(xì)介紹JDK、J2EE、J2SE、J2ME的概念以及他們的關(guān)系區(qū)別。
    2015-09-09
  • eclipse修改maven倉(cāng)庫(kù)位置的方法實(shí)現(xiàn)

    eclipse修改maven倉(cāng)庫(kù)位置的方法實(shí)現(xiàn)

    本文主要介紹了eclipse修改maven倉(cāng)庫(kù)位置的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論