Spring data jpa
ORM思想
主要目的: 操作实体类就相当于操作数据库表
建立两个映射关系:
实体类和表的映射关系
实体类中属性和表中字段的映射关系
不在重点关注: sql语句
实现ORM框架: mybatis , hibernate
JPA概述
JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
JPA通过JDK 5.0注解描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。
1.注解介绍
@Entity // 作为hibernate 实体类
@Table(name = "cst_customer") // 映射的表明
public class CstCustomer implements Serializable {
private static final long serialVersionUID = 1L;
/**
* @Id:声明主键的配置
* @GeneratedValue:配置主键的生成策略
* strategy
* GenerationType.IDENTITY :自增,mysql
* * 底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增)
* GenerationType.SEQUENCE : 序列,oracle
* * 底层数据库必须支持序列
* GenerationType.TABLE : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增
* GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略
* @Column:配置属性和字段的映射关系
* name:数据库表中字段的名称
*/
@Id
@Column(name = "cust_id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long custId;
}
2.JPA的步骤
/**
* 测试jpa
* jpa的操作步骤:
* 1.加载配置文件的创建工厂(实体管理器工厂)对象
* 2.通过实体管理器工厂获取实体管理器
* 3.获取事务对象,开启事务
* 4.完成增删改的操作
* 5.提交事务(回滚事务)
* 6.释放资源
*/
@Test
public void test1() {
// 加载配置文件的创建工厂(实体管理器工厂)对象
EntityManagerFactory hibernateJPA = Persistence.createEntityManagerFactory("hibernateJPA");
// 获取实体类的管理器
EntityManager entityManager = hibernateJPA.createEntityManager();
// 获取事务
EntityTransaction tx = entityManager.getTransaction();
// 开启事务
tx.begin();
CstCustomer cstCustomer = new CstCustomer();
cstCustomer.setCustName("wangqiwen");
cstCustomer.setCustIndustry("教育");
entityManager.persist(cstCustomer);
// 提交事务
tx.commit();
// 释放资源
entityManager.close();
hibernateJPA.close();
}
jpa操作的操作步骤
1.加载配置文件创建实体管理器工厂
Persisitence:静态方法(根据持久化单元名称创建实体管理器工厂)
createEntityMnagerFactory(持久化单元名称)
作用:创建实体管理器工厂
2.根据实体管理器工厂,创建实体管理器
EntityManagerFactory :获取EntityManager对象
方法:createEntityManager
* 内部维护的很多的内容
内部维护了数据库信息,
维护了缓存信息
维护了所有的实体管理器对象
再创建EntityManagerFactory的过程中会根据配置创建数据库表
* EntityManagerFactory的创建过程比较浪费资源
特点:线程安全的对象
多个线程访问同一个EntityManagerFactory不会有线程安全问题
* 如何解决EntityManagerFactory的创建过程浪费资源(耗时)的问题?
思路:创建一个公共的EntityManagerFactory的对象
* 静态代码块的形式创建EntityManagerFactory
3.创建事务对象,开启事务
EntityManager对象:实体类管理器
beginTransaction : 创建事务对象
presist : 保存
merge : 更新
remove : 删除
find/getRefrence : 根据id查询
Transaction 对象 : 事务
begin:开启事务
commit:提交事务
rollback:回滚
4.增删改查操作
5.提交事务
6.释放资源
i.搭建环境的过程
1.创建maven工程导入坐标
2.需要配置jpa的核心配置文件
*位置:配置到类路径下的一个叫做 META-INF 的文件夹下
*命名:persistence.xml
3.编写客户的实体类
4.配置实体类和表,类中属性和表中字段的映射关系
5.保存客户到数据库中
ii.完成基本CRUD案例
persist : 保存
merge : 更新
remove : 删除
find/getRefrence : 根据id查询
iii.jpql查询
sql:查询的是表和表中的字段
jpql:查询的是实体类和类中的属性
* jpql和sql语句的语法相似
1.查询全部
2.分页查询
3.统计查询
4.条件查询
5.排序
3.find 和 getReference(延迟加载和立即加载)
使用find方法查询
1.查询的对象就是当前客户对象本身
2.在调用find方法的时候,就会发送sql语句查询数据库
使用getReference方法(懒加载)什么时候用什么时候才发送sql语句过去
1.获取的对象是一个动态代理的对象
2.调用getReference方法不会立即的发送sql语句去查询数据库
4.删除Remove
@Test
public void testRemove() {
EntityManager entityManager = JpaUtil.getEntityManager();
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
// 必须先查询
CstCustomer cstCustomer = entityManager.find(CstCustomer.class, 1L);
// 调用remove 方法完成删除功能
entityManager.remove(cstCustomer);
tx.commit();
entityManager.close();
}
5.更新Merge
@Test
public void testMerge() {
EntityManager entityManager = JpaUtil.getEntityManager();
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
// 必须先查询
CstCustomer cstCustomer = entityManager.find(CstCustomer.class, 2L);
// 调用merge 方法完成更新功能
cstCustomer.setCustIndustry("it教育");
entityManager.merge(cstCustomer);
tx.commit();
entityManager.close();
}
6.JPA中的复杂查询
使用: JPQL全称Java Persistence Query Language
// 查询全部
// 创建query对象
String jpql = "from Customer";
Query query = em<