在Spring Data REST中访问MySQL

首先

使用Spring Data REST,创建最简单的REST API来访问MySQL。

请参考

使用REST访问JPA数据。请参阅https://spring.io/guides/gs/accessing-data-rest/。

The prerequisite condition.

前提是在下面的文章之后的状态下,
尝试使用Spring Boot和AngularUI UI-Router。

能够使用MySQL

环境

JVM: 1.8.0_45 (Oracle Corporation 25.45-b02)
操作系统: Mac OS X 10.11.3 x86_64
MySQL: 服务器版本: 5.5.28 源代码发行版

春季工具套件

版本: 3.7.3.RELEASE
构建编号: 201602250940
平台: Eclipse Mars.2 (4.5.2)
(从此处安装 https://spring.io/tools/sts/all)

Buildship:Gradle 的 Eclipse 插件 1.0.13.v20160411-1723 (通过 Help -> Eclipse marketplace 安装)

操作过程

添加一个依赖库

为了使用Spring Data JPA、Spring Data REST和MySQL Connector/J,我们将把它们作为构建脚本的依赖项,并添加// Add。

dependencies {
    compile 'org.webjars:jquery:2.2.3'
    compile 'org.webjars:angularjs:1.5.3'
    compile 'org.webjars:angular-ui-router:0.2.18'
    compile 'org.webjars:bootstrap:3.3.6'

    // Add
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    // Add
    compile('org.springframework.boot:spring-boot-starter-data-rest')
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')

    // Add
    compile('mysql:mysql-connector-java')
}

为了反映附加信息,您可以在Package Explorer中选择SSP37(项目根目录),然后右键单击,
点击Gradle -> Refresh Gradle Project。
请检查Package Explorer中的Project and External Dependencies,确认是否存在添加的Jar文件。

请参阅

Spring IO平台参考指南
附录A. 依赖版本
http://docs.spring.io/platform/docs/2.0.3.RELEASE/reference/htmlsingle/#appendix
WebJars http://www.webjars.org/

设定

在使用JPA和MySQL时,将进行必要的最小配置。

spring.data.rest.basePath=/api
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database=MYSQL
spring.jpa.hibernate.ddl-auto=update

spring.data.rest.basePath 可以用以下方式进行表达:

春季数据.休息.基础路径

这是关于 REST API 的根路径设置。我认为改变它会更容易理解,所以我决定改变它。

请参考

Spring Data REST – 参考文档
4.6.1. 更改基本URI
http://docs.spring.io/spring-data/rest/docs/2.4.4.RELEASE/reference/html/#getting-started.basic-settings

spring.datasource.*:春天的数据源。

请根据您自己的环境指定值,这是连接到MySQL的连接字符串。请指定具有能够执行表创建、列修改和删除等操作权限的MySQL用户,因为Hibernate可以自动执行这些操作。

请参考

Spring Boot参考指南
29.1.2 连接到生产数据库
https://docs.spring.io/spring-boot/docs/1.3.3.RELEASE/reference/htmlsingle/#boot-features-connect-to-production-database

spring.jpa.database=MYSQL
春季.jpa.database=MYSQL

指示自动生成的SQL和DDL以适用于MySQL。

spring.jpa.hibernate.ddl-auto=update
春季.jpa.hibernate.ddl-auto=更新

创建一个成为Entity的类,它会自动创建表格并处理项目的更改。

请提供以下句子的原文。

Please provide the original sentence for reference.

《Spring Boot参考指南》
73.5 配置JPA属性
https://docs.spring.io/spring-boot/docs/1.3.3.RELEASE/reference/htmlsingle/#howto-configure-jpa-properties

《Spring Boot参考指南》中的第73.5节介绍了如何配置JPA属性。点击链接https://docs.spring.io/spring-boot/docs/1.3.3.RELEASE/reference/htmlsingle/#howto-configure-jpa-properties以查看详细信息。

《Hibernate参考文档》第3.4节 可选配置属性
表3.7 杂项属性

当SessionFactory被创建时,自动验证或导出模式DDL到数据库。使用create-drop选项,当SessionFactory被明确关闭时,数据库模式将被删除。例如,validate | update | create | create-drop。

创建实体

我试着创建了一个简单的实体。
这个实体叫做”单词(word)”,它有一个拼写(spelling)和一个喜好(favorite)的属性。

package com.example.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Word {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false)
    private String spelling;

    @Column(nullable = false)
    private Boolean favorite;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getSpelling() {
        return spelling;
    }

    public void setSpelling(String spelling) {
        this.spelling = spelling;
    }

    public Boolean getFavorite() {
        return favorite;
    }

    public void setFavorite(Boolean favorite) {
        this.favorite = favorite;
    }
}

创建存储库

我們將創建一個操作剛才的Word的存儲庫。
Spring Data REST會自動公開這樣的存儲庫,使我們能夠使用CRUD操作來操控實體對應的API。

package com.example.domain;

import java.util.List;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;

public interface WordRepository extends PagingAndSortingRepository<Word, Long> {

    List<Word> findBySpellingLikeOrderBySpellingAsc(@Param("spelling") String spelling);

}

尝试使用API

那么让我们使用cURL来试试用API。
首先启动Web应用程序。
Spring Data REST公开的API路径将由设置的API根路径和创建实体的Repository的名称,全部小写、加上复数形式的”s”,并连接在一起。
本次设置的API根路径为/api,并且实例的名称是words,所以路径名称为/api/words。
我们使用curl访问该路径。

$ curl http://localhost:8080/api/words

有以下这样的回应。

{
  "_embedded" : {
    "words" : [ ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/api/words"
    },
    "profile" : {
      "href" : "http://localhost:8080/api/profile/words"
    },
    "search" : {
      "href" : "http://localhost:8080/api/words/search"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 0,
    "totalPages" : 0,
    "number" : 0
  }
}

暂时先尝试注册一条记录。

在d中指定的JSON部分中,除了id外,指定了实体的所有项目,并将其通过先前的路径进行POST,即可实现注册。

$ curl -X POST -H "Content-Type:application/json" -d '{ "spelling": "APPLE", "favorite": true }' http://localhost:8080/api/words

看起来已经可以在id=13上注册了。 由于环境的不同,13可能会有所变化,请进行转译。

{
  "spelling" : "APPLE",
  "favorite" : true,
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/api/words/13"
    },
    "word" : {
      "href" : "http://localhost:8080/api/words/13"
    }
  }
}

让我们再次获取该记录。将id连接到路径上,就可以访问该记录了。

$ curl http://localhost:8080/api/words/13
{
  "spelling" : "APPLE",
  "favorite" : true,
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/api/words/13"
    },
    "word" : {
      "href" : "http://localhost:8080/api/words/13"
    }
  }
}

我将尝试更新记录。

在JSON的“d”部分指定了除了id之外的实体的所有项目,通过指定id的路径进行PUT操作可以进行更新。
在此例中,我们将APPLE更新为apple。

$ curl -X PUT -H "Content-Type:application/json" -d '{ "spelling": "apple", "favorite": false }' http://localhost:8080/api/words/13
{
  "spelling" : "apple",
  "favorite" : false,
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/api/words/13"
    },
    "word" : {
      "href" : "http://localhost:8080/api/words/13"
    }
  }
}

我尝试删除记录。

当您将id连接到路径中并发送DELETE请求时,数据将被删除。

$ curl -X DELETE http://localhost:8080/api/words/13

我会尝试搜索一下。

为了进行初步的搜索,我将注册3个记录。

curl -X POST -H "Content-Type:application/json" -d '{ "spelling": "apple", "favorite": true }' http://localhost:8080/api/words
curl -X POST -H "Content-Type:application/json" -d '{ "spelling": "apricot", "favorite": true }' http://localhost:8080/api/words
curl -X POST -H "Content-Type:application/json" -d '{ "spelling": "pineapple", "favorite": false }' http://localhost:8080/api/words

我会尝试搜索。
搜索路径是将搜索方法名连接到 Repository 中。
搜索关键词会连接到查询字符串中。
SQL 的 Like 条件中的通配符字符%会被编码为%25进行指定。
这样就可以搜索以apple结尾且拼写正确的记录了。

$ curl http://localhost:8080/api/words/search/findBySpellingLikeOrderBySpellingAsc?spelling=%25apple
{
  "_embedded" : {
    "words" : [ {
      "spelling" : "apple",
      "favorite" : true,
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/api/words/14"
        },
        "word" : {
          "href" : "http://localhost:8080/api/words/14"
        }
      }
    }, {
      "spelling" : "pineapple",
      "favorite" : false,
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/api/words/16"
        },
        "word" : {
          "href" : "http://localhost:8080/api/words/16"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/api/words/search/findBySpellingLikeOrderBySpellingAsc?spelling=%25apple"
    }
  }
}

请参考

样例仓库
https://github.com/quwahara/SSP37/tree/600-rest

广告
将在 10 秒后关闭
bannerAds