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的一層更高層次的封裝,封裝之後更加的簡潔。

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

wKiom1dISFqhuXBIAAFkyMVPrYk422.jpg-wh_50

圖1 項目增加jpa支持



wKioL1dISVLx6bUDAACyNgOUqho017.jpg-wh_50

圖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是保持一致的。

主要操作都是基於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規範的設計者之一,所以這三者有這千絲萬縷的關係!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章