首页 > 其他分享 >Spring-data-jpa介绍

Spring-data-jpa介绍

时间:2022-11-01 10:31:29浏览次数:66  
标签:hibernate String jpa Spring 接口 JPA 等价 SQL data


ORM框架

JPA

实体Entity,具有ORM元数据的领域对象,POJO是实体的条件:

  1. 必须使用javax.persistence.Entity注解或XML映射文件中有对应的​​<entity>​​元素;
  2. 必须具有一个不带参数的构造函数,类不能声明为final,方法和需要持久化的属性也不能声明为final;
  3. 如果游离态的实体对象需要以值的方式进行传递(如通过Session bean的远程业务接口传递),则必须实现Serializable接口;
  4. 需要持久化的属性,起访问修饰符不能是public,它必须通过实体类方法进行访问。

实体共有4种状态:

  1. 新建态:新创建的实体对象,尚未拥有持久化主键,没有和一个持久化上下文关联起来
  2. 受控态:已经拥有持久化主键和持久化上下文建立了联系
  3. 游离态:拥有持久化主键,但尚未和持久化上下文建立联系
  4. 删除态:拥有持久化主键,已经和持久化上下文建立了联系,但已经被安排从数据库中删除

GenerationType中定义几种可以供选择的策略:

  1. 表自动增长字段,Oracle不支持这种方式;Identity
  2. JPA自动选择合适的策略,默认选项;AUTO
  3. 通过序列产生主键,通过@SequenceGenerator注解指定序列名,Mysql不支持这种方式。Sequence
  4. 通过表产生主键,框架借由表模拟产生主键,使用该策略可以使用更易于数据库的移植。TABLE

TemporalType枚举中定义三种时间类型:

  • Date:等于java.sql.Date;
  • Time:等于java.sql.Time;
  • TimeStamp:等于java.sql.Timestamp。

InheritanceType定义3种映射策略:
SINGLE_TABLE:父子类都保存在同一个表中,通过字段值进行区分。
JOINED:父子类相同的部分保存在同一个表中,不同的部门分开存放,通过连接不同的表获取完整数据。
TABLE_PER_CLASS:每一个类对应自己的表,一般不推荐采用这种方式。

Hibernate

JPA的参考实现,Hibernate主要有三个组件:hibernate-annotation、hibernate- entitymanager和hibernate-core。
hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括标准的JPA annotation以及Hibernate自身特殊功能的annotation。
hibernate-core是Hibernate的核心实现,提供核心功能。
hibernate-entitymanager实现标准的JPA,可以把它看成hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。

HibernatePersistence实现JPA的PersistenceProvider接口,提供 createEntityManagerFactory和createContainerEntityManagerFactory两个方法来创建 EntityManagerFactory对象,这两个方法底层都是调用的EJB3Configuration对象的 buildEntityManagerFactory方法,来解析JPA配置文件persistence.xml,,并创建 EntityManagerFactory对象。

EntityManagerFactory对象的实现是EntityManagerFactoryImpl类,这个类有一个最重要的属性就是Hibernate的核心对象之一SessionFactory。这个类最重要的方法是createEntityManager,来返回 EntityMnagaer对象,而sessionFactory属性也传入了该方法。

EntityManager对象的实现是EntityManagerImpl类,这个类继承自AbstractEntityManagerImpl 类,在AbstractEntityManager类中有一个抽象方法getSession来获得Hibernate的Session对象,正是在这个 Session对象的实际支持下,EntityManagerImpl类实现了JPA的EntityManager接口的所有方法,并完成实际的ORM操 作。

此外,hibernate-entitymanager包中还有QueryImpl类利用EntityManagerImpl的支持实现了JPA的 Query接口;TransactionImpl利用EntityManagerImpl的支持实现了JPA的EntityTransaction接口。

JPA vs mybatis

JPA是规范,实现有Hibernate和Spring Data JPA。

  1. JPA是对象与对象之间的映射,而mybatis是对象和结果集的映射。
  2. JPA移植性比较好,不用关心用什么数据库,因为mybatis自由写SQL语句,所以当项目移植的时候还需要改sql。(及时判断数据库类型,不嫌累么)。
  3. 当需要修改字段的时候mybatis改起来特别费事,而JPA就相对简单。
  4. hibernate学习曲线陡峭,Spring Data JPA改善这一状况;mybatis比较简单。

简介

Spring Data作为SpringSource的其中一个子项目,旨在统一和简化对各类型持久化存储和访问,而不拘泥于是关系型数据库还是NoSQL数据存储,使得对数据库的访问变得方便快捷,并支持MapReduce框架及云计算服务;对于拥有海量数据的项目,可以用Spring Data来简化项目的开发,就如Spring Framework对JDBC、ORM的支持一样,Spring Data会让数据的访问变得更加方便,极大提高开发效率。
spring-data包括很多不同数据库的工程,如Redis,neo4j。

使用

示例:

public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
@Query("from User u where u.name=:name")
User findUser(@Param("name") String name);
}

只需要通过编写一个继承自JpaRepository的接口就能完成数据访问。
特性:通过解析方法名创建查询。另外,提供通过使用@Query来创建查询,需要编写JPQL语句,并通过类似“:name”来映射@Param指定的参数。@Query默认不支持原生态sql,需要用​​​nativeQuery=true​​​开启。
还有诸如@Modifying操作、分页排序、原生SQL支持以及与Spring MVC的结合使用。

Repository子接口

接口

用途

​CrudRepository extends Repository​

实现CRUD相关方法

​PagingAndSortingRepository extends CrudRepository​

实现分页排序相关方法

​JpaRepository extends PagingAndSortingRepository​

实现JPA规范相关方法

其他:

  1. Repository是一个空接口,即标记接口(没有包含方法的接口)
  2. 如果定义的(dao层)接口没有继承Repository运行时会报错
  3. 也可以通过注解方式定义dao层接口
    ​​​@RepositoryDefinition(domainClass=实体类.class,idClass=主键类型.class)​

常用关键字

  • And — 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);
  • Or — 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);
  • Between — 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);
  • LessThan — 等价于 SQL 中的 “<”,比如 findBySalaryLessThan(int max);
  • GreaterThan — 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min);
  • After—等价于where startDate>?,比如findByStartDateAfter;
  • Before—等价于where startDate<?,比如findByStartDateBefore;
  • IsNull — 等价于 SQL 中的 “is null”,比如 findByUsernameIsNull();
  • IsNotNull — 等价于 SQL 中的 “is not null”,比如 findByUsernameIsNotNull();
  • NotNull — 与 IsNotNull 等价;
  • Like — 等价于 SQL 中的 “like”,比如 findByUsernameLike(String user);
  • NotLike — 等价于 SQL 中的 “not like”,比如 findByUsernameNotLike(String user);
  • OrderBy — 等价于 SQL 中的 “order by”,比如 findByUsernameOrderBySalaryAsc(String user);
  • Not — 等价于 SQL 中的 “! =”,比如 findByUsernameNot(String user);
  • In — 等价于 SQL 中的 “in”,比如 findByUsernameIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
  • NotIn — 等价于 SQL 中的 “not in”,比如 findByUsernameNotIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
  • StartingWith,findByFirstnameStartingWith==​​where firstname like (parameter bound with appended %)​
  • EndingWith,findByFirstnameEndingWith==​​where firstname like (parameter bound with prepended %)​​;
  • Containing,findByFirstnameContaining==​​where firstname like (parameter bound wrapped in %)​​;
  • TRUE,findByActiveTrue(),where active = true;
  • FALSE,findByActiveFalse(),where active = false;

原理

Spring-data-jpa依赖于Hibernate:​​spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop​​ 其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

  • create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  • create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
  • update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
  • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

进阶

自定义接口

spring data jpa 提供方便快捷的查询数据库方式,只要按照它的约定,编写接口和函数定义,即可很方便的从数据库中查询到想用的数据。但是每个应用业务逻辑的复杂度不同,有时候是必须要自己定义JPQL甚至native sql 来做自己的查询。

  1. 自定义查询接口。
public interface CustomizedLogRepository {    
List<LogDto> searchLogs(String appId, String keyword);
long searchLogCount(String appId, String keyword);
}
  1. 创建一个接口,该接口 extends JpaRepository 或者 CurdRepository, 以及上面自己定义的接口 CustomizedLogRepository
public interface LogRepository extends CrudRepository<LogDto, Integer>, CustomizedLogRepository {
}
  1. 实现LogRepository
public class LogRepositoryImpl implements CustomizedLogRepository {
@Autowired
@PersistenceContext
private EntityManager entityManager;

@Override
public List<Ankonlog> searchLogs(String appId, String keyword) {
}
@Override
public long searchLogCount(String appId, String keyword) {
}
}

至此,自定义JPQL查询完成。

参考

​​Spring Data JPA 自定义查询​​


标签:hibernate,String,jpa,Spring,接口,JPA,等价,SQL,data
From: https://blog.51cto.com/u_15851118/5811990

相关文章

  • Java 基于 SpringCloud 数据中台 ETL 工具,可以进行多种常见数据库之间的数据或结构迁
    基于SpringCloud数据中台ETL工具,可以进行多种常见数据库之间的数据或结构迁移提供源端数据库向目的端数据库的批量迁移同步功能,支持数据的全量和增量方式同步。包括:......
  • SpringBoot笔记:Hello World
    SpringBoot简化了Spring应用的初始框架搭建和开发过程,利用SpringBoot框架可以快速的进行Spring应用的开发,SpringBoot具有以下特性:能够快速创建基于Spring的应用程序。提......
  • SpringCloudAlibaba 主要组件与nacos 填坑记录
    SpringCloudAlibaba主要功能与实现组件(1)SpringCloudAlibaba主要功能与实现组件【功能与实现组件:】服务限流降级:基本说明:默认支持WebServlet、WebF......
  • SpringMVC
    SpringMVCMVC:模型(dao,service) 视图(jsp) 控制器(servlet)前端 数据传输 实体类实体类:用户名,密码,生日,爱好,,,,前端:用户名,密码pojo:Uservo:UserVo假设:你的项目的......
  • SpringMVC笔记
    目录一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式:warc>引入依赖3、配置web.xm......
  • Spring
    Spring框架概述Spring是轻量级开源的JavaEE框架Spring可以解决企业应用开发的复杂性Spring有两个核心部分:IOC和AOP(1)IOC:控制反转,把创建对象过程交给Spring容......
  • 模板注入--Spring boot Thymeleaf 模板注入
    Thymeleaf模板安全分析1、Thymeleaf简介Thymeleaf是用于Web和独立环境的现代服务器端Java模板引擎。类似与pythonweb开发中的jinja模板引擎。顺便说一句,Thymeleaf是spr......
  • Springboot导出word,动态填充表格数据
    原文链接:https://blog.csdn.net/qq_23126581/article/details/125446459背景本文将给大家带来如何导入数据到word文档中,固定传值和动态制作表格传值等。依赖:<!-......
  • Spring的事件机制
    Spring的事件包含三部分事件(ApplicationEvent):继承自jdk的EventObject,所有的事件都需要继承ApplicationEvent,并且通过构造器参数source得到事件源.应用事件监听器(A......
  • WPF DataGrid 按 Enter 移动到下一个单元格 开启编辑
    MoveFocustoNextCellonEnterKeyPressinWPFDataGrid?BegineditmodeonkeypresswithDataGridTemplateColumnWPF中DataGrid按Enter移动到下一个单元格开启......