一、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的镜像站点
这个镜像站点,百度搜索一下,会不定时的有更新
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的一层更高层次的封装,封装之后更加的简洁。
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.
如何简洁,简洁到你只需要写一个接口,甚至不需要写实现类,就可以完成你想要的功能。
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方法,实现了通过根据用户名查找用户的功能!!!仅仅只需要一个接口,就完成了,我们以前写
UserInfoService、UserInfoServiceImpl、UserDao、UserDaoImpl
这一系列的文件。甚至事务管理,你也不需要操心!统统都交给Spring了,如果想自定义更复杂的查询,自己自定义就可以了。
三、JPA操作
①、生成JPA实体类
JPA实体,和之前大家用myeclipse的逆向生成hibernate的实体是类似的。具体如图1、2所示,当然如果你不嫌麻烦,也可以手写。
项目右键--Myeclipse-->Project Facets-->Install JPA Facet
图1 项目增加jpa支持
图2 逆向生成
一步一步的跟着提示做就可以了,跟之前hibernate的逆向生成也是差不多的 。生成的实体类如下,
/** * UserInfo entity. @author MyEclipse Persistence Tools */@Entity@Table(name = "user_info", catalog = "rbac", uniqueConstraints = @UniqueConstraint(columnNames = "username"))public class UserInfo implements java.io.Serializable {// Fieldsprivate 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
<?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用法
UserDao、 UserService、UserServiceImpl 的代码就不贴出来了 ,就是常见的写法,相信大伙都已经非常的熟悉了。
下面主要把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()、等方法。
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规范的设计者之一,所以这三者有这千丝万缕的关系!
本文出自 “幽灵柯南的技术blog” 博客,请务必保留此出处http://enetq.blog.51cto.com/479739/1783944