JPA学习笔记

JPA

ORM思想及JPA规范

ORM思想

JDBC对数据库的操作

实体类

public class User {
    private Integer userId;
    private String userName;
    private String address;
}

数据库表

CREATE TABLE t_user(
	id 			INT 	AUTO_INCREMENT,
    username 	VARCHAR,
    address		VARCHAR
)

JDBC操作步骤

  1. 准备语句

    String sql = "insert into t_user(username, address) values(?, ?)";

  2. 获取连接

    Connection con = DriverManger.getConnection(username, password, url);

  3. 创建statment

    PreparedStatment pst = con.PreparedStatment(sql);

  4. 对占位符进行赋值

    pst.setString(1, user.getUserName);

    pst.setString(2, user.getAddress);

  5. 发送查询

    pst.executeUpdate();

JDBC操作繁杂,如果实体类和数据库的表,实体类的属性和表的字段之间建立关系的话,sql的拼接就可以自动完成了。

ORM思想

实体类和数据库的表、实体类的属性和表的字段之间建立关系就实现了ORM思想

ORM思想:操作实体类就相当于操作数据表

Hibernate框架

实现了ORM思想的框架比较多,比较有代表性的有Mybatis,Hibernate

Hibernate是一个开源的关系映射框架,他对JDBC进行了非常轻量级的对象封装,将POJO与数据库表建立映射关系,是一个全自动的ORM框架。它可以自动生成SQL语句,自动执行

JPA规范

出现顺序:ORM思想->Hibernate框架->JPA规范

JPA规范内部是由接口和抽象类组成的,其思想跟JDBC规范是一样的

image-20210730125912321

image-20210730130211482

JPA基本使用

环境搭建

Maven坐标

lombok
log4j
mysqlDriver
junit
hibernate
c3p0  数据库连接池

JPA核心配置文件

配置到类路径的META-INF文件夹下,命名为persistence.xml,约束模板可以在idea中找到

image-20210803123207894

image-20210803123320429

客户实体类&映射关系

@Entity
@Table(name = "cst_customer")
public class Customer {
    @Id  // 声明主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 主键生成策略
    @olumn(name = "cst_id")
    private Long custId;
    @olumn(name = "cst_address")
    private String custAddress;
    @olumn(name = "cst_industry")
    private String custIndustry;
    @olumn(name = "cst_level")
    private String custLevel;
    @olumn(name = "cst_name")
    private String custName;
    @olumn(name = "cst_phone")
    private String custPhone;
    @olumn(name = "cst_source")
    private String custSource;
    
    //getter&setter
}

CRUD基本操作

使用的JPA规范,底层实现是Hibernate

image-20210803124111615

setCustIndustry

保存:persist

更新:merge

删除:remove

查找:find/getRefrence

立即加载vs延迟加载

JPQL的使用

JPA提供的插叙语句,跟sql语句很相似,只不过JPQL是面向对象的,它查询的是对象及对象的属性

sql:查询的是表和表中的字段

jpql:查询的是实体类和实体类中的属性

image-20210803125046900

查询全部:

sql:SELECT * FROM cst_customer

jpql:from com.yaohl0911.customer

分页查询:

统计查询:

条件查询:

排序查询:

Spring Data JPA

Spring Data JPA概述

Spring对JPA规范的封装

image-20210803125724086

Spring Data JPA入门操作

环境搭建

maven坐标

spring配置

实体类&映射关系

@Entity
@Table(name = "cst_customer")
public class Customer {
    @Id  // 声明主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 主键生成策略
    @olumn(name = "cst_id")
    private Long custId;
    @olumn(name = "cst_address")
    private String custAddress;
    @olumn(name = "cst_industry")
    private String custIndustry;
    @olumn(name = "cst_level")
    private String custLevel;
    @olumn(name = "cst_name")
    private String custName;
    @olumn(name = "cst_phone")
    private String custPhone;
    @olumn(name = "cst_source")
    private String custSource;
    
    //getter&setter
}

DAO层接口

只需要编写接口,不需要实现

需要继承两个接口:JpaRepository,JpaSpecificationExecutor(是不是过时了?),且提供对应的泛型

image-20210803130705220

image-20210803130922576

findOne/getOne

getOne需要加上事务的支持@Transactional

findOne用em.find实现,立即加载

getOne用em.getRefance实现,延迟加载(返回动态代理对象,什么时候用什么时候查询)

save

update

delete

findAll

count

exists

Spring Data JPA运行原理

JdkDynamicAopProxy

SimpleJpaRepository

image-20210803132158759

  1. 通过jdkDynamicAopProxy的invoke方法创建了一个动态代理对象,即SimpleJpaRepository
  2. SimpleJpaRepository当中封装了JPA的操作(借助JPA的ap完成数据库的CRUD)
  3. 通过Hibernate完成数据库的操作(封装了JDBC)

JPQL实现方式

Spring Data JPA复杂查询

借助接口中定义好的方法完成查询

多表操作

复杂查询

原文地址:https://www.cnblogs.com/yaohl0911/p/15108024.html