`
mzhj
  • 浏览: 228124 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

09、使用JPQL语句进行查询

阅读更多

 

查询语言(JPQL)
     这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

PersonTest.java

package junit.test;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.itcast.bean.Person;

public class PersonTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@Test
	public void save() {
		// 对实体bean进行操作,第一步应该获取什么对象啊? SessionFactory对象。
		// 这里用获取的EntityManagerFactory对象,这可以把它看成跟Hibernate的SessionFactory对象差不多的东西。
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();	// 开启事务。
		em.persist(new Person("传智播客"));
		em.getTransaction().commit();
		em.close();
		factory.close();

		// SessionFactory --> Session --> begin事务
	}

	/*
	 session.save(obj);
	 persist这方法在Hibernate里也存在,Hibernate的作者已经不太推荐大家用save方法,而是推荐大家用persist方法。
	 why? 首先并不是代码上的问题,主要是这个名字上的问题,因为我们把这个ORM技术叫做持久化产品,那么我们对某个对象持久化,应该叫持久化,而不应该叫保存,所以后来Hibernate的作者推荐用persist方法,这并不是功能的问题,主要是取名的问题,所以用推荐用persist方法。
	 */

	@Test
	public void query1() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		// 只是想获取数据,那么创建的查询语句可以不在事务里创建,不需要开启事务。
		// 但是如果想通过语句去更新数据库的话,就必须要打开事务了,否则不会保存成功。
		Query query = em.createQuery("select o from Person o where o.id = ?1");  //?1采用位置参数查询,?1表示一个参数。
		// 和Hibernate一样,都是面向对象的语句,不是sql语句。 里面出现的都是实体的名称和实体的属性。
		//?1表示第一个参数,后面可以用Query对象的setParameter方法设置这个参数的内容。参数可以不用从1开始,可以从2等其他数字开始。
		// JPA规范的写法前面是要加"select o"的(o是起的别名,名字可以任意),而Hibernate是可以省略的,但是如果你选用的JPA实现产品是Hibernate的话,不写也不会出错。但是可能移植到别的可持久化实现产品中就有可能出错,所以我们应该严格按照JPA规范来编写代码。
		query.setParameter(1, 1);  //设置第一个参数的值为1。
		/*
		 不要直接在上面的语句里写值,因为如果你用JDBC的话就会存在一个问题:注入sql工具,注入sql工具在ASP年代(00-03年),sql工具是个高峰期,就因为我们的开发人员把从请求参数里面得到参数值后,直接赋进去,那么这时候就可能有问题,如果别人输入的是正确的,那当然好咯,如果输入错误的,比如 String name = request.getParameter("name"); 假如name=";delete from Person"的话,那么sql语句会变成select o from Person o where o.id =;delete from Person, 这样在sql server数据库里面,必然会把数据表里面的数据全部删除掉,所以我们一定要注意sql工具,在开发应用时也要注意,所以在写参数的时候,不要把参数直接写进去,也不要采用字符串组拼的方式来使用,而是应该采用命名参数查询,或者位置参数查询,JPA里面也提供了两种,命名参数查询(:id)和位置参数查询(?); JPA里面提供了更方便的实现,可以给?编号,就是?后面跟数字。
		 */
		 //防sql注入其实就是参数设置的地方只能允许设置为一个参数,并且参数设置的方法还会去检查参数设置的合理性。如果是字符串拼接等方法就存在安全问题了。
		Person person = (Person) query.getSingleResult();
		// getSingleResult方法相当于Hibernate里的Session.createQuery("").uniqueResult();
		// 使用getSingleResult方法的前提是必须保证记录存在,如果记录不存在,那么会出错的。这个方法还需要query对象里的记录是唯一的,有多个记录也会出错。
		System.out.println(person.getName());
		em.close();
		factory.close();
	}

	@Test
	public void query2() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		Query query = em.createQuery("select o from Person o where o.id = ?1");
		query.setParameter(1, 1);
		List<Person> persons = query.getResultList();  //返回的是一个list,这里指定了list的泛型是Person类型的。
		
		for (Person person : persons) {
			System.out.println(person.getName());
		}
		em.close();
		factory.close();
	}

	@Test
	public void deleteQuery() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();	// 进行数据的更改操作,必须开启事务。
		Query query = em.createQuery("delete from Person o where o.id = ?1");
		query.setParameter(1, 1);
		query.executeUpdate();
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	@Test
	public void updateQuery() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();	// 开启事务。
		Query query = em.createQuery("update Person o set o.name = :name where o.id = :id");	// 采用命名参数查询。
		query.setParameter("name", "xxx");
		query.setParameter("id", 2);
		query.executeUpdate();
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
}

 

分享到:
评论

相关推荐

    09_传智播客JPA详解_使用JPQL语句进行查询

    在本课程"09_传智播客JPA详解_使用JPQL语句进行查询"中,我们将深入学习如何利用JPQL进行数据查询。 **课程内容概览:** 1. **JPQL基础**:讲解JPQL的基本语法,包括如何选择、从哪个实体中选择、以及如何使用...

    09_JPA详解_使用JPQL语句进行查询.zip

    在"09_传智播客JPA详解_使用JPQL语句进行查询"的课程中,你将深入学习如何利用JPQL进行复杂的查询,包括联合查询、子查询、分页查询以及使用JOIN操作来处理关联数据。通过这个课程,你可以掌握JPA的核心概念和实践...

    JPA详解视频教程 第9讲 使用JPQL语句进行查询.avi

    JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第9讲 使用JPQL语句进行查询.avi

    JPA加载_更新_删除对象及使用JPQL语句进行查询

    本篇文章将深入探讨JPA中的对象加载、更新、删除操作以及如何使用JPQL(Java Persistence Query Language)进行查询,这些都是Java开发者在处理持久化层时不可或缺的知识点。 首先,我们来看JPA的对象加载。JPA提供...

    JPA之使用JPQL语句进行增删改查

    JPA之使用JPQL语句进行增删改查 JPA(Java Persistence API...JPA之使用JPQL语句进行增删改查提供了强大且灵活的查询功能,能够满足各种复杂的业务需求。但是,在使用JPQL语句时,需要注意SQL注入问题和性能优化问题。

    EJB3.0查询语句JPQL用法

    动态查询允许在运行时构建JPQL语句,例如: ```java Query query = em.createQuery("select p from Person p where p.id=:id"); query.setParameter("id", 1033); ``` 这里的`Person`是实体类,`id`是实体属性,`:id...

    EJB3查询JPQL解析

    使用JPQL进行查询 使用JPQL查询通常涉及以下步骤: 1. 获取`EntityManager`实例,可以通过依赖注入或`EntityManagerFactory`来实现。 2. 调用`EntityManager`的`createQuery`方法,传入JPQL查询语句,创建`Query`...

    CH03-JPA的JPQL语句.pptx

    使用 Hibernate 的查询缓存 ORDER BY 和 GROUP BY 关联查询 子查询 和 JPQL 函数 UPDATE 和 DELETE

    EJB的JPQL语法

    总结,EJB的JPQL语法提供了一种强大的工具,使开发者能够在Java EE环境中以面向对象的方式进行数据查询,从而简化了与数据库的交互,提高了代码的可读性和可维护性。熟练掌握JPQL将极大地提升你在企业级应用开发中的...

    JPA 动态查询 Criteria JPQL 语法详解

    JPA 动态查询 Criteria JPQL 语法详解 JPA(Java Persistence API)是一种Java应用程序接口,用于访问、管理和持久化数据。JPA 2.0 引入了 Criteria API,它提供了一种动态查询机制,允许开发者在运行时构建查询...

    JPA JPQL常用

    这样,后续的代码可以直接调用`getPersonById`这个命名查询,而无需每次都编写相同的JPQL语句。 6. 关联查询 JPQL支持对关联对象的查询。例如,如果一个`Person`可以有多个`Order`,并且每个`Order`又包含多个`...

    JPA的JPQL语法总结

    - **复合条件**:可以使用多个条件进行组合查询,如: ```sql SELECT DISTINCT p1 FROM Player p1, Player p2 WHERE p1.salary &gt; p2.salary AND p2.name = :name ``` 返回薪资高于指定名字的`Player`的所有记录...

    jpql查询[定义].pdf

    总的来说,JPQL是JPA提供的强大工具,它允许开发人员以面向对象的方式编写数据库查询,同时利用ORM框架(如Hibernate)将这些查询自动映射到实际的SQL语句,从而简化了数据访问层的编程。通过熟练掌握JPQL,开发者...

    EJB_JPQL语言详解

    **JPQL(Java Persistence Query Language)** 是EJB 3.0引入的一种查询语言,专门用于在对象/关系映射(ORM)框架如JPA(Java Persistence API)中进行数据查询。JPQL与SQL类似,但它是面向对象的,允许开发者以类...

    基于JPQL实现纯SQL语句方法详解

    基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以...

    jpa查询详解

    JPQL(Java Persistence Query Language)是 JPA 中的一种查询语言,用于书写面向对象的查询语句。JPQL 查询可以用于检索、更新和删除数据。例如,在上面的示例代码中,我们使用了 JPQL 查询来检索 Person 实体: `...

    Hibernate生产SQL语句

    总结来说,模仿Hibernate生成SQL语句需要对Hibernate的ORM机制有深入理解,包括实体类的定义、属性映射、查询API的使用,以及Java反射的应用。通过这种方式,开发者可以自定义查询逻辑,同时利用Hibernate的强大功能...

    李勇JPA快速入门05_jpa中的查询

    JPQL和Criteria API都支持分页查询,例如,使用"SELECT u FROM User u ORDER BY u.name ASC"进行升序排序,并通过设置第一结果位置和最大结果数量实现分页。 8. **实体图形查询** JPA允许查询包含关联实体的结果...

Global site tag (gtag.js) - Google Analytics