Spring Data JPA 1.10.1 详解一之Spring Data JPA介绍

简介:

一、JPA介绍

    JPA是Java Persistence API的缩写,以下的百度百科关于JPA的解释,具体的规范可以去看官网:

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它不又于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。Hibernate3.2+、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。


这里说下的是,hibernate是实现了JPA规范了的,而mybatis是没有的实现的,这点大家在框架选型的时候可以参考参考。

具体的可以参考oracle的 

The Java EE 5 Tutorial 的Persistence章节

http://docs.oracle.com/javaee/5/tutorial/doc/bnbpz.html


大伙也可以看看百度和google搜索的结果对比:相差实在是太大!大家可以如果不方便google,嫌代理,啥的麻烦,我这里提供几个简单的方法:

1、修改本地hosts文件

    缺点,需要经常维护hosts文件,百度搜索一个即可,找个最新的。

2、使用google的镜像站点

    这个镜像站点,百度搜索一下,会不定时的有更新



wKiom1dJBdTSO4AhAAD31CjtQkY937.jpg-wh_50wKioL1dJBvnhe5SNAAGVOcWahl8703.jpg-wh_50


Chapter 24

Introduction to the Java Persistence API


The Java Persistence API provides an object/relational mapping facility to Java developers for managing relational data in Java applications. Java Persistence consists of three areas:

  • The Java Persistence API

  • The query language

  • Object/relational mapping metadata


我这里将这个pdf文档下下来了,有需要的朋友可以去51cto下载中心下载。下载地址

本系列教程将从JPA入手,到整合Spring Data JPA ,到熟练掌握,将大家一步一步的带入到Spring Data JPA的世界中!


二、Spring Data JPA的介绍

    Spring Data JPA,正是对JPA的一层更高层次的封装,封装之后更加的简洁。

1
Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals  with  enhanced support  for  JPA based data access layers. It makes it easier to build Spring-powered applications that  use  data access technologies.

    如何简洁,简洁到你只需要写一个接口,甚至不需要写实现类,就可以完成你想要的功能。

1
2
3
4
5
6
7
8
9
10
import  java.util.List;
 
import  org.springframework.data.jpa.repository.JpaRepository;
 
import  com.example.entity.UserInfo;
 
public  interface  UserInfoService  extends  JpaRepository<UserInfo, String> {
     
     public  List<UserInfo> findByUsername(String username);
}

上面定义了一个UserInfoService接口,继承了JpaRepository接口,自定义了一个findByUsername方法,实现了通过根据用户名查找用户的功能!!!仅仅只需要一个接口,就完成了,我们以前写

1
<span style= "font-size:18px;" >UserInfoService、UserInfoServiceImpl、UserDao、UserDaoImpl<br data-filtered= "filtered" ></span>

这一系列的文件。甚至事务管理,你也不需要操心!统统都交给Spring了,如果想自定义更复杂的查询,自己自定义就可以了。



三、JPA操作

    ①、生成JPA实体类

    JPA实体,和之前大家用myeclipse的逆向生成hibernate的实体是类似的。具体如图1、2所示,当然如果你不嫌麻烦,也可以手写。

项目右键--Myeclipse-->Project Facets-->Install JPA  Facet

wKiom1dISFqhuXBIAAFkyMVPrYk422.jpg-wh_50

图1 项目增加jpa支持



wKioL1dISVLx6bUDAACyNgOUqho017.jpg-wh_50

图2 逆向生成

一步一步的跟着提示做就可以了,跟之前hibernate的逆向生成也是差不多的 。生成的实体类如下,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
  * UserInfo entity. @author MyEclipse Persistence Tools
  */
@Entity
@Table (name =  "user_info" , catalog =  "rbac" , uniqueConstraints =  @UniqueConstraint (columnNames =  "username" ))
public  class  UserInfo  implements  java.io.Serializable {
 
     // Fields
 
     private  String id;
     private  String username;
     private  String password;
     private  String sex;
     private  Timestamp birthday;
     private  String email;
     private  String contact;
     private  String onlineState;
     private  Timestamp createTime;
     private  Timestamp modifyTime;
     private  String createUser;
     private  Timestamp registerTime;
     private  Timestamp lastLoginTime;
     private  Timestamp lastLogoutTime;
     private  String lastLoginIp;
     private  String userState;
     private  String deleteFlag;
 
     // Constructors
 
     /** default constructor */
     public  UserInfo() {
     }
 
     /** minimal constructor */
     public  UserInfo(String id, String username, String password) {
         this .id = id;
         this .username = username;
         this .password = password;
     }
 
     /** full constructor */
         //full构造方法省略
 
     // Property accessors
     @Id
     @Column (name =  "id" , unique =  true , nullable =  false , length =  50 )
     public  String getId() {
         return  this .id;
     }
 
     public  void  setId(String id) {
         this .id = id;
     }
 
     @Column (name =  "username" , unique =  true , nullable =  false , length =  50 )
     public  String getUsername() {
         return  this .username;
     }
 
     public  void  setUsername(String username) {
         this .username = username;
     }
 
     @Column (name =  "password" , nullable =  false , length =  50 )
     public  String getPassword() {
         return  this .password;
     }
 
     public  void  setPassword(String password) {
         this .password = password;
     }
 
     @Column (name =  "sex" , length =  1 )
     public  String getSex() {
         return  this .sex;
     }
 
     public  void  setSex(String sex) {
         this .sex = sex;
     }
 
     @Column (name =  "birthday" , length =  19 )
     public  Timestamp getBirthday() {
         return  this .birthday;
     }
 
     public  void  setBirthday(Timestamp birthday) {
         this .birthday = birthday;
     }
 
     @Column (name =  "email" , length =  50 )
     public  String getEmail() {
         return  this .email;
     }
 
     public  void  setEmail(String email) {
         this .email = email;
     }
 
}


同时src的META-INF下面生成了一个persistence.xml

1
2
3
4
5
6
<? xml  version = "1.0"  encoding = "UTF-8" ?>
< persistence  version = "2.1"  xmlns = "http://xmlns.jcp.org/xml/ns/persistence"  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation = "http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" >
     < persistence-unit  name = "sshmos"  transaction-type = "RESOURCE_LOCAL" >
         < class >com.example.entity.UserInfo</ class >
     </ persistence-unit >
</ persistence >


②、JPA用法

1
UserDao、 UserService、UserServiceImpl 的代码就不贴出来了 ,就是常见的写法,相信大伙都已经非常的熟悉了。
1
2
3
4
5
6
7
8
下面主要把UserDaoImpl里面的几个方法写下:
 
  EntityManagerFactory emf = Persistence.createEntityManagerFactory( "sshmos" ); 
  EntityManager em = emf.createEntityManager(); 
  em.getTransaction().begin(); 
  em.persist(accountInfo); 
  em.getTransaction().commit(); 
  emf.close();


这个sshmos跟persistence.xml配置文件里面的name是保持一致的。

主要操作都是基于EntityManager的,操作用的是persist()、remove()、merge()、find()、等方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public  List<UserInfo> findAll( final  int ... rowStartIdxAndCount) {
         EntityManagerHelper.log( "finding all UserInfo instances" , Level.INFO,
                 null );
         try  {
             final  String queryString =  "select model from UserInfo model" ;
             Query query = getEntityManager().createQuery(queryString);
             if  (rowStartIdxAndCount !=  null  && rowStartIdxAndCount.length >  0 ) {
                 int  rowStartIdx = Math.max( 0 , rowStartIdxAndCount[ 0 ]);
                 if  (rowStartIdx >  0 ) {
                     query.setFirstResult(rowStartIdx);
                 }
 
                 if  (rowStartIdxAndCount.length >  1 ) {
                     int  rowCount = Math.max( 0 , rowStartIdxAndCount[ 1 ]);
                     if  (rowCount >  0 ) {
                         query.setMaxResults(rowCount);
                     }
                 }
             }
             return  query.getResultList();
         catch  (RuntimeException re) {
             EntityManagerHelper.log( "find all failed" , Level.SEVERE, re);
             throw  re;
         }
     }

这个查询所有的方法,里面包含了分页信息,可以看到跟hibernate的查询还是非常像的。熟悉EJB3的朋友,是不是也觉得似曾相似呢?JPA规范的设计者是Hibernate框架的作者,同时,hibernate的作者也是EJB3规范的设计者之一,所以这三者有这千丝万缕的关系!








 本文转自 w156445045 51CTO博客,原文链接:http://blog.51cto.com/enetq/1783944,如需转载请自行联系原作者

相关文章
|
5月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
545 4
|
2月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
347 2
|
3月前
|
Java API 数据库
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
153 15
|
4月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
175 32
|
5月前
|
SQL Java 编译器
深入理解 Spring Data JPA 的导入与使用:以 UserRepository为例
本文深入解析了 Spring Data JPA 中 `UserRepository` 的导入与使用。通过示例代码,详细说明了为何需要导入 `User` 实体类、`JpaRepository` 接口及 `@Repository` 注解。这些导入语句分别用于定义操作实体、提供数据库交互方法和标识数据访问组件。文章还探讨了未导入时的编译问题,并展示了实际应用场景,如用户保存、查询与删除操作。合理使用导入语句,可让代码更简洁高效,充分发挥 Spring Data JPA 的优势。
338 0
|
8月前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
187 21
|
11月前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
112 9
|
11月前
|
SQL Java 关系型数据库
Springboot引入jpa来管理数据库
Springboot引入jpa来管理数据库
228 0
Springboot引入jpa来管理数据库
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
【Java笔记+踩坑】Spring Data JPA
|
11月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
259 0

热门文章

最新文章