1,About JPA
JPA是sun公司定義的一套持久化API,他只是定義了相關的Interface,實現產品多種多樣如Hibernate,Ibatis,topLink,openJPA等等,JPA的偉大之處就是結束了多少年以來個大ORM產品各自為營的局面,使得各ORM產品統一,使用JPA,如過你的實現產品是HIbernate,以后換其他的ORM產品就變的很方便,使我們的代碼變的非常靈活。
2.這里做一個簡單的事例,實現產品使用Hibernate,所使用的jar包如下所示:

3. 在src下新建一個名為M“ETA-INF”的文件夾,在其下創建一個persistence.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="JPA" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> <property name = "hibernate.connection.driver_class" value = "com.mysql.jdbc.Driver"/> <property name = "hibernate.connection.url" value = "jdbc:mysql://localhost:3306/test"/> <property name = "hibernate.connection.username" value = "root"/> <property name = "hibernate.connection.password" value = "rootroot"/> </properties> </persistence-unit> </persistence>
4.實體bean
package com.youcent; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User implements Serializable{ private Integer id; private String name; @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }
5.建立test類進行測試
package com.youcent; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import org.junit.Test; public class TestUser { //添加 @Test public void testSave() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); User u = new User(); u.setName("jerry"); em.persist(u); em.getTransaction().commit(); em.close(); factory.close(); } //刪除 @Test public void testRemove() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); User u = em.find(User.class,2); em.remove(u); em.getTransaction().commit(); em.close(); factory.close(); } //修改 @Test public void update() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); //第一種方法 //User u = em.find(User.class,1); //u.setName("tom"); //第二種方法 User u1 = new User(); u1.setId(3); u1.setName("xyz"); em.merge(u1); em.getTransaction().commit(); em.close(); factory.close(); } //hql 取得所有對象 @Test public void findAll() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA"); EntityManager em = factory.createEntityManager(); Query query = em.createQuery("select u from User u"); List<User> list = query.getResultList(); for(User u : list){ System.out.println(u.toString()); } em.close(); factory.close(); } //hql 取得單一結果 ,使用位"置參數查詢" @Test public void findById() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA"); EntityManager em = factory.createEntityManager(); Query query = em.createQuery("select u from User u where u.id=?1"); //表示明確指定從1開始設置參數 query.setParameter(1, 4); User u = (User) query.getSingleResult(); //取得單一結果 System.out.println(u.toString()); em.close(); factory.close(); } //hql 取得單一結果 ,同樣任何查詢可以使用"命名參數"查詢 @Test public void findByHql() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA"); EntityManager em = factory.createEntityManager(); Query query = em.createQuery("select u from User u where u.id=:id"); //表示明確指定從1開始設置參數 query.setParameter("id", 4); User u = (User) query.getSingleResult(); //取得單一結果 System.out.println(u.toString()); em.close(); factory.close(); } //hql分頁查詢 @Test public void findByPage() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA"); EntityManager em = factory.createEntityManager(); Query query = em.createQuery("select u from User u"); query.setFirstResult(1); //表示從第二條記錄開始 query.setMaxResults(2); //向后去兩條 List<User> list = query.getResultList(); for(User u : list){ System.out.println(u.toString()); } em.close(); factory.close(); } //hql更新查詢,須開事務 @Test public void updateByhql() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Query query = em.createQuery("update User u set u.name=:name where u.id=:id"); query.setParameter("name", "tom1"); query.setParameter("id", 1); int rows = query.executeUpdate(); //更新查詢要執行的方法 if(rows>0){ System.out.println("更新成功!"); } em.getTransaction().commit(); em.close(); factory.close(); } //hql刪除查詢,須開事務 @Test public void removeByhql() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Query query = em.createQuery("delete from User u where u.id=:id"); query.setParameter("id", 4); int rows = query.executeUpdate(); //更新查詢要執行的方法 if(rows>0){ System.out.println("刪除成功!"); } em.getTransaction().commit(); em.close(); factory.close(); } }
6.總結一下常用注解
1、日期:
@Temporal(TeporalType.DATE) -----> Date
2、枚舉:
@Enumerated(EnumType.STAING) ---> Enum
3、大文本,二進制數據:
@Lob ------> String,Byte[]
4、不和數據庫映射
@Transient
5、延遲加載
@Basc(fetch=FetchType.LAZY),只有當使用屬性的get方法
是才從數據中獲取!
