JPA學習筆記---JPA資料的操作:增加,刪除,修改,獲取,使用JPQL進行查詢
阿新 • • 發佈:2019-01-27
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做了一層封裝; -------------------------------------------------------------------------