JPA学习---第八节:使用JPQL语句进行查询

1、JPQL 语句查询,代码如下:

@Test
public void query(){
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
    EntityManager em = factory.createEntityManager();
    // 命名参数查询或位参数查询
    Query query = em.createQuery("select p from Person p p.id = ?1");
    query.setParameter(1, 1);
    // 调用 getSingleResult() 方法,必须要有结果(也就是说数据库必须要有对应的数据),不然会保存
    Person person = (Person)query.getSingleResult();
    System.out.println(person.getName());
    em.close();
    factory.close();
}

2、删除查询,代码如下:

@Test
public void deletequery(){
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
    EntityManager em = factory.createEntityManager();
    em.getTransaction().begin();
    // 命名参数查询或位参数查询
    Query query = em.createQuery("delete from Person p where p.id = ?1");
    query.setParameter(1, 1);
    query.executeUpdate();
    em.getTransaction().commit();
    em.close();
    factory.close();
}

3、更新查询,代码如下:

@Test
public void updatequery(){
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
    EntityManager em = factory.createEntityManager();
    em.getTransaction().begin();
    // 命名参数查询
    Query query = em.createQuery("update Person p set name=:name where p.id = :id");
    query.setParameter("name", "hwl");
    query.setParameter("id", 3);
    query.executeUpdate();
    em.getTransaction().commit();
    em.close();
    factory.close();
}

4、详细代码:

package learn.jpa.junit.test;

import static org.junit.Assert.*;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import learn.jpa.bean.Person;

import org.junit.Test;

public class PersonTest {

    @Test
    public void save(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();   // 开启事务
        em.persist(new Person("hwl"));
        em.getTransaction().commit();
        em.close();
        factory.close();
    }

    /**
     * 查询
     */
    @Test
    public void getPerson(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        // 第一个参数表示 实体类   第二个参数表示 实体标识符
        Person person = em.find(Person.class, 1);
        System.out.println(person.getName());
        em.close();
        factory.close();
    }

    @Test
    public void getPerson2(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        // 第一个参数表示 实体类   第二个参数表示 实体标识符
        // 调用这个方法时,并不会立即从数据库中得到数据,只是返回一个代理对象
        Person person = em.getReference(Person.class, 1);
        // 当我们对代理对象的属性进行访问的时候,才会从数据库中获取数据
        // 如果执行以上方法,数据库中没有对应的数据,是不会报错的,会在执行 person.getName() 时才异常
        System.out.println(person.getName());
        em.close();
        factory.close();
    }

    @Test
    public void updatePerson(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        // 实体管理器已于事务关联
        em.getTransaction().begin();
        // 查找出来后 person 对象在 CPU 时处于托管状态
        // 这时调用实体类的 set 方法,可以对数据进行更改,但并不是立即更改,是放在 JDBC 的批处理交易库里面
        Person person = em.find(Person.class, 1);
        person.setName("zxx");
        // 调用事务提交后,会将数据同步到数据库中
        em.getTransaction().commit();
        em.close();
        factory.close();

        // 实体在 CPU 中有四种状态
        //第一种 新建(new) 第二种 托管(manage)  第三种 游离  第四种 删除
    }

    @Test
    public void updatePerson2(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        Person person = em.find(Person.class, 1);
        em.clear(); // 将实体管理器中的所有实体状态变成游离状态
        person.setName("zxx");
        em.merge(person); // 将游离状态的数据更新同步到数据库
        em.getTransaction().commit();
        em.close();
        factory.close();
    }

    @Test
    public void delete(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        Person person = em.find(Person.class, 1);
        em.remove(person);
        em.getTransaction().commit();
        em.close();
        factory.close();
    }

    @Test
    public void query(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        // 命名参数查询或位参数查询
        Query query = em.createQuery("select p from Person p p.id = ?1");
        query.setParameter(1, 1);
        // 调用 getSingleResult() 方法,必须要有结果(也就是说数据库必须要有对应的数据),不然会保存
        Person person = (Person)query.getSingleResult();
        System.out.println(person.getName());
        em.close();
        factory.close();
    }

    @Test
    public void deletequery(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        // 命名参数查询或位参数查询
        Query query = em.createQuery("delete from Person p where p.id = ?1");
        query.setParameter(1, 1);
        query.executeUpdate();
        em.getTransaction().commit();
        em.close();
        factory.close();
    }

    @Test
    public void updatequery(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        // 命名参数查询
        Query query = em.createQuery("update Person p set name=:name where p.id = :id");
        query.setParameter("name", "hwl");
        query.setParameter("id", 3);
        query.executeUpdate();
        em.getTransaction().commit();
        em.close();
        factory.close();
    }
}
时间: 2024-08-11 03:30:59

JPA学习---第八节:使用JPQL语句进行查询的相关文章

JPA学习(6)JPQL

JPQL语言,即 Java Persistence Query Language 的简称.JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异. JPQL语言的语句可以是 select 语句.update 语句或delete语句,它们都通过 Query 接口封装执行. 1.Query接口封装了执行数据库查询的相关方法.调用 EntityManager 的 createQuery.create NamedQuer

JPA学习笔记(12)——JPQL

Query接口 int executeUpdate() 用于执行update或delete语句. List getResultList() 用于执行select语句并返回结果集实体列表. Object getSingleResult() 3用于执行只返回单个结果实体的select语句. Query setFirstResult(int startPosition) 用于设置从哪个实体记录开始返回查询结果. Query setMaxResults(int maxResult) 用于设置返回结果实体

JPA学习笔记-JPQL

JPQL语言,即 JavaPersistence Query Language 的简称.JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异.JPQL语言的语句可以是 select 语句.update 语句或delete语句,它们都通过 Query接口封装执行 javax.persistence.Query Query接口封装了执行数据库查询的相关方法.调用 EntityManager的 createQuery

JPA学习(3)JPA API

在我们的jpa的helloworld中,我们看到了简单的一个jpa保存操作,下面就来好好学习一下,JPA最主要的几个类 1.基本的几个类: ①:Persistence 类是用于获取 EntityManagerFactory 实例.该类包含一个名为 createEntityManagerFactory 的 静态方法 . createEntityManagerFactory 方法有如下两个重载版本. 带有一个参数的方法以 JPA 配置文件 persistence.xml 中的持久化单元名为参数 我们

JPA学习(六、JPA_JPQL)

框架学习之JPA(六) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作:其二,Sun希望整合ORM技术,实现天下归一. 学习视频:尚硅谷框架jpa学习(有兴趣的同学留言邮箱) 使用软件:eclipse Java版本:jdk8 本节目录 六.JPA_JPQL 1.H

JPA学习笔记(5)——EntityManager相关

Persistence EntityManagerFactory EntityManager find方法 getReference方法 persist方法 remove方法 merge方法 情况1传入的对象没有id 情况2传入的对象有identityManager的缓存中没有该对象数据库中没有该记录 情况3传入的对象有identityManager的缓存没有该对象数据库中有该记录 情况4传入的对象有identityManager的缓存有该对象 flush方法 refresh方法 clear c

JPA学习笔记

一.JPA基础1.1 JPA基础JPA: java persistence api 支持XML.JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范 元数据:对象和表之间的映射关系 实体: entity,需要使用Javax.persistence.Entity注解或xml映射,需要无参构造函数,类和相关字段不能使用final关键字 游离状态实体以值方式进行传递,需要serializable JPA是一套规范.有很多框架支持(如Hibernate3.2以上.Toplink,一般用

JPA学习---第一节:JPA详解

一.详解 JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate.TopLink等ORM框架各自为营的局面.值得注意的是,JPA是在充分吸收了现有Hibernate.TopLink等ORM框架的基础上发展而来的,具有易于使用.伸缩性强等优点.从目前的开发社区的反应上看,JPA受到了极大的支持

JPA学习笔记-Hello world

Java Persistence API:用于对象持久化的 API Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层 JPA 是hibernate的一个抽象(就像JDBC和JDBC驱动的关系): –JPA 是规范:JPA 本质上就是一种  ORM 规范,不是ORM 框架 -- 因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由ORM 厂商提供实现 –Hibernate 是实现:Hibernate 除了作为