jpa入門之環境搭建和CRUD基本操作

jopen 10年前發布 | 54K 次閱讀 JPA 持久層框架

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

1 使用hibernate的jpa實現需要的jar包如下

20140906194058718.jpg

我用的是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

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!