天天看點

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的鏡像站點

    這個鏡像站點,百度搜尋一下,會不定時的有更新

Spring Data JPA 1.10.1 詳解一之Spring Data JPA介紹
Spring Data JPA 1.10.1 詳解一之Spring Data JPA介紹

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

Spring Data JPA 1.10.1 詳解一之Spring Data JPA介紹

圖1 項目增加jpa支援

Spring Data JPA 1.10.1 詳解一之Spring Data 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 {

	// 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

<?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是保持一緻的。

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;
		}
	}