SpringBoot项目中使用SpringData-JPA持久化数据

目录

一、什么是JPA

二、SpringData-JPA与MybatisPuls的区别

三、项目中使用JPA

JPA常用注解

JPA进阶使用技巧


一、什么是JPA

​JPA是 Java Persistence API 的简称,中文名Java持久层API,其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术。

简单地说,JPA就是为POJO(Plain Ordinary Java Object)提供持久化的标准规范,即将Java的普通对象通过对象关系映射(Object-Relational Mapping,ORM)持久化到数据库。由于JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,因而具有易于使用、伸缩性强等优点。

Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 规范的基础上开发的一个框架,使用 Spring Data JPA 可以极大地简化JPA 的写法,可以在几乎不用写实现的情况下实现对数据库的访问和操作,除了CRUD外,还包括分页和排序等一些常用的功能。Spring Data JPA 还提供了对分页查询、自定义SQL、查询指定N条记录、联表查询等功能的支持JPA不是一种新的ORM框架,它的出现只是用于规范现有的ORM技术,它不能取代现有的Hibernate、TopLink等框架。相反,在采用JPA开发时,我们将仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。

二、SpringData-JPA与MybatisPuls的区别

JPA和MyBatis Plus是两种不同的ORM框架。

JPA是Java Persistence API的缩写,是Java EE的一部分,提供了一种标准的ORM框架,可以将Java对象映射到关系型数据库中。JPA提供了一些注解和API,可以方便地进行数据库操作,如增删改查等。

MyBatis Plus是MyBatis的增强版,是一种轻量级的ORM框架,也可以将Java对象映射到关系型数据库中。MyBatis Plus提供了一些便捷的API和代码生成器,可以快速地进行数据库操作,同时也支持自定义SQL语句。

两者的区别在于,JPA是一种标准的ORM框架,具有一定的规范性和通用性,但是使用起来相对复杂,需要掌握一些注解和API;而MyBatis Plus是一种轻量级的ORM框架,使用起来相对简单,但是需要手写SQL语句,不够规范化。

备注:

  • JPA移植性比较好,基本不用关心用什么数据源,例如从Oracle--》Mysql数据库迁移替换过程中,在业务复杂度不高的情况下,修改的持久化代码量很少;反之,MybatisPlus就需要改各种mapper.xml,适配复杂度较高;
  • 如果业务场景较为复杂,编写大量的关联嵌套查询MybatisPlus实现起来相对JPA又比较敏捷;但是JPA也是支持自定义的HQL和@Query注解等查询构造器的实现方式;

三、项目中使用JPA

  • 导入POM依赖

    org.springframework.boot
    spring-boot-starter-data-jpa
  • 配置application.yml
spring:
  server:
    port: 9000  //启动端口
  datasource:  //数据库配置
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/库名?useUnicode=true&characterEncoding=utf-8&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
    username: root
    password: root
  jpa:
    show-sql: true  //日志中显示sql语句

配置JPA相关注解

a.实体对象类

@Entity //实体名称
@Table(name = "usc_user_group_relation", schema = "unified_auth")//数据库+对应的数据表名称
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})
public class UscUserGroupRelation {
    private Long id;
    @ApiModelProperty(value = "用户组id")
    private Long uscUserGroupId;
    @ApiModelProperty(value = "主用户id")
    private Long uscBaseUserId;
    @ApiModelProperty(value = "组织id")
    private Long uscOrganizationId;

    @Id//主键标识
    @Column(name = "id")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Basic//属性对应数据库字段映射
    @Column(name = "usc_user_group_id")
    public Long getUscUserGroupId() {
        return uscUserGroupId;
    }

    public void setUscUserGroupId(Long uscUserGroupId) {
        this.uscUserGroupId = uscUserGroupId;
    }

    @Basic
    @Column(name = "usc_base_user_id")
    public Long getUscBaseUserId() {
        return uscBaseUserId;
    }

    public void setUscBaseUserId(Long uscBaseUserId) {
        this.uscBaseUserId = uscBaseUserId;
    }

    @Basic
    @Column(name = "usc_organization_id")
    public Long getUscOrganizationId() {
        return uscOrganizationId;
    }

    public void setUscOrganizationId(Long uscOrganizationId) {
        this.uscOrganizationId = uscOrganizationId;
    }

    @Override
    public String toString() {
        return "UscUserGroupRelation{" +
                "id=" + id +
                ", uscUserGroupId=" + uscUserGroupId +
                ", uscBaseUserId=" + uscBaseUserId +
                ", uscOrganizationId=" + uscOrganizationId +
                '}';
    }
}

b.数据访问接口XXX.Repositpry(类似Dao的作用类)

public interface UscUserGroupRelationRepository extends JpaRepository {

    @Transactional//只需要在执行增、删、改 提交事务的语句中需要加此注解
    void deleteAllByUscUserGroupId(Long id);

    @Transactional
    void deleteAllByUscBaseUserId(Long id);

    @Transactional
    void deleteAllByUscOrganizationIdAndUscUserGroupId(Long orgId, Long groupId);

    List findByUscUserGroupId(Long groupId);

    List findByUscBaseUserId(Long userId);

    List findByUscUserGroupIdAndUscOrganizationIdOrUscUserGroupIdAndUscOrganizationIdIsNull(Long groupId, Long orgId, Long groupId1);

    @Query(value = "select " +
            "uug.group_name, uug.group_code, " +
            "uug.group_status, uo.org_code, " +
            "uo.org_name, uo.org_style, " +
            "uo.org_status " +
            "from usc_user_group_relation uugr " +
            "left join usc_user_group uug on uugr.usc_user_group_id = uug.id " +
            "left join usc_organization uo on uugr.usc_organization_id = uo.id " +
            "where uugr.usc_base_user_id = ?1 " +
            "order by uugr.id asc ",
            nativeQuery = true
    )
//@Query 负责sql查询,可以用该注解来编写;
//nativeQuery = true,是代表通过绑定变量?1..?n来传参,例如:select id from usc_base_user_id where id = ?1
//nativeQuery = false,默认是使用实体来查询,,例如:select id from UscBaseUserInfo where  uscBaseUserId=1;
    List> queryAppV1UserGroup(Long userId);


    List findAllByUscBaseUserIdInAndUscUserGroupId(Iterable userIds, Long groupId);
}

JPA常用注解

@Entity    声明类为实体或表。
@Table    声明表名。
@Basic    指定非约束明确的各个字段。
@Embedded    指定类或它的值是一个可嵌入的类的实例的实体的属性。
@Id    指定的类的属性,用于识别(一个表中的主键)。
@Transient    指定的属性,它是不持久的,即:该值永远不会存储在数据库中。
@Column    指定持久属性栏属性。
@SequenceGenerator    指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。
@TableGenerator    指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。
@Transactional 只需要在执行增、删、改 提交事务的语句中需要加此注解   
@JoinColumn    指定一个实体组织或实体的集合。这是用在多对一和一对多关联。
@ColumnResult    参考使用select子句的SQL查询中的列名。
@ManyToMany    定义了连接表之间的多对多一对多的关系。
@ManyToOne    定义了连接表之间的多对一的关系。
@OneToMany    定义了连接表之间存在一个一对多的关系。
@OneToOne    定义了连接表之间有一个一对一的关系。
@NamedQuery    指定使用静态名称的查询。

JPA进阶使用技巧

Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍_大型项目使用jpa_架构悟道的博客-CSDN博客


相关日常使用遇到问题,持续更新中

你可能感兴趣的:(spring,boot,java,mybatis)