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

时间:2022-09-04 15:35:02

引入:

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();

此接口中的方法大多是我们在访问数据库中常用的一些方法,如果我们要写自己的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框架系列(一):通过Demo阐述IoC和DI的优势所在

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

  6. MongoDB学习--&gt&semi;Spring Data Mongodb框架之Repository

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

  7. MongoDB学习--&gt&semi;Spring Data Mongodb--&gt&semi;MongodbTemplate

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

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

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

  9. Spring Data Jpa&plus;SpringMVC&plus;Jquery&period;pagination&period;js实现分页

    本博客介绍基于Spring Data这款orm框架加上Jquery.pagination插件实现的分页功能. 介绍一下Spring Data框架 spring Data : Spring 的一个子项目 ...

随机推荐

  1. 我的ORM之一 -- 查询

    我的ORM索引 概述 http://code.taobao.org/svn/MyOql/ 这是我自己写的开源ORM教程,我想先从场景示例中切入介绍,先有一个感性的认识,以小见大,触类旁通,有了这个认识 ...

  2. exe文件添加为服务

    首先,去下载一个叫rktools.exe的工具(我提供个下载地址Windows 2003 Resource Kits),下载完后安装该资源包,里面有个instsrv.exe和srvany.exe的工具 ...

  3. 最牛逼android上的图表库MpChart(三) 条形图

    最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...

  4. Integer Inquiry -TJU1112

    作为最简单的高精度加法,要注意的是如下几点, 第一,因为是数位达到上百位的大数,所以只能用字符串数组来存贮. 第二,为了方便之后的相加操作,应该把字符串数组逆序转化为一个整型数组. 第三,在控制进位的 ...

  5. unity3d WorldComposer1 卫星地图生成地形

    http://blog.csdn.net/myarrow/article/details/42709113 1. 简介 1.1 TerrainComposer(TC) 一个Unity扩展工具,可用于创 ...

  6. OEM status&vert;start&vert;stop

    OEM一旦建立以后,LINUX的主机名(hosts)就不要去改变. [oracle@redhat4 ~]$ emctl start dbconsoleOC4J Configuration issue. ...

  7. iOS学习之应用之间的操作(转发)

    首先要说的是每一个APP都可以设置一个自己独有的URL,APP应用之间的操作就是通过这个URL来实现的! 1.如何配置自己应用的URL? 关于自己的URL,作为资深的程序猿都会想到 Info.plis ...

  8. sublime自动保存设置

    首选项——用户设置 (Preferences:Settings - User) 行末添加"save_on_focus_lost": true 注意用逗号分隔 保存即可 save_o ...

  9. mysql命令行远程登录命令

    mysql -u root -psalon365365 -h 192.168.1.103 -P 3 306 -D empirecms

  10. DB开发之mysql

    1. MySQL 4.x版本及以上版本提供了全文检索支持,但是表的存储引擎类型必须为MyISAM,以下是建表SQL,注意其中显式设置了存储引擎类型 CREATE TABLE articles ( id ...