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