jpa入門之環境搭建和CRUD基本操作
hibernate雖然好用但編寫映射文件還是比較麻煩,雖然可以借助插件但是后期的維護還是比較麻煩,jpa的全稱是Java Persistence API,實現該規范的產品很多像hibernate就是其中比較出名的一個,原則上應該盡量不要使用hibernate,可惜jpa只是一個接口規范,自 己按照規范寫一套也不現實,只能通過hibernate間接的使用jpa.
1 使用hibernate的jpa實現需要的jar包如下

我用的是hibernate3.6的版本,如果是低版本的hibernate則還需要hibernate-commons-annotations.jar、hibernate-annotations.jar
2 persistence.xml的相關配置
jpa和hibernate類似需要一個類似hibernate.cfg.xml的配置文件,該文件指定要操作的相關數據庫,內容如下
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="myPersistUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<!-- 數據庫的相關配置 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value = "jdbc:mysql://127.0.0.1:3306/exercise?useUnicode=true&characterEncoding=UTF-8"/>
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<!-- 指定方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence> 相信學過hibernate應該能看懂這個配置文件,需要注意的是persistence-unit節點的name屬性,這個名稱后面將會用到,另外這個 文件的名稱只能是persistence.xml不能是別的名稱且必須放在src下面的META-INF文件夾下面,如果不存在可以手動創建。
3 編寫實體類
實體是jpa中比較重要的一部分,它承擔著POJO和類似hibernate映射文件的功能,算得上是jpa的核心文件,下面這個是其中一個例子
package org.lxh.info;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "m_users")
public class User {
private int id;
private String name;
private Date birthday;
private Sex sex;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(length=20,nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Temporal(TemporalType.DATE)
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Enumerated(EnumType.STRING)
@Column(length=5,nullable=false)
public Sex getSex() {
return sex;
}
public void setSex(Sex sex) {
this.sex = sex;
}
} @Entity 這個注解表明這個java類是一個實體對象
@Table 該注解用來指定實體對應的表,默認情況下表名和實體類的名稱相同
@Id 該注解用來指定主鍵
@GeneratedValue 該注解配置的是主鍵的生成策略
@Column 該注解用于指定數據庫表對于的列名、唯一約束、非空約束等
@Temporal 主要用于日期屬性上面,可以指定日期的類型
@Lob 指定映射到數據庫的字段為大文本數據或者字節數組
@Enumerated 指定對于的屬性為枚舉
4 編寫簡單的JPA工具類
package org.lxh.util;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public final class JpaUtil {
private static EntityManagerFactory em;
static{
em=Persistence.createEntityManagerFactory("myPersistUnit");
}
public static EntityManager getEntityManager(){
return em.createEntityManager();
}
} 5 JPA的crud基本操作
package org.lxh.test;
import static org.junit.Assert.*;
import java.util.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.lxh.info.Sex;
import org.lxh.info.User;
import org.lxh.util.JpaUtil;
public class Test {
@org.junit.Test
public void testInsert() {
EntityManager em=null;
EntityTransaction tx=null;
try{
em=JpaUtil.getEntityManager();
tx=em.getTransaction();
tx.begin();
User u=new User();
u.setBirthday(new Date());
u.setName("潘瑋柏");
u.setSex(Sex.MAN);
em.persist(u);
tx.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
if(em!=null){
em.close();
}
}
}
@org.junit.Test
public void testUpdate() {
EntityManager em=null;
EntityTransaction tx=null;
try{
em=JpaUtil.getEntityManager();
tx=em.getTransaction();
tx.begin();
User u=new User();
u.setId(2);
u.setName("周杰倫");
u.setSex(Sex.MAN);
u.setBirthday(new Date());
em.merge(u);
tx.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
if(em!=null){
em.close();
}
}
}
@org.junit.Test
public void testDelete() {
EntityManager em=null;
EntityTransaction tx=null;
try{
em=JpaUtil.getEntityManager();
tx=em.getTransaction();
tx.begin();
User u=em.find(User.class, 2);
em.remove(u);
tx.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
if(em!=null){
em.close();
}
}
}
/**
* 最簡單的查詢
*/
@org.junit.Test
public void testJPLQuery() {
EntityManager em=null;
EntityTransaction tx=null;
try{
em=JpaUtil.getEntityManager();
String jpl="select u from User u";
Query q=em.createQuery(jpl);
List<User> all=q.getResultList();
Iterator<User> it=all.iterator();
while(it.hasNext()){
User user=it.next();
System.out.println(user.getName()+","+user.getBirthday());
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(em!=null){
em.close();
}
}
}
/**
* 使用命名參數的方式更新數據
*/
@org.junit.Test
public void testJPLUpdate() {
EntityManager em=null;
EntityTransaction tx=null;
try{
em=JpaUtil.getEntityManager();
String jpl="update User u set u.name=:name where u.id=:id";
Query q=em.createQuery(jpl);
q.setParameter("name", "加菲貓");
q.setParameter("id", 3);
q.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
if(em!=null){
em.close();
}
}
}
} 最后來分析一下jpa的缺點:
1> 提供的主鍵生成策略較少
2>沒有緩存機制
3> 實體類中注解和java代碼混合在一起,可讀性降低了
來自:http://blog.csdn.net/walkcode/article/details/39103277