二、spring boot教程--集成JPA

一、JAP介绍

1.什么是JPA

全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。
为我们提供了:

  1. ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

如:@Entity、@Table、@Column、@Transient等注解。
2. JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

如:entityManager.merge(T t);
3)JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

如:from Student s where s.name = ?

JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。

2.什么是spring data jpa

spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。

二、具体配置与使用

1.配置依赖

添加Spring Data JPA 和 MySQL Connector,配置pom.xml文件,代码如下:

        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- spring data jpa-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

2.yml配置文件中配置jpa信息

spring:
  #数据库配置信息
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/deformation?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root
  #jpa配置信息
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    database: mysql
    properties:
      hibernate:
        format_sql: true

配置信息说明 :

  1. hbm2ddl.auto:自动创建|更新|验证数据库表结构
  2. show-sql:打印sql语句,方便调试
  3. database:指定数据库类型,本示例指定的是mysql

hbm2ddl.auto有四个属性:

  1. create:每次加载 hibernate 时都会删除上一次的生成的表,然后根据你的 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。[删除-创建-操作]

  2. create-drop:每次加载 hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。[删除-创建-操作-再删除]

  3. update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model 类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。[没表-创建-操作 | 有表-更新没有的属性列-操作]

4.validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。[启动验证表结构,验证不成功,项目启动失败]

3.实体类代码

新建实体类:
在包com.core.deformation.domain下新建实体Project.java

  1. 实体类需要使用 @Entity 注解标注
  2. 需要对实体类的属性进行标注,使用 @Id 标注主键
  3. 使用 @Column 标注非主键
package com.core.deformation.domain;

import org.hibernate.annotations.GenericGenerator;
import sun.security.util.Length;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "t_project")
@GenericGenerator(name ="jpa-uuid", strategy = "uuid")
public class Project {
    @Id
    @GeneratedValue(generator = "jpa-uuid")
    @Column(length = 32)
    private String projectId;
    @Column(length = 50)
    private String projectName;
    @Column(length = 32)
    private String companyId;
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;
    @Temporal(TemporalType.TIMESTAMP)
    private Date modifyTime;
    @Column(length = 32)
    private String createId;
    //get set部分省略
    @Override
    public String toString() {
        return "Project{" +
                "projectId='" + projectId + '\'' +
                ", projectName='" + projectName + '\'' +
                ", companyId='" + companyId + '\'' +
                ", createTime=" + createTime +
                ", modifyTime=" + modifyTime +
                ", createId='" + createId + '\'' +
                '}';
    }
}

4.生成数据库表结构

i.运行项目,生成数据库表结构

查看控制台日志会输出如下内容:

Hibernate: 
    
    create table t_project (
       project_id varchar(32) not null,
        company_id varchar(32),
        create_id varchar(32),
        create_time datetime,
        modify_time datetime,
        project_name varchar(50),
        primary key (project_id)
    ) engine=MyISAM

ii.查看数据表信息:

在这里插入图片描述

5.Repository层代码

在包com.core.deformation.repository下新建接口ProjectRepository.java并继承JpaRepository<T, ID> ,JpaSpecificationExecutor,具体代码如下:

package com.core.deformation.repository;

import com.core.deformation.domain.Project;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

public interface ProjectRepository extends JpaRepository<Project,String>, 
JpaSpecificationExecutor<Project> {
}

6.测试Repository

i.测试添加

 /**
     * 添加单元测试
     */
    @Test
    public void testSave() {
        //String uuid = UUID.randomUUID().toString().replace("-","");
        //System.out.println(uuid);
        Project project = new Project();
        project.setProjectId(UUIDUtil.getUUIDDispose());
        project.setCompanyId(UUIDUtil.getUUIDDispose());
        project.setCreateId(UUIDUtil.getUUIDDispose());
        project.setProjectName("测试项目一");
        project.setCreateTime(new Date());
        project.setModifyTime(new Date());

        Project entity = projectRepository.save(project);
        assert (entity.getProjectName().equals("测试项目一"));
    }

运行添加测试方法后,数据库会添加一条相应的数据,如下图所示:
在这里插入图片描述

ii.测试简单查询

    /**
     * 根据ID查询实体
     */
    @Test
    public void testFindById() {
        Optional<Project> optional = projectRepository.findById("4028810d7034c62b017034c636a70000");
        Project project = optional.get();
        System.out.println(project.toString());
        assert (project.getProjectName().equals("测试项目一"));
    }

iii.测试更新

    @Test
    public void testUpdate() {
        Optional<Project> optional = projectRepository.findById("4028810d7034c62b017034c636a70000");
        Project project = optional.get();
        System.out.println("更新前数据:"+project.toString());

        project.setProjectName("测试项目二");
        projectRepository.save(project);
        System.out.println("更新后数据:"+project.toString());

        assert (project.getProjectName().equals("测试项目二"));
    }

到止,JPA的基本使用方法已完,后续会陆续更新spring boot其他部分的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值