现在的位置: 首页 > 综合 > 正文

JPA学习笔记—JPA数据的操作:增加,删除,修改,获取,使用JPOL进行查询

2018年04月05日 ⁄ 综合 ⁄ 共 6307字 ⁄ 字号 评论关闭

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做了一层封装;
-------------------------------------------------------------------------

抱歉!评论已关闭.