spring-data-jpa
一、什么是jpa?
查询语言:JPQL,面向对象的查询语句
1.1 相同处:
都跟数据库操作有关,JPA 是JDBC 的升华,升级版。
JDBC和JPA都是一组规范接口
1.2 不同处:
JDBC是由各个关系型数据库实现的, JPA 是由ORM框架实现
JDBC 使用SQL语句和数据库通信。 JPA用面向对象方式, 通过ORM框架来生成SQL,进行操作。
JPA在JDBC之上的, JPA也要依赖JDBC才能操作数据库。
二、JPA注解
@Entity
标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表
@Table
当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行
@Table标注的常用选项是 name,用于指明数据库的表名
@Table标注还有一个两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名。uniqueConstraints 选项用于设置约束条件,通常不须设置
@Id
标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前
@GeneratedValue
用于标注主键的生成策略,通过 strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略
在 javax.persistence.GenerationType 中定义了以下几种可供选择的策略:
IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式
AUTO: JPA自动选择合适的策略,是默认选项
SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,MySql 不支持这种方式
TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植
@Column
当实体的属性与其映射的数据库表的列不同名时需要使用@Column 标注说明,该属性通常置于实体的属性声明语句之前,还可与 @Id 标注一起使用
常用属性是 name,用于设置映射数据库表的列名。此外,该标注还包含其它多个属性,如:unique 、nullable、length 等
@Transient
表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性
如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic
@Temporal
在核心的 Java API 中并没有定义 Date 类型的精度(temporal precision). 而在数据库中,表示 Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者两者 兼备). 在进行属性映射时可使用 @Temporal 注解来调整精度
三、JPA API
1、缓存
一级缓存:会话级别,对同一个id进行两次加载,不会发送两条sql给数据库,但会话关闭,一级缓存就会失效
二级缓存:全局级别,一级缓存会话关闭,缓存也不会失效
2、EntityManager
在 JPA 规范中, EntityManager 是完成持久化操作的核心对象。实体作为普通 Java 对象,只有在调用 EntityManager 将其持久化后才会变成持久化对象。EntityManager 对象在一组实体类与底层数据源之间进行 O/R 映射的管理。它可以用来管理和更新 Entity Bean, 根椐主键查找 Entity Bean, 还可以通过JPQL语句查询实体。
实体的状态:
临时状态: 新创建的对象,尚未拥有持久性主键,不处于缓存中,数据库中也没有对应的记录
持久化状态:已经拥有持久性主键,位于缓存中,数据库中有对应记录
游离状态:拥有持久化主键,不处于缓存中,数据库中可能存在对应的记录
删除状态: 曾经位于缓存中,曾在数据库中有过记录,但现在已被删除
四、JPQL查询语言
一种对象化查询语言,可以编译成面向不同对象的查询语言,从而屏蔽不同数据库之间的差异
dao层类只要继承了JpaRepository,可以使用自带的CRUD的api
/** 修改方法和删除方法都需要添加@Modifying和@Transactional
@Transactional:是因为SpringData 的每个方法上有事务, 但都是一个只读事务。 他们不能完成修改操作,所以需要手动添加
@Modifying:JPQL实现DELETE和UPDATE操作的时候必须加上@modifying注解,以通知Spring Data 这是一个DELETE或UPDATE操作。
*/
// 查询某一个字段的时候需要指定相应的类型,select全量数据的使用直接使用别名n即可,原生的SQL需要使用n.*
@Query("select n.column1 as String from table n where n.column2 is null or n.column2 =''")
// 占位符从1开始,?1,?2, ...,参数@Param修饰,使用:
// nativeQuery = true,表示使用原生sql查询
五、 JPASpecificationExecutor接口
作用:提供了多条件查询支持,可以添加分页和排序
标签:缓存,jpa,spring,数据库,JPA,属性,data,主键,标注 From: https://www.cnblogs.com/zhixinghf/p/17120573.html