1. 程式人生 > >JPA學習筆記---JPA資料的操作:增加,刪除,修改,獲取,使用JPQL進行查詢

JPA學習筆記---JPA資料的操作:增加,刪除,修改,獲取,使用JPQL進行查詢

JPA學習筆記---JPA資料的操作:增加,刪除,修改,獲取,使用JPOL進行查詢

創夢技術交流平臺:資源下載,技術交流,網路賺錢:
交流qq群:1群:248318056
2群:251572072
技術交流平臺:cre.iqee.cn
博文相關程式碼資源下載地址:cre.iqee.cn

---------------------------

2013-02-04 JPA資料的操作:增加,刪除,修改,獲取,使用JPOL進行查詢 CRUD操作  package junit.test; import javax.persistence.Query; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.hibernate.Session; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.Request; import com.credream.bean.Person; public class PersonTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Ignore @Test public void save(){ EntityManagerFactory  factory=Persistence.createEntityManagerFactory("credream"); //執行上面這條語句的時候可以反向生成表 //--->sessionFactory-->session--->begin事物 EntityManager em=factory.createEntityManager(); em.getTransaction().begin();//開始事物         //Session.save()-->Persist(); em.persist(new Person("創夢網路")); //持久化到資料庫 em.getTransaction().commit(); em.close(); factory.close(); } @Ignore @Test public void getPerson(){ EntityManagerFactory  factory=Persistence.createEntityManagerFactory("credream"); //執行上面這條語句的時候可以反向生成表 //--->sessionFactory-->session--->begin事物 EntityManager em=factory.createEntityManager(); em.getTransaction().begin();//開始事物         //Session.save()-->Persist();    Person person=em.find(Person.class, 1);//相當於hibernate的get()方法 System.out.println(person.getName()); //注意讀取資料的時候是不需要開事物的 //只有更改的時候才需要;    em.getTransaction().commit(); em.close(); factory.close(); } @Ignore @Test public void getPerson2(){ EntityManagerFactory  factory=Persistence.createEntityManagerFactory("credream"); /*EntityManagerFactory   * 其實就是對hibernate的sessionFactory做了一個封裝,hibernate的jpa 實現程式碼  * */ /*執行這句話的時候的原理  * 利用jpa類似於jdbc的驅動類:持久化驅動類,到/WEB-INF/services/有 一個檔案,檔案中方有  * 各種jpa產品的驅動路徑名稱,中查詢所有的jpa產品  * (hibernate,ibatis等等)的驅動,並且放到  * providers集合中,然後遍歷,最先找到哪個jpa產品的驅動可以做jpa指 定的工作,就用哪一個jar包;  *   * */ //執行上面這條語句的時候可以反向生成表 //--->sessionFactory-->session--->begin事物 EntityManager em=factory.createEntityManager(); em.getTransaction().begin();//開始事物         //Session.save()-->Persist();    Person person=em.getReference(Person.class, 1);    //Person person=em.getReference(Person.class, 8);    //如果不存在返回的是null值    //並且在這句話出現異常System.out.println(person.getName());  //上面得到的代理物件並沒有實現資料庫的查詢    //相當於hibernate的load方法 System.out.println(person.getName()); //這個方法當用到person.getName()的時候才發生載入資料 //注意讀取資料的時候是不需要開事物的 //只有更改的時候才需要;    em.getTransaction().commit(); em.close(); //System.out.println(person.getName()); //寫在這裡的話會報錯,因為在真正訪問資料庫的時候,管理bean已經關閉了     //EntityManager factory.close(); } @Ignore @Test public void updatePerson(){ EntityManagerFactory  factory=Persistence.createEntityManagerFactory("credream"); //執行上面這條語句的時候可以反向生成表 //--->sessionFactory-->session--->begin事物 EntityManager em=factory.createEntityManager(); em.getTransaction().begin();//開始事物         //Session.save()-->Persist();    Person person=em.getReference(Person.class, 1);    person.setName("一起創夢吧");    //在提交之前,jpa中是放在批處理的快取中.    em.getTransaction().commit(); em.close(); factory.close(); } /*  * 新建狀態:new Person("創夢網路") 託管狀態:1.跟事物關聯 2.託管狀態的時候  資料才可以更新到資料庫  person.setName("一起創夢吧"); 遊離狀態 刪除狀態*/ @Ignore @Test public void updatePerson2(){ EntityManagerFactory  factory=Persistence.createEntityManagerFactory("credream"); //執行上面這條語句的時候可以反向生成表 //--->sessionFactory-->session--->begin事物 EntityManager em=factory.createEntityManager(); em.getTransaction().begin();//開始事物         //Session.save()-->Persist();    Person person=em.find(Person.class, 1);    em.clear();//把實體管理器中的所有實體變成遊離狀態    person.setName("一起創夢吧");    //這時候不會報錯,但是不會修改資料庫    em.merge(person);    /*這時候就可以了替換了,用於把遊離狀態的更新同步到資料庫*/    //在提交之前,jpa中是放在批處理的快取中.    em.getTransaction().commit(); em.close(); factory.close(); } @Ignore @Test public void delete(){ EntityManagerFactory  factory=Persistence.createEntityManagerFactory("credream"); //執行上面這條語句的時候可以反向生成表 //--->sessionFactory-->session--->begin事物 EntityManager em=factory.createEntityManager(); em.getTransaction().begin();//開始事物         //Session.save()-->Persist();    Person person=em.find(Person.class, 1);    em.remove(person);    em.getTransaction().commit(); em.close(); factory.close(); } @Ignore @Test public void query(){ EntityManagerFactory  factory=Persistence.createEntityManagerFactory("credream"); //執行上面這條語句的時候可以反向生成表 //--->sessionFactory-->session--->begin事物 EntityManager em=factory.createEntityManager(); //sql注入攻擊 //String name=request.getParameter("name"); //select o from Person o where o.id=;delete form pserson //;delete form pserson這個時候會刪除表中的所有資料 //select o from Person o where o.id=:id //select count(o) from Person o where o.id=?1 //取得總數  1的作用是從id為1開始   Query query=em.createQuery("select o from Person o where o.id=?1");  //注意不是sql語言 jpaSql,=後面不要把值寫到後面   query.setParameter(1, 2);   //query.list();hibernate中得到的是;select count(*) from person   //query.uq()可以得到結果;    //Session session=null;   //session.createQuery("").uniqueResult();相當於query.getSingleResult();   //或者是這樣:   //List<Persons> persons=query.getResultList();   /*for(Person person: persons){   System.out.println(person.getName());   }*/   Person person=(Person) query.getSingleResult();   System.out.println(person.getName());  em.close(); factory.close(); } @Ignore @Test public void deletequery(){ EntityManagerFactory  factory=Persistence.createEntityManagerFactory("credream"); //執行上面這條語句的時候可以反向生成表 //--->sessionFactory-->session--->begin事物 EntityManager em=factory.createEntityManager(); em.getTransaction().begin();//注意要更新的時候需要開啟事物   Query query=em.createQuery("delete from Person o where o.id=?1");   query.setParameter(1, 2);   query.executeUpdate();    em.getTransaction().commit(); em.close(); factory.close(); } //@Ignore @Test public void updatequery(){ EntityManagerFactory  factory=Persistence.createEntityManagerFactory("credream"); //執行上面這條語句的時候可以反向生成表 //--->sessionFactory-->session--->begin事物 EntityManager em=factory.createEntityManager(); em.getTransaction().begin();//注意要更新的時候需要開啟事物 //注意jpql的使用   Query query=em.createQuery("update Person o set o.name=:name  o where  o.id=:id");   query.setParameter("name", "credream");   query.setParameter("id", 2);   query.executeUpdate();    em.getTransaction().commit(); em.close(); factory.close(); } } --------------------------------- 增加,刪除,修改的原理: 使用了類似於jdbc的驅動類,會在類路徑下查詢所有的可用驅動,這個驅動類是: Persistence.java類實現:在WEB-INF/services/在這裡查詢一個資源名稱,是 javax.persistence.spi.peritenceProvider這個檔案;如果找到這個檔案後,就遍歷, 放到集合中,這樣查詢驅動,然後連線,建立entityManagerFactory,這個檔案可以在 hibernate-entitymanager.jar包中的META-INF/services/下找到,entitymanager是對 sessionFactory做了一層封裝; -------------------------------------------------------------------------