概述
JPA是一种规范,保证了基于JPA开发的应用能够经过少量修改就可以在不同的JPA框架下进行。
搭建环境
创建maven工程 导入坐标
配置JPA的核心配置文件
- 配置到类路径下的META-INF,创建persistence.xml
- 导入约束 IDEA可以通过new->edit File Templates->JPA->persistence_2.0.xml 找到约束
- 配置persistence-unit节点 即持久化单元包含name:持久化单元名称、transaction-type:事务管理方式
- name可以随便取名
- transaction-type分为JTA 分布式管理 和 RESOURCE_LOCAL 本地事务管理
-
配置JPA的实现方式
-
配置数据库信息
-
配置可选配置 为了配置JPA实现方的配置信息
编写学生的实体类
配置实体类和表
类上:
- 对实体类设置@Entity注解
- @Table(name = "Student") 对应数据库的表
属性上:
- @Id 声明主键配置
- @GeneratedValue主键的生成策略
- @Colomun(name = "id") 属性映射字段
保存到数据库中
测试JPA的保存
- 加载配置文件创建工厂(实体管理器工厂)对象
EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
- 通过实体管理器工厂获取实体管理器
EntityManager entityManager = factory.createEntityManager();
- 获取事务对象 开启事务
// 根据实体管理器获取事务
EntityTransaction transaction = entityManager.getTransaction();
// 开启事务
transaction.begin();
- 完成增删改查操作
// 实例化对象
Student student = new Student();
student.setName("zzzf");
student.setAge(18);
student.setSex("男");
// 保存对象
entityManager.persist(student);
- 提交事务
// 提交事务
transaction.commit();
- 释放资源
// 关闭
entityManager.close();
factory.close();
细节问题
主键策略
-
@GeneratedValue(strategy = GenerationType.INDETITY) 语法
-
GenerationType.INDETITY 代表自增
要求底层数据库支持自增
- GenerationType.SEQUENCE 代表序列
要求底层数据库支持序列
- GenerationType.TABLE jpa提供的一种机制 通过一张数据库的形式帮助我们完成主键自增
- GenerationType.AUTO 由程序自动帮我们选择主键生成策略
增删改测试
抽取JPAUtil工具类
package com.my.utils;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class JPAUtil {
// JPA的实体管理器工厂
private static EntityManagerFactory factory;
// 使用静态代码块赋值
static {
// 该方法参数必须和persistence.xml中persistence-unit标签name属性取值一致
factory = Persistence.createEntityManagerFactory("myJpa");
}
/**
* 使用工厂管理器创建一个对象
* @return
*/
public static EntityManager getEntityManager(){
return factory.createEntityManager();
}
}
- 新增
Customer student = em.find(Student.class,1L);
使用find方法查询查询的就是当前客户对象本身,在调用的时候就会发送sql语句查询
Customer customer = em.getReference(Customer.class,1L); 使用getReference方法查询查询的是一个动态代理对象,当调用查询结果对象的时候,才会发送sql查询,即延迟加载(懒加载)
- 删除
em.remove(student)
EntityManager entityManager = JPAUtil.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Student student = entityManager.find(Student.class, 1);
entityManager.remove(student);
transaction.commit();
entityManager.close();
- 修改
em.merge(student)
JPQL查询
概述
SQL:查询的是表和表中的字段
JPQL:查询的是实体类和类中的属性
两者语法非常相似
查询全部
@Test
public void testFindAll(){
EntityManager entityManager = JPAUtil.getEntityManager();
String jpql = "from Student";
Query query = entityManager.createQuery(jpql);
List resultList = query.getResultList();
for(Object obj : resultList){
System.out.println(obj);
}
entityManager.close();
}
分页查询
@Test
public void testFindByPage(){
EntityManager entityManager = JPAUtil.getEntityManager();
String jpql = "from Student";
Query query = entityManager.createQuery(jpql);
// 设置第二页
query.setFirstResult(1);
// 每页1条数据 则第二页第一条
query.setMaxResults(1);
List resultList = query.getResultList();
for(Object obj : resultList){
System.out.println(obj);
}
entityManager.close();
}
统计查询
@Test
public void findCount(){
EntityManager entityManager = JPAUtil.getEntityManager();
String jpql = "select count(id) from Student";
Query query = entityManager.createQuery(jpql);
Object count = query.getSingleResult();
System.out.println(count);
}
条件查询
@Test
public void testFindByCondition(){
EntityManager entityManager = null;
try {
entityManager = JPAUtil.getEntityManager();
String jpql = " from Student where name like ?1 ";
Query query = entityManager.createQuery(jpql);
query.setParameter(1,"%w%");
Object singleResult = query.getSingleResult();
System.out.println(singleResult);
} catch (Exception e) {
e.printStackTrace();
} finally {
entityManager.close();
}
}
排序
@Test
public void testOrder(){
EntityManager entityManager = JPAUtil.getEntityManager();
String jpql = "from Student order by id desc";
Query query = entityManager.createQuery(jpql);
List resultList = query.getResultList();
for(Object o : resultList){
System.out.println(o);
}
}