1.什么是JPA?(JPA规范本质上就是一种ORM规范。

全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。

为我们提供了:

1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中,Object·/Relation Mapping 对象/关系数据库映射,它完成的是面向对象的编程语言到关系型数据库的映射,可以理解为ORM其实就是应用程序和数据库的桥梁;

如:@Entity、@Table、@Column、@Transient等注解。

2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

如:entityManager.merge(T t);

3)JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

如:from Student s where s.name = ?

但是:

JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。

也就是说:

JPA是一套ORM规范,Hibernate实现了JPA规范!

2.什么是spring data jpa?

spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。

3.JPQL?(JPA提供的是JPQL查询语言

jpql与SQL的区别就是SQL是面向对象关系数据库,他操作的是数据表和数据列,而jpql操作的对象是实体对象和实体属性 。jpql的查询语句设计非常简单。主要是由于Query接口来完成的,而我们的Query接口是由EntityManager创建出来的。

3.1)JPQL 查询基本格式

Query createNamedQuery(String name)创建查询的名称来创建一个命名查询,使用sql和jpql都可以
Query createNativeQuery(String SQLString)根据的原生的sql语句查询
QuerycreateQuery(String jpqlString)根据指定的JPQL语句创建一个查询

3.2)JPQL 执行基本格式

List getResultList()执行JPQL的select语句,并且返回的是list集合
Object getSingleResult()执行返回的那个结果的select语句
int executeupdate()表示执行批量的删除和更新
Query setFirstResult(int  startPosition)设置查询结果从第几条记录开始
Query setMaxResults(int maxResult)表示设置查询最多返回几条语句

4.JPA入门小demo

4.1)创建Maven工程(jar

4.2)在src/main/java下创建cn.zf.entity.Customer类

package cd.zf.entity;import javax.persistence.*;// jpa的实体类//配置实体类和数据库表的映射关系
@Entity
@Table(name="cst_customer")
public class Customer {// 配置主键生成的策略(主键自增@GeneratedValue(strategy = GenerationType.IDENTITY)// 配置主键使用的字段@Id@Column(name="cust_id")private long custId;@Column(name="cust_name")private String custName;@Column(name="cust_source")private String custSource;@Column(name="cust_industry")private String  custIndustry;@Column(name="cust_level")private String custLevel;@Column(name="cust_address")private String custAddress;@Column(name="cust_phone")private String custPhone;public long getCustId() {return custId;}public void setCustId(long custId) {this.custId = custId;}public String getCustName() {return custName;}public void setCustName(String custName) {this.custName = custName;}public String getCustSource() {return custSource;}public void setCustSource(String custSource) {this.custSource = custSource;}public String getCustIndustry() {return custIndustry;}public void setCustIndustry(String custIndustry) {this.custIndustry = custIndustry;}public String getCustLevel() {return custLevel;}public void setCustLevel(String custLevel) {this.custLevel = custLevel;}public String getCustAddress() {return custAddress;}public void setCustAddress(String custAddress) {this.custAddress = custAddress;}public String getCustPhone() {return custPhone;}public void setCustPhone(String custPhone) {this.custPhone = custPhone;}@Overridepublic String toString() {return "Customer{" +"custId=" + custId +", custName='" + custName + '\'' +", custSource='" + custSource + '\'' +", custIndustry='" + custIndustry + '\'' +", custLevel='" + custLevel + '\'' +", custAddress='" + custAddress + '\'' +", custPhone='" + custPhone + '\'' +'}';}
}

4.3)在src/main/resources下创建MATA-INF/persistence.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"><!--配置持久化单元   name:持久化单元的名称--><!--transaction-type:事物的类型--><!--RESOURCE_LOCAL  单数据库的事务--><!--JTA:  分布式事务 跨数据库的事务--><persistence-unit name="myjpa" transaction-type="RESOURCE_LOCAL"><properties><!--数据库连接属性配置--><property name="javax.persistence.jdbc.user" value="root"/><property name="javax.persistence.jdbc.password" value="123456"/><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/><property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/springdatajpa9502"/><!--hibernate属性配置--><!--是否显示sql 语句  在控制台--><property name="hibernate.show_sql" value="true"/><!--是否格式化sql 语句--><property name="hibernate.format_sql" value="true"/><!--是否自动 创建数据库的表--><!--值:update   程序自动创建表 假如有这个表就不在创建--><!--create   程序自动创建表  有  先删  再创建--><!--none   不会创建表--><property name="hibernate.hbm2ddl.auto" value="update"/></properties></persistence-unit>
</persistence>

4.4)在src/test/java下创建cn.zf.test.JpaCRUDTest类

package cn.zf.test;import cd.zf.entity.Customer;
import org.junit.Before;
import org.junit.Test;import javax.persistence.*;
import java.util.List;public class JpaCRUDTest {//将EntityManagerFactory对象提出来使用(没有将EntityManager对象提出来是因为执行的操作时多例的,所关闭的线程不是同一个private EntityManagerFactory entityManagerFactory;//@Before在方法执行之前执行该注解下的方法@Before//创建EntityManagerFactory对象public void init(){entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");}/*循环添加数据*/@Testpublic void addCustomer(){//通过EntityManagerFactory对象创建EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//通过EntityManager对象获得事务EntityTransaction transaction = entityManager.getTransaction();//开启事务transaction.begin();//循环插入数据for (int i = 0; i < 20; i++) {Customer customer = new Customer();customer.setCustIndustry("hh");customer.setCustSource("爱格");customer.setCustPhone("456789");customer.setCustName("斗牛");customer.setCustAddress("西班牙");customer.setCustLevel("5");entityManager.persist(customer);}//提交事务transaction.commit();//关闭资源(没有关闭entityManagerFactory是因为后面要使用entityManager.close();}/*删除数据*/@Testpublic void delCustomer(){//通过EntityManagerFactory创建EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//通过EntityManager获得事务EntityTransaction transaction = entityManager.getTransaction();//开启事务transaction.begin();//使用EntityManager的find方法查询id为1的数据(先查询,后删除Customer customer = entityManager.find(Customer.class, 1l);//使用EntityManager的remove方法删除id为1的数据entityManager.remove(customer);//提交事务transaction.commit();//关闭资源entityManager.close();}/*更新数据*/@Testpublic void updateCustomer(){//通过EntityManagerFactory创建EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//通过EntityManager获得事务EntityTransaction transaction = entityManager.getTransaction();//开启事务transaction.begin();//通过EntityManager的find方法查询id为4的数据Customer customer = entityManager.find(Customer.class, 4l);//重新为id=4的数据赋值customer.setCustLevel("1");customer.setCustAddress("法国");customer.setCustPhone("456789");customer.setCustIndustry("78");customer.setCustSource("heart");customer.setCustName("小镇");//通过EntityManager的merge方法更新数据entityManager.merge(customer);//提交事务transaction.commit();//关闭资源entityManager.close();}/*根据id查询(使用EntityManager对象的getReference方法*/@Testpublic void getByIdCustomer(){//通过EntityManagerFactory获得EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//getReference是延时加载,getReference方法执行后 访问对象的属性时才执行(查询id为4的数据Customer reference = entityManager.getReference(Customer.class, 4l);System.out.println("哈哈哈哈哈哈哈哈哈哈哈哈哈哈");System.out.println(reference);//关闭资源entityManager.close();}/*根据id查询(使用EntityManager对象的find方法*/@Testpublic void findByIdCustomer(){//通过EntityManagerFactory获得EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//find方法是及时加载,find方法执行后SQL语句才执行Customer customer = entityManager.find(Customer.class, 4l);System.out.println("哈哈哈哈哈哈哈哈哈哈哈哈哈哈");System.out.println(customer);//关闭资源entityManager.close();}//JPQL查询所有@Testpublic void findAll(){//通过EntityManagerFactory工厂对象获得EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//通过EntityManager对象的createQuery方法创建查询条件(使用entityManager对象创建一个query对象 基于jpql创建Query query = entityManager.createQuery("from Customer");//通过查询对象获得结果集List<Customer> resultList = query.getResultList();//遍历结果集for (Customer customer : resultList) {System.out.println(customer);}//关闭资源entityManager.close();}//分页@Testpublic void findAllWithPage(){//通过EntityManagerFactory工厂对象获得EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//通过EntityManager对象的createQuery方法创建查询条件(使用entityManager对象创建一个query对象 基于jpql创建Query query = entityManager.createQuery("from Customer");//设置开始查询的下标(下标从0开始query.setFirstResult(0);//设置每页的条数query.setMaxResults(5);//通过query查询对象获得结果集List<Customer> resultList = query.getResultList();//遍历结果集for (Customer customer : resultList) {System.out.println(customer);}//关闭资源entityManager.close();}//根据id查@Testpublic void findById(){//通过EntityManagerFactory工厂对象创建EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//通过EntityManager对象的createQuery方法创建查询条件(使用entityManager对象创建一个query对象 基于jpql创建Query query = entityManager.createQuery("from Customer where custId=?");//通过query查询对象设置查询条件(第一个参数:从第一个开始查 第二个参数:查询id为3的数据query.setParameter(1,3l);//通过query的getSingleResult方法获得数据(getSingleResult查询结果为一个时使用Customer singleResult = (Customer) query.getSingleResult();System.out.println(singleResult);//关闭资源entityManager.close();}//根据name查@Testpublic void findByName(){//通过EntityManagerFactory工厂对象创建EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//通过EntityManager对象的createQuery方法创建查询条件(使用entityManager对象创建一个query对象 基于jpql创建Query query = entityManager.createQuery("from Customer where custName like ?");//通过query查询对象设置查询条件(第一个参数:从第一个开始查 第二个参数:查询name中含有1的数据query.setParameter(1,"%1%");//执行查询,通过query的getResultList方法获得数据(getResultList查询结果为集合时使用List<Customer> resultList = query.getResultList();//遍历集合for (Customer customer : resultList) {System.out.println(customer);}//关闭资源entityManager.close();}//排序@Testpublic void findAllWithOrder(){//通过EntityManagerFactory工厂对象创建EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//通过EntityManager对象的createQuery方法创建查询条件(使用entityManager对象创建一个query对象 基于jpql创建//asc升序 desc降序Query query = entityManager.createQuery("from Customer order by custId asc");//执行查询,通过query的getResultList方法获得数据(getResultList查询结果为集合时使用List<Customer> resultList = query.getResultList();//遍历集合for (Customer customer : resultList) {System.out.println(customer);}//关闭资源entityManager.close();}//聚合函数@Testpublic void findCount(){//通过EntityManagerFactory工厂对象创建EntityManager对象EntityManager entityManager = entityManagerFactory.createEntityManager();//通过EntityManager对象的createQuery方法创建查询条件(使用entityManager对象创建一个query对象 基于jpql创建Query query = entityManager.createQuery("select count(custId) from Customer");//通过query的getSingleResult方法获得数据(getSingleResult查询结果为一个时使用Long count = (Long) query.getSingleResult();System.out.println(count);//关闭资源entityManager.close();}
}

注:EntityManager(实体是与数据库映射的,但是没有起到持久化的作用,只有用上EntityManager的实体进行操作的时候才会有持久化能力

over~

JPA入门、JPQL相关推荐

  1. Spring Data 系列(二) Spring+JPA入门(集成Hibernate)

    通过[Spring Data 系列(一) 入门]的介绍,通过对比的方式认识到Spring提供的JdbcTemplate的强大功能.通过使用JdbcTemplate,操作数据库,不需要手动处理Conne ...

  2. JPA入门案例完成增删改查

    目录 一.ORM思想 二.JPA规范 三.搭建JPA的基础环境 1.创建数据库表 2.创建Maven工程导入坐标 3.创建JPA的核心配置文件 4.编写实体类,配置映射关系 四.入门案例--增删改查 ...

  3. JPA入门例子(采用JPA的hibernate实现版本)

    http://blog.csdn.net/hmk2011/article/details/6289151(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化AP ...

  4. JPA入门简介与搭建HelloWorld(附代码下载)

    场景 在学习JPA之前先来了解下JDBC与各大数据库的关系. 很久之前出现了很多数据库比如Mysql.Oracle.SqlServer.DB2等.这就导致了应用程序要连哪个数据库就要使用哪个数据库的A ...

  5. spring data jpa从入门到精通_程序员笔记:Spring Data JPA入门

    什么是JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为了 ...

  6. Spring Data JPA使用JPQL与原生SQL进行查询

    1.使用JPQL语句进行查询 JPQL语言(Java Persistence Query Language)是一种和SQL非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的SQL语 ...

  7. 最新《JPA入门到精通JAVA进阶项目实战》

    『课程介绍』: 通过对本课程的学习,能够对JPA能够有全面的认识,简化现有Java EE和Java SE应用开发工作.用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐 ...

  8. JPA 6.JPQL

    JPQL JPQL语言 JPQL语言,即 Java Persistence Query Language 的简称.JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同 ...

  9. 芋道 Spring Boot JPA 入门(一)之快速入门

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 RP ...

最新文章

  1. SXS完全查杀+预防方案2
  2. mysql 5.6 互为主从_mysql5.6主从同步,互为主从配置
  3. 在Windows下创建硬连接和文件夹连接点的工具
  4. 14岁上中科大、23岁博士毕业的袁岚峰,现在因“简单科普”上热搜,本人回应:科普和科研一样重要...
  5. matlab搜索路径
  6. 为什么博图中放置按下按钮无反应_为什么点击按钮没反应呢?
  7. 物联网离风口还差最关键一环?
  8. Android - 布局详解之LinearLayout与RelativeLayout
  9. 怎样成为一名更优秀的程序员?我总结出 7 条建议,希望对你们有帮助!
  10. raspberry pi_在Raspberry Pi上试用Docker
  11. JDK常见问题 环境变量配置
  12. 开元酒店在中国的签约及在营酒店规模正式超过600家
  13. C++string类常用方法
  14. Python常用库大全
  15. 2021年英国经济发展研究报告
  16. 2022-2028年中国长租公寓行业市场运行格局及发展策略分析报告
  17. 服务器版系统里无线网卡如何打开,笔记本无线网卡怎么打开 笔记本无线上网卡找不到网络解决方法...
  18. SpringBoot应用接入Prometheus+Grafana
  19. 第三方直播SDK对比|直播SDK如何选型
  20. 【java】使用一维数组实现评委打分功能

热门文章

  1. 【转】淡入淡出效果的实现
  2. 捍宇医疗冲刺科创板:拟募资17亿 曾通过港股聆讯但放弃IPO
  3. 金立ELIFE冠名第二季《中国好歌曲》 力挺中国原创
  4. (C语言)计算结构体大小——结构体内存对齐
  5. [H5]盒子模型的应用
  6. 西门子医疗上海诊断试剂基地正式投产!总投资近30亿元,年产能预计达6亿人次测试 | 美通社头条...
  7. C++map函数的用法
  8. 力扣刷题-阶乘尾数有多少个0
  9. 闪贷Dapp的调研及实现
  10. JsLint 的安装和使用