Spring专题

Spring Data是什么?

  DAO是标准的持久方法 - 所有的访问是通过数据访问对象(DAO)完成。这完全将与持久性机制的具体细节与系统的其余部分隔离。听起来很容易,但任何曾经做过一个不是很简单项目的人都大伤脑筋,因为 DAO代码很无聊,它有很多非常相似的代码,稍微有轻微错误可能会造成大的错误。更糟糕的是它违反了不要重复自己(DRY)的原则,因为大部分的信息在JPA注解实现。

  什么是Java世界的终极DRY实现?其实很简单 - 就是一个接口。给定一个接口和一个模板,我们可以使用CGLIB在应用程序启动时生成必要的类。虽然有轻微的性能损失,但相比它的好处还是值得的。

  比如有一个实体Student:

@Entity
public class Student {
    private Integer id;
    private String uuid;
    private String name;
    private String emailAddress;
    private Integer creditHours;

    @Id
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    @Column(unique=true)
    public String getUuid() { return uuid; }
    public void setUuid(String uuid) { this.uuid = uuid; }

    @Column
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    @Column(unique=true)
    public String getEmailAddress() { return emailAddress; }
    public void setEmailAddress(String emailAddress) { this.emailAddress; }

    @Column
    public Integer getCreditHours() { return creditHours; }
    public void setCreditHours(Integer creditHours) { this.creditHours = creditHours; }
}

它的接口如下:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface StudentRepository extends CrudRepository<Student, Integer> {
    // this could also be getByUuid() or fetchByUuid() - all are recognized
    Student findStudentByUuid(String uuid);

    Student findStudentByEmailAddress(String emailAddress);

    List<Student> findStudentsByNameLike(String pattern);

    // we can use a custom query可以使用定制优化的查询
    @Query("select s from Student s where s.creditHours < 15")
    List<Student> findFreshmen();
}

除了find以外,还可以使用以下谓语:

  • And
  • Or
  • Between
  • LessThan
  • GreaterThan
  • IsNull
  • IsNotNull
  • NotNull
  • Like
  • NotLike
  • OrderBy
  • Not
  • In
  • NotIn
  • IgnoreCase

注意的是,不必要我们实现这个接口,CGLIB会自动产生实现类。 我们直接使用就可以了。

public interface StudentExtras {
   Student flogStudent(Student student);
}

@Repository
public interface StudentRepository extends CrudRepository<Student, Integer>, <em>StudentExtras</em> { }

// 这个类并没有实现 StudentRepository!
public class StudentRepositoryImpl implements StudentExtras {
    public Student flogStudent(Student student) { ... }
}

Spring Data还透明支持NoSQL数据库: MongoDB (documents), Neo4j (graph), Redis (key-value), Hadoop (map-reduce) 和 GemFire.

Spring Data 还支持分页,通过继承PagingAndSortingRepository接口,不是继承CrudRepository interface.。

 #SpringData  

Spring各种源码项目下载