首页 > 其他分享 >spring-data-jpa

spring-data-jpa

时间:2023-02-14 18:45:39浏览次数:42  
标签:缓存 jpa spring 数据库 JPA 属性 data 主键 标注

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

相关文章

  • 关于DataTable的一些操作
    关于DataTable的一些操作 1.数据筛选:dt.AsEnumerable().Where(r=>r.Field<string>("Name").StartsWith("A")).FirstOrDefault(); 2.注意AsEnumerable不可连续......
  • springcloud之配置中心config
    1、指定读取的配置路径配置在application.yml文件里面server:port:${SERVER_PORT:10102}spring:application:name:configprofiles:active:${PR......
  • springcloud项目搭建遇到问题记录
    1.&yml文件配置Facets(表述了在Module中使用的各种各样的框架、技术和语言。这些Facets让IntellijIDEA知道怎么对待module内容,并保证与相应的框架和语言保持一致。)添加spri......
  • Spring的FactoryBean接口探秘
    今天接触到一个新项目,杰夫接口对外暴露一个接口:<!--发布服务alias可以改成自己的--><jsf:providerid="puDaoDataService"interface="com.jd.jrdp.exts.server.PuDao......
  • springcloud微服务搭建demo
    软件版本IDEA2022.3.1<兼容maven3.8.1及之前的所用版本>JDK1.8_64Maven3.8.2本demo只使用了服务发现与注册、Feign调用及负载均衡。不涉及熔断与......
  • 基于Spring MVC的前后端分离开发
    一.后台服务器端开发:先搭建一个springMVC项目1.新建一个web项目2.引入相关jar包,编写配置文件(1).引入spring包spring-framework-5.0.8.RELEASE,这个包里有相关Bean、co......
  • SpringBoot注解大全
    一、项目配置注解@SpringBootApplication:申明让springboot自动给程序进行必要的配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和@ComponentScan 三个......
  • 【老王读SpringMVC-3】根据 url 是如何找到 controller method 的?
    前面分析了request与handlermethod映射关系的注册,现在再来分析一下SpringMVC是如何根据request来获取对应的handlermethod的?可能有人会说,既然已经将request......
  • 【Spring-boot-route(十五)整合RocketMQ+(十六)使用logback生产日志文件】
    spring-boot-route(十五)整合RocketMQRocketMQ简介RocketMQ是阿里巴巴开源的消息中间件。目前已经贡献给Apache软件基金会,成为Apache的顶级项目。rocketMQ基本概念1.Producer......
  • springcloud sidecar 实现C语言调用语言模块
    以前对springcloud的印象停留在大项目功能模块的独立、负载均衡、熔断等功能。这次项目接触了另一个用法,多语言异构。以前Java调C都是用的JNA或者JNI,这次C调Java用了spring......