博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Data JPA 简单介绍
阅读量:6452 次
发布时间:2019-06-23

本文共 5688 字,大约阅读时间需要 18 分钟。

原文地址:http://www.blogjava.net/stone2083/archive/2011/08/25/357262.html

背景

考虑到公司应用中数据库访问的多样性和复杂性,目前正在开发UDSL(统一数据访问层),开发到一半的时候,偶遇工程。发现两者的思路惊人的一致。

于是就花了点时间了解SpringData,可能UDSL II期会基于SpringData做扩展
SpringData相关资料
介绍:针对关系型数据库,KV数据库,Document数据库,Graph数据库,Map-Reduce等一些主流数据库,采用统一技术进行访问,并且尽可能简化访问手段。
目前已支持的数据库有(主要):MongoDB,Neo4j,Redis,Hadoop,JPA等
SpringData官方资料(强烈推荐,文档非常详细)
SpringData主页:
SpringDataJPA 指南文档: (非常详细)
SpringDataJPA Examples: https://github.com/SpringSource/spring-data-jpa-examples (非常详细的例子)
Spring-Data-Jpa简介
Spring Data Jpa 极大简化了数据库访问层代码,只要3步,就能搞定一切
1. 编写Entity类,依照JPA规范,定义实体
2. 编写Repository接口,依靠SpringData规范,定义数据访问接口(注意,只要接口,不需要任何实现)
3. 写一小陀配置文件 (Spring Scheme配置方式极大地简化了配置方式)
下面,我依赖Example中的例子,简单地介绍下以上几个步骤

User.java

[java] 

  1. /**  2  * User Entity Sample  3  *   4  * @author 
    Stone.J Aug 25, 2011  5  */   6 @Entity   7 public class User extends AbstractPersistable
     {   8    9     private static final long serialVersionUID = -2952735933715107252L;  10   11     @Column(unique = true)  12     private String            username;  13     private String            firstname;  14     private String            lastname;  15   16     public String getUsername() {  17         return username;  18     }  19   20     public void setUsername(String username) {  21         this.username = username;  22     }  23   24     public String getFirstname() {  25         return firstname;  26     }  27   28     public void setFirstname(String firstname) {  29         this.firstname = firstname;  30     }  31   32     public String getLastname() {  33         return lastname;  34     }  35   36     public void setLastname(String lastname) {  37         this.lastname = lastname;  38     }  39

Repository.java

[java] 

  1. 1 /**  2  * User Repository Interface.  3  *   4  * @author 
    Stone.J Aug 25, 2011  5  */   6 public interface SimpleUserRepository extends CrudRepository
    , JpaSpecificationExecutor
     {   7    8     public User findByTheUsersName(String username);   9   10     public List
     findByLastname(String lastname);  11   12     @Query("select u from User u where u.firstname = ?")  13     public List
     findByFirstname(String firstname);  14   15     @Query("select u from User u where u.firstname = :name or u.lastname = :name")  16     public List
     findByFirstnameOrLastname(@Param("name") String name);  17

需要关注它继承的接口,我简单介绍几个核心接口

Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别

CrudRepository: 继承Repository,实现了一组CRUD相关的方法

PagingAndSortingRepository: 继承CrudRepository,实现了一组分页排序相关的方法

JpaRepository: 继承PagingAndSortingRepository,实现一组JPA规范相关的方法

JpaSpecificationExecutor: 比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法

不需要写任何实现类,Spring Data Jpa框架帮你搞定这一切。
Spring Configuration

[java] 

  1.    2     
       3         
       4         
       5             
       6                 
       7                 
       8                9           10         
      11       12   13     
      14         
      15       16   17     
      18   19   20     
      21 

核心代码只要配置一行:<jpa:repositories base-package="org.springframework.data.jpa.example.repository.simple" />即可。上面的仅仅是数据源,事务的配置而已。

至此,大功告成,即可运行

[java] 

  1. 1 /**  2  * Intergration test showing the basic usage of {@link SimpleUserRepository}.  3  *   4  * @author 
    Stone.J Aug 25, 2011  5  */   6 @RunWith(SpringJUnit4ClassRunner.class)   7 @ContextConfiguration(locations = "classpath:simple-repository-context.xml")   8 @Transactional   9 public class SimpleUserRepositorySample {  10   11     @Autowired  12     SimpleUserRepository repository;  13     User                 user;  14   15     @Before  16     public void setUp() {  17         user = new User();  18         user.setUsername("foobar");  19         user.setFirstname("firstname");  20         user.setLastname("lastname");  21     }  22   23     // crud方法测试  24     @Test  25     public void testCrud() {  26         user = repository.save(user);  27         assertEquals(user, repository.findOne(user.getId()));  28     }  29   30     // method query测试  31     @Test  32     public void testMethodQuery() throws Exception {  33         user = repository.save(user);  34         List
     users = repository.findByLastname("lastname");  35         assertNotNull(users);  36         assertTrue(users.contains(user));  37     }  38   39     // named query测试  40     @Test  41     public void testNamedQuery() throws Exception {  42         user = repository.save(user);  43         List
     users = repository.findByFirstnameOrLastname("lastname");  44         assertTrue(users.contains(user));  45     }  46   47     // criteria query测试  48     @Test  49     public void testCriteriaQuery() throws Exception {  50         user = repository.save(user);  51         List
     users = repository.findAll(new Specification
    () {  52   53             @Override  54             public Predicate toPredicate(Root
     root, CriteriaQuery
     query, CriteriaBuilder cb) {  55                 return cb.equal(root.get("lastname"), "lastname");  56             }  57         });  58         assertTrue(users.contains(user));  59     }  60

其中,写操作相对比较简单,我不做详细介绍,针对读操作,我稍微描述下:

Method Query: 方法级别的查询,针对   findByfindreadByreadgetBy等前缀的方法,解析方法字符串,生成查询语句,其中支持的关键词有:
Named Query: 针对一些复杂的SQL,支持原生SQL方式,进行查询,保证性能
Criteria Query: 支持JPA标准中的Criteria Query

转载于:https://my.oschina.net/vshcxl/blog/648439

你可能感兴趣的文章
Block的一些定义和使用
查看>>
从一滴水说起,谈谈CSS形状的生成思路
查看>>
jenkins 构建后上传至svn
查看>>
Java 8 并发教程:同步和锁
查看>>
<译> MIT 为何停掉 SICP?
查看>>
如何解决因float带来的排版问题?
查看>>
Scala Essentials: 隐式转换
查看>>
Java基础:Java核心技术提示的易忽略点 Ch4
查看>>
@autoreleasepool-内存的分配与释放
查看>>
Fescar 发布 0.2.3 版本,支持 Redis 和 Apollo
查看>>
ReThought (二): 如何照顾团队中的新人
查看>>
棉花种子在月球发芽啦!中国或将成首个在太空建“定居点”的国家 ...
查看>>
kubernetes1.9.2基于kubeadm高可用安装教程,包含离线安装包,支持简单快速安装,含视频教程 ...
查看>>
MySQL 笔记整理(19) --为什么我只查一行的语句,也执行这么慢? ...
查看>>
Fescar 全局锁介绍
查看>>
动画库animate.css的用法
查看>>
实战:基于Spring Boot快速开发RESTful风格API接口
查看>>
java List的4种实现类
查看>>
lenovo thinkpad t460s tlp-stat 修复acpi_call
查看>>
04 贝叶斯算法 - 贝叶斯网络
查看>>