引入:

Spring Data是SpringSource基金会下的一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。对于拥有海量数据的项目,可以用Spring Data来简化项目的开发。

然而针对不同的数据储存访问使用相对的类库来操作访问。Spring Data中已经为我们提供了很多业务中常用的一些接口和实现类来帮我们快速构建项目,比如分页、排序、DAO一些常用的操作。

今天主要是对Spring Data下的JPA模块进行讲解。

为什么说Spring Data能帮助我们快速构建项目呢,因为Spring Data已经在数据库访问层上帮我们实现了公用功能了,而我们只需写一个接口去继承Spring Data提供给我们接口,便可实现对数据库的访问及操作,类似于spring-orm的TemplateDAO。

----------------------------------------------邪恶的分割线------------------------------------------------------------------------------ 
核心接口:

下面来看一下Repository的最顶层接口:

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

这个接口只是一个空的接口,目的是为了统一所有Repository的类型,其接口类型使用了泛型,泛型参数中T代表实体类型,ID则是实体中id的类型。

再来看一下Repository的直接子接口CrudRepository中的方法:

  1. public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
  2. <S extends T> S save(S entity);
  3. <S extends T> Iterable<S> save(Iterable<S> entities);
  4. T findOne(ID id);
  5. boolean exists(ID id);
  6. Iterable<T> findAll();
  7. Iterable<T> findAll(Iterable<ID> ids);
  8. long count();
  9. void delete(ID id);
  10. void delete(T entity);
  11. void delete(Iterable<? extends T> entities);
  12. void deleteAll();
  13. }

此接口中的方法大多是我们在访问数据库中常用的一些方法,如果我们要写自己的DAO类的时候,只需定义个接口来集成它便可使用了。

再来看看Spring Data未我们提供分页和排序的Repository的接口PagingAndSortingRepository:

  1. public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
  2. Iterable<T> findAll(Sort sort);
  3. Page<T> findAll(Pageable pageable);
  4. }

这些Repository都是spring-data-commons提供给我们的核心接口,spring-data-commons是Spring Data的核心包。这个接口中为我们提供了数据的分页方法,以及排序方法。看吧,spring-data让我们省了很多心了,一切都按照这个规范进行构造,就连业务系统中常用到的一些操作都为我们考虑到了,而我们只需更用心的去关注业务逻辑层。spring-data将repository的颗粒度划得很细,其实我觉得spring的框架中将每个类的颗粒度都划得很细,这主要也是为了责任分离。

----------------------------------------------邪恶的分割线------------------------------------------------------------------------------ 
JPA实现: 
针对spring-data-jpa又提供了一系列repository接口,其中有JpaRepository和JpaSpecificationExecutor,这2个接口又有什么区别呢,我们分别来看看这2个接口的源码。

JpaRepository.class

  1. public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
  2. List<T> findAll();
  3. List<T> findAll(Sort sort);
  4. <S extends T> List<S> save(Iterable<S> entities);
  5. void flush();
  6. T saveAndFlush(T entity);
  7. void deleteInBatch(Iterable<T> entities);
  8. void deleteAllInBatch();

这个类继承自PagingAndSortingRepository,看其中的方法,可以看出里面的方法都是一些简单的操作,并未涉及到复杂的逻辑。当你在处理一些简单的数据逻辑时,便可继承此接口,看一个小例子吧。本文JPA供应者选择的是Hibernate EntityManager,当然读者们也可以选择其他的JPA供应者,比如EclipseLink、OpenJPA,反正JPA是个标准,在无须修改的情况下便可移植。

先定义一用户实体类User.class:

  1. @Entity
  2. @Table( name = "spring_data_user" )
  3. @PrimaryKeyJoinColumn( name = "id" )
  4. public class User extends IdGenerator{
  5. private static final long serialVersionUID = 1L;
  6. private String name;
  7. private String username;
  8. private String password;
  9. private String sex;
  10. private Date birth;
  11. private String address;
  12. private String zip;
  13. //省略getter和setter
  14. }

Id生成策略是采用的表生成策略,这里就不贴代码了,spring的配置文件我也就不贴出来了,反正就那些东西,网上一查,遍地都是。后续我会在将demo附上来。

实体类是有了,现在得写一个持久层,这样才能操作数据库啊,现在我们来看一下持久层。IUserDao.class:

  1. @Repository("userDao")
  2. public interface IUserDao extends JpaRepository<User, Long>{}

再在spring的配置文件中加上以下代码。

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:jpa="http://www.springframework.org/schema/data/jpa"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/data/jpa
  6. http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
  7. <jpa:repositories base-package="org.tea.springdata.**.dao" />
  8. </beans>

加上这段后Spring就会将指定包中@Repository的类注册为bean,将bean托管给Spring。这样定义完了就OK了!哦,就这样就可以操作数据库了? 
是的,前面我就已经说了,Spring data已经帮我们写好一个实现类了,而简单的操作我们只须这样继承JpaRepository就可以做CRUD操作了。再写个业务类来测试一把吧。由于我用的Cglib来动态代理,所以就不定义接口了,直接定义类UserService.class:

  1. @Service("userService")
  2. public class UserService {
  3. @Autowired
  4. private IUserDao dao;
  5. public void save(User user) {
  6. dao.save(user);
  7. }
  8. public void delete(Long id) {
  9. dao.delete(id);
  10. }
  11. public void update(User user) {
  12. dao.saveAndFlush(user);
  13. }
  14. public List<User> findAll() {
  15. return dao.findAll();
  16. }
  17. }

来写一单元测试。

  1. public class UserServiceTest {
  2. private static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. private static UserService userService = (UserService) context.getBean("userService");
  4. public void saveUser() {
  5. StopWatch sw = new StopWatch(getClass().getSimpleName());
  6. sw.start("Add a user information.");
  7. User u = new User();
  8. u.setName("John");
  9. u.setSex("Man");
  10. u.setUsername("JohnZhang");
  11. u.setPassword("123456");
  12. u.setBirth(new Date());
  13. userService.save(u);
  14. sw.stop();
  15. System.err.println(sw.prettyPrint());
  16. }
  17. public static void main(String[] args) {
  18. UserServiceTest test = new UserServiceTest();
  19. test.saveUser();
  20. }
  21. }

绿了,高兴了,测试通过! 
额,都没用Junit怎么会绿呢,开个玩笑。 
其余继承下来的操作方法,大家都可以自己测试一下,如没意外,应该都会测试通过。 

好吧,今天就暂时分享到这了,你千万别以为Spring-data就这么点功能,这只是spring-data中最入门级的知识,后续还有很多东西值得学习,在下一篇文章中我会列出spring-data-jpa中精华的部分,对其进行讲解,并附上Demo供下载。

一步步学习 Spring Data 系列之JPA(一)的更多相关文章

  1. 一步步学习 Spring Data 系列之JPA(二)

    继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...

  2. Spring Data系列之Jpa(一)

    1.Spring Data的由来 Spring Data是SpringSource基金会创下的一个简化数据库访问.支持云服务的开源框架.其主要目的是让数据库访问变的方便快捷,可以用Spring Dat ...

  3. 学习Spring Data JPA

    简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特​​殊 ...

  4. 学习-spring data jpa

    spring data jpa对照表 Keyword Sample JPQL snippet And findByLastnameAndFirstname - where x.lastname = ? ...

  5. 一文深入浅出学习Spring框架系列,强烈推荐

    本系列主要介绍Spring框架整体架构,Spring的核心IOC,AOP的案例和具体实现机制:以及SpringMVC框架的案例和实现机制.@pdai 相关文章 首先, 从Spring框架的整体架构和组 ...

  6. 学习Spring框架系列(一):通过Demo阐述IoC和DI的优势所在

    Spring框架最核心东西便是大名鼎鼎的IoC容器,主要通过DI技术实现.下面我通过Demo的演变过程,对比学习耦合性代码,以及解耦和的过程,并深入理解面向接口编程的真正内涵. 这个例子包括如下几个类 ...

  7. MongoDB学习-->Spring Data Mongodb框架之Repository

    application-dev.yml server: port: 8888 mongo: host: localhost port: 27017 timeout: 60000 db: mamabik ...

  8. MongoDB学习-->Spring Data Mongodb-->MongodbTemplate

    配置文件application-dev.yml: server: port: 8888 mongo: host: localhost port: 27017 timeout: 60000 db: ma ...

  9. Springboot 系列(十)使用 Spring data jpa 访问数据库

    前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...

随机推荐

  1. 探索c#之Async、Await剖析

    阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async.Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下. ...

  2. 周六搞事情,微信小程序开发文档已放出!

    程序员们,你们有事干了! 个人感觉不管是什么形式的UI技术,都无法决定一个产品的生死,核心还是服务和模式的创新. 某些方面和ApiCloud好像,但发展前景远远胜过ApiCloud. 微信小程序可以为 ...

  3. git 行动指南

    Git是一个分布式的版本管理工具. 在本地项目和服务器都会拥有版本库,本地版本库由自己控制,自由选择提交代码到服务器端 windows上也建议使用命令的方式来使用git,推荐使用客户端 :http:/ ...

  4. 如何用 MEF 扩展应用程序

    最近在写一篇关于如何扩展 Visual Studio 编辑器的文章时,用到了 MEF,因此打算写一篇文章提一下这个技术点.本篇文章并不打算详细介绍 MEF,只是一个最简单的入门,相信您在阅读本篇文章后 ...

  5. ABP框架 - 授权

    文档目录 本节内容: 简介 关于 IPermissionChecker 定义许可 检查许可 使用 AbpAuthorize特性 AbpAuthorize特性注意事项 废止授权 使用 IPermissi ...

  6. 读取xml数据装配到字典中之应用场景

    前段时间看到支付宝设置里面有个多语言这个功能,蛮有意思的,就想双休没事的话做个相关的demo玩玩,可是礼拜六被妹子拽出去玩了一天,来大上海有大半年了,基本没有出去玩过,妹子说我是超级宅男,也不带她出去 ...

  7. ElasticSearch 5学习(8)——分布式文档存储(wait_for_active_shards新参数分析)

    学完ES分布式集群的工作原理以及一些基本的将数据放入索引然后检索它们的所有方法,我们可以继续学习在分布式系统中,每个分片的文档是被如何索引和查询的. 路由 首先,我们需要明白,文档和分片之间是如何匹配 ...

  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(16)-权限管理系统-漂亮的验证码

    系列目录 我们上一节建了数据库的表,但我发现很多东西还未完善起来,比如验证码,我们先做好验证码吧,验证码我们再熟悉不过了,为了防止恶意的登录,我们必须在登录页面加入验证码,下面我将分享一个验证码,这个 ...

  9. SQL Server-外部联接基础回顾(十三)

    前言 本节我们继续讲讲联接类型中的外部联接,本节之后我们将讲述有关联接性能以及更深入的知识,简短内容,深入的理解,Always to review the basics. 外部联接 外部联接又分为左外 ...

  10. 微信扫描下载提示以及js判断用户手机系统

            今天抽空也写一下这个教程吧,这里面涉及到就是一个APP的页面下载.公司有这个需求,让做一个页面,就是二维码扫描下载.一开始我做的版本是只能是通过浏览器来下载的,但是实际应用中,很多用户 ...