Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。此外,它还支持基于关系型数据库的数据服务,如Oracle RAC等。对于拥有海量数据的项目,可以用Spring Data来简化项目的开发,就如Spring Framework对JDBC、ORM的支持一样,Spring Data会让数据的访问变得更加方便。

Spring Data JPA: 可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

Spring Data是一个开源框架,在这个框架中Spring Data JPA只是这个框架中的一个模块,所以名称才叫Spring Data JPA。

Spring Data JPA的出现让你只需要编写一个接口继承一个类就能实现CRUD操作了

Spring Data 的一个核心接口为我们提供了常用的接口,在这节我们就来简单介绍下。

    Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,

    开发者需要在自己定义的接口中声明需要的方法 :

    public interface Repository<T, ID extends Serializable> { }

 

有这么几点需要强调下:

1. Repository是一个空接口,即是一个标记接口;

2. 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法。

3. 实际上也可以通过@RepositoryDefinition,注解来替代继承Repository接口。

4. 查询方法以find | read | get开头;

5. 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。[下面代码中的findByDname方法]

6.使用@Query注解可以自定义JPQL语句实现更灵活的查询。【类似与hibernate的HQL语句】

CrudRepository 接口提供了最基本的对实体类的添删改查操作

--T save(T entity);//保存单个实体   

--Iterable<T> save(Iterable<? extends T> entities);//保存集合         

--T findOne(ID id);//根据id查找实体          

--boolean exists(ID id);//根据id判断实体是否存在          

--Iterable<T> findAll();//查询所有实体,不用或慎用!          

--long count();//查询实体数量          

--void delete(ID id);//根据Id删除实体          

--void delete(T entity);//删除一个实体   

--void delete(Iterable<? extends T> entities);//删除一个实体的集合          

--void deleteAll();//删除所有实体,不用或慎用!   

 

PagingAndSortingRepository接口

该接口提供了分页与排序功能 --Iterable<T> findAll(Sort sort); //排序

--Page<T> findAll(Pageable pageable); //分页查询(含排序功能)

其他接口:

JpaRepository:查找所有实体,排序、查找所有实体,执行缓存与数据库同步

JpaSpecificationExecutor:不属于Repository体系,实现一组 JPA Criteria 查询相关的方法,封装 JPA Criteria 查询条件。通常使用匿名内部类的方式来创建该接口的对象。

自定义 Repository:可以自己定义一个MyRepository接口。

 

 

一:添加数据库驱动依赖   Spring Data JPA依赖

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>SpringBoot_001</groupId>
    <artifactId>SpringBoot_001</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBoot_001 Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <!-- 继承父包 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.7</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId><!--解决只引用spring-boot-starter-web时启动缺少JPA 
                validator的Bug -->
            <artifactId>hibernate-validator</artifactId>
            <version>5.3.0.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency><!-- fastjson依赖 -->
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency><!-- devtools依赖 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>


        <dependency><!-- oracle依赖 -->
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0.2</version>
        </dependency>
        <dependency><!-- data jpa配置信息 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

    </dependencies>
    <build>
        <finalName>SpringBoot_001</finalName>

        <plugins>
            <plugin><!-- devtools构建依赖 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- <configuration> 如果devtools不起作用,加上此项配置 <fork>true</fork> </configuration> -->
            </plugin>
        </plugins>

    </build>
</project>
View Code

 

二:在application.properties文件中   配置数据库连接配置信息以及JPA配置信息

 

########################################################
###datasource
########################################################
spring.datasource.url = jdbc:oracle:thin:@127.0.0.1:1521/orcl
spring.datasource.username = bookshop
spring.datasource.password = bookshop
spring.datasource.driverClassName = oracle.jdbc.driver.OracleDriver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
########################################################
### Java Persistence Api
########################################################
# Specify the DBMS
spring.jpa.database = ORACLE
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy  #org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.OracleDialect
View Code

 

(1) 创建实体类。

package com.mt.dog.entity;

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

import org.hibernate.annotations.GenericGenerator;

/**
 * 
 * @ClassName: Dog
 * @Description: 实体
 * @author Comsys-MoTing
 * @date 2018年10月24日 下午10:17:33
 *
 */
@Entity
public class Dog
{
    @Id
    @GeneratedValue(generator = "id")
    @GenericGenerator(name = "id", strategy = "native")
    private Long id;
    
    private String dname;
    
    private int age;
    
    public Long getId()
    {
        return id;
    }
    
    public void setId(Long id)
    {
        this.id = id;
    }
    
    public String getDname()
    {
        return dname;
    }
    
    public void setDname(String dname)
    {
        this.dname = dname;
    }
    
    public int getAge()
    {
        return age;
    }
    
    public void setAge(int age)
    {
        this.age = age;
    }
    
}
View Code

 

(2) 创建jpa repository类操作持久化(CrudRepository)。

package com.mt.dog.repository;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import com.mt.dog.entity.Dog;

/**
 * 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。
 * @ClassName: DogRepository
 * @Description: Dog的Repository层(相当于DAO层)继承CrudRepository 此处不应加注解后面可以直接使用
 * @author Comsys-MoTing
 * @date 2018年10月24日 下午10:19:58
 *
 */
public interface DogRepository extends CrudRepository<Dog, Long> {

    @Query("from Dog where dname=:nn")
    public Dog getByDname(@Param("nn") String bname);

}
View Code

 

(3) 创建service类。

package com.mt.dog.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.mt.dog.entity.Dog;
import com.mt.dog.repository.DogRepository;

/**
 * 
 * @ClassName: DogService
 * @Description:
 * @author Comsys-MoTing
 * @date 2018年10月24日 下午10:22:04
 *
 */
@Service
@Transactional
public class DogService {
    @Resource
    private DogRepository dogRepository;

    public Dog findById(Long id) {
        return dogRepository.findOne(id);
    }

    public Dog findByName(String bname) {
        return dogRepository.getByDname(bname);
    }

    public List<Dog> findAll() {
        return (List<Dog>) dogRepository.findAll();
    }

    public String deleteDog(Long id) {
        dogRepository.delete(id);
        return "delete ok";
    }

    public String saveDog() {
        Dog dog = new Dog();
        dog.setAge(45);
        dog.setDname("tt" + Math.random() * 10000);
        dogRepository.save(dog);
        return "save ok";
    }
}
View Code

 

(4) 创建restful请求类。

package com.mt.dog.controller;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.mt.dog.entity.Dog;
import com.mt.dog.service.DogService;

@RestController
public class DogController {
    @Resource
    private DogService dogService;

    @RequestMapping("/findByID")
    public Dog findById(Long id) {
        return dogService.findById(id);
    }

    @RequestMapping("/findByDname")
    public Dog findByDname(String dname) {
        return dogService.findByName(dname);
    }

    @RequestMapping("/findAll")
    public List<Dog> findAll() {
        return dogService.findAll();
    }

    @RequestMapping("/deleteDog")
    public String deleteDog(Long id) {
        dogService.deleteDog(id);
        return "delete ok";
    }

    @RequestMapping("/saveDog")
    public String saveDog() {
        dogService.saveDog();
        return "save ok";
    }
}
View Code

 

(5) 测试;