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.。