引言

关于Spring JPA

Spring JPA(Java Persistence API)是Java EE中关于持久化(即对象持久化到数据库)的标准规范,它为Java应用提供了一种与数据库交互的面向对象的方法。Spring Data JPA是Spring对JPA的实现,它极大地简化了数据持久化的操作。以下是Spring JPA的重要性和用途

重要性:
  1. 简化数据库操作: Spring JPA抽象了底层的数据库操作,使得开发者可以不用编写大量的JDBC代码,而是通过配置和简单的API调用来完成数据库的CRUD(创建、读取、更新、删除)操作。
  2. 对象关系映射(ORM): Spring JPA通过ORM技术,允许开发者以面向对象的方式处理数据库操作。这意味着可以在代码中直接操作对象,而Spring JPA会在后台将这些操作转换为相应的SQL语句。
  3. 提高开发效率: 由于Spring JPA提供了丰富的API和便捷的配置,开发者可以快速构建数据访问层,从而节省时间,提高开发效率。
  4. 数据访问的可移植性: Spring JPA定义了一套标准的数据访问接口,这意味着开发者可以使用相同的代码在不同的数据库之间进行切换,而不需要对代码进行大量修改。
  5. 减少错误和提高代码质量: 由于Spring JPA提供了声明式事务管理,可以减少因手动管理事务而导致的错误。同时,它还提供了缓存、延迟加载等高级特性,有助于提高代码的质量和性能。
  6. 集成Spring生态系统: Spring JPA与Spring框架的其他部分(如Spring MVC、Spring Security等)紧密集成,使得在Spring生态系统中构建企业级应用变得更加容易。
用途:
  1. 数据持久化: 将内存中的对象状态持久化到数据库中,以及从数据库中检索对象。
  2. 查询优化: 使用JPQL(Java Persistence Query Language)或Criteria API构建复杂的查询,这些查询比手写SQL更加易于维护和理解。
  3. 事务管理: 通过声明式或编程式事务管理来控制数据的一致性和完整性。
  4. 数据模型映射: 将数据库表映射到Java对象,以及处理对象之间的关联关系(如一对多、多对多)。
  5. 缓存管理: 使用二级缓存来提高数据访问的性能。
  6. 审计和日志记录: 跟踪实体的更改历史,这对于审计和调试非常有用。
  7. 批量操作和异步处理: 执行批量插入、更新和删除操作,以及异步处理数据,以提高性能。
  8. 多租户支持: 在SaaS应用中,Spring JPA可以支持多租户的数据隔离。
  9. 集成测试: 通过模拟数据库操作,可以轻松地进行集成测试,而不需要实际的数据库环境。

Spring JPA的这些特点和用途使其成为现代Java应用开发中不可或缺的一部分,特别是在需要与数据库交互的应用程序中。

关于YashanDB

YashanDB是一款企业级数据库管理系统,它具有以下特点和优势:

  1. 高性能并发处理: YashanDB通过细粒度并发控制、免锁事务优化和自适应并发调度算法,显著提高了执行性能。在TPC-C模型下的Benchmark测试中,YashanDB单节点事务吞吐量可达140万tpmC,性能较原有系统提升1.2-60倍。
  2. 有界计算能力: YashanDB提供有界计算能力,能够在大数据分析时,不需要访问全部数据,只需取其中的小数据集就能得到想要的答案。这使得在数据量从10GB增长到1TB时,YashanDB响应时延维持亚秒级,性能提升千倍以上且未衰减,极大地节约了计算资源。
  3. 核心替代和平滑迁移: YashanDB提供对Oracle生态的全面兼容,支持存量系统在语法、语义、PL/SQL等高级功能的完整兼容能力,实现平滑迁移。在某央企集团国产化替代实践中,YashanDB实现了99%以上的兼容程度。
  4. 企业级运维管控平台: YashanDB提供数据库全生命周期智能运维管控能力,支持自动化安装部署,巡检策略,以及全方位的诊断分析能力,大幅提升运维效率。
  5. “金字塔”体系保障业务连续性: YashanDB提供原生“金字塔”保障体系,形成从可用性、容错性、易恢复性到稳定性全方位的可靠性保障,消除业务停服风险,做到大负载下RTO<10s,RPO=0。
  6. 向量化执行引擎: YashanDB V22.2采用全新设计的MPP分布式架构,支持向量执行、SMP、冷热数据的静默转换和融合查询,在实时数据分析、多表关联查询、adhoc查询等场景均能提供高效的分析体验。
  7. 一站式企业级融合数据管理解决方案: YashanDB支持单机主备部署形态,并配套开发者工具、监控运维工具、数据迁移工具,满足不同场景的解决方案需求。
  8. 云原生和虚拟化部署: YashanDB提供云化部署解决方案,全面满足客户在存算分离、弹性扩展、高可用等方面的业务需求。
  9. 极致易用,全场景图形化工具: YashanDB提供E2E的全生命周期管理解决方案,搭建支持灵活部署、一键迁移、智能运维等功能的一站式工具体系。
  10. “1+3”服务体系: YashanDB提供“1+3”服务架构,即原厂提供的标准及高级服务,和由知识库、DBA及伙伴共同构建的服务能力,形成覆盖全行业、全区域的7*24快速响应及服务能力。

YashanDB的这些特点和优势使其在金融、政府、运营商、央国企等关键行业中具有强大的竞争力和广泛的应用前景。

教程的目的和预期读者

教程目的

本教程旨在为软件开发者、数据库管理员和IT专业人士提供一个全面的指南,以理解和实现Spring JPA与YashanDB的集成。通过本教程,读者将能够:

  1. 理解Spring JPA的基本概念和核心组件,以及它们如何与YashanDB数据库协同工作。
  2. 掌握Spring JPA与YashanDB集成的步骤,包括配置数据源、实体映射、仓库接口和事务管理。
  3. 学习如何使用Spring JPA进行数据访问和操作,包括CRUD操作、查询优化和高级特性如继承映射和多表关联。
  4. 探索性能优化和最佳实践,以确保应用程序在YashanDB上运行时的效率和稳定性。
  5. 了解如何进行故障排除和日志记录,以便在开发和生产环境中快速定位和解决问题。
预期读者

本教程面向以下类型的读者:

  1. 初级到中级Java开发者:对Java编程有一定的了解,希望学习如何使用Spring JPA和YashanDB进行数据库操作的开发者。
  2. 数据库管理员(DBA):需要了解如何配置和管理YashanDB数据库,以及如何与Spring JPA集成的数据库管理员。
  3. IT专业人士和系统架构师:负责设计和实施企业级解决方案,需要了解Spring JPA和YashanDB如何协同工作以满足业务需求的专业人士。
  4. 学生和教育工作者:正在学习数据库管理和Java企业级开发的学生,以及需要准备相关课程材料的教育工作者。
  5. 技术爱好者和自学者:对Spring JPA和YashanDB技术感兴趣,希望通过实践示例和教程来扩展知识的技术爱好者。
  6. 需要迁移到YashanDB的开发者:那些需要将现有应用程序从其他数据库迁移到YashanDB,并且希望利用Spring JPA简化这一过程的开发者。

本教程假设读者已经具备基本的Java编程知识和对数据库操作的一般理解。通过本教程的学习,读者将能够构建高效、可维护且可扩展的Spring JPA应用程序,这些应用程序可以在YashanDB上运行。

第1章:环境准备

  • 系统和软件要求
  • Java版本:1.8
  • Spring Boot版本:2.1.11.RELEASE
  • YashanDB版本:yashandb-personal-23.3.1.100
  • Maven依赖:3.8.1
  • 其他依赖:YashanDB开发sql工具YDC
  • 开发工具推荐
  • IDEA
  • YashanDB Developer Center 23.3  去下载
  • apipost接口调试工具
  • 如何获取YashanDB

第2章:YashanDB基础

  • YashanDB的安装和配置

这里可以参考我上一篇文章:一键安装YashanDB数据库, 文章地址

  • 连接YashanDB数据库

使用YDC链接数据库。 点击查看YDC安装教程

Spring JPA集成YashanDB教程分享_YashanDB

  • 创建数据库和表

执行以下语句创建用户以及授权

CREATE USER erupt IDENTIFIED BY erupt;
COMMIT;

GRANT CONNECT TO erupt;
GRANT RESOURCE TO erupt;
GRANT DBA TO erupt;
COMMIT;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

Spring JPA集成YashanDB教程分享_SpringJPA_02

至此。数据库安装完成,用户创建完成。

第3章:Spring Boot与YashanDB集成

创建Spring Boot项目

使用IDEA创建SpringJPA项目,创建完成后项目接口如下

Spring JPA集成YashanDB教程分享_SpringJPA_03

  • 添加YashanDB依赖

两种方式添加依赖

  1. mvn install命令添加YashanDB驱动到本地仓库
mvn install:install-file -Dfile=D:\yashandb-jdbc-1.8.0.jar -DgroupId=com.yashandb -DartifactId=yashandb -Dversinotallow=1.8.0 -Dversinotallow=1.8.0 -Dpackaging=jar
  • 1.

然后在pom.xml文件引用

<!--添加崖山数据库依赖-->
        <dependency>
            <groupId>com.yashandb</groupId>
            <artifactId>yashandb</artifactId>
            <version>1.8.0</version>
        </dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  1. 打开IDEA的ProjectStructure,使用Libraries添加YashanDB的连接驱动,对于多模块,只需要添加到对应的模块即可

Spring JPA集成YashanDB教程分享_YashanDB_04

配置application.properties或application.yml

我这里使用的application.yml,由于JPA的枚举以及方言不支持Yahsan,我们这里直接使用Oralce的方言;连接驱动使用YashanDB的驱动类

server:
  port: 8000
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.yashandb.jdbc.Driver
    url: jdbc:yasdb://172.18.100.153:1688/yasdb
    username: erupt
    password: erupt
  jpa:
    show-sql: true
    generate-ddl: true
    database-platform: com.yashandb.jpa.YasDialect
    properties:
      hibernate:
        dialect: org.hibernate.dialect.OracleDialect
        hbm2ddl:
          auto: create
        naming-strategy:
          org.hibernate.cfg.ImprovedNamingStrategy
        temp:
          use_jdbc_metadata_defaults: false
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

实体类与数据库表映射

创建一个简单的用户实体类User

package com.example.jpayashan.model;
import lombok.Data;
import org.hibernate.annotations.ColumnDefault;

import javax.persistence.*;
import java.io.Serializable;

@Data
@Entity
@Table(name = "t_user")
public class User {
    @Id //hibernate要求必须要一个id(主键),不然会报错
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_GENERATOR")
    @SequenceGenerator(name = "ID_GENERATOR", sequenceName = "user_sequence")
    @ColumnDefault("user_sequence.nextval")
    private int id;

    @Column(name = "name")
    private String name;
    public User() {
    }
    public User(String name) {
        this.name = name;
    }
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

数据访问层(Repository)

创建一个用户仓库接口UserRepository

package com.example.jpayashan.Repository;

import com.example.jpayashan.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

测试接口

package com.example.jpayashan.controller;

import com.example.jpayashan.Repository.UserRepository;
import com.example.jpayashan.model.User;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/User")
public class UsersController {

    @Resource
    private UserRepository userRepository;

    @PostMapping("/insert")
    public String insert(@RequestBody User user) {
        userRepository.save(user);
        return "接口调用成功!";
    }

    @GetMapping("/select")
    public List<User> findAll() {
        return userRepository.findAll();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

启动类

确保你的Spring Boot启动类上有@SpringBootApplication注解,这样Spring Boot才能自动扫描并加载配置。

package com.example.jpayashan;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@EnableJpaRepositories(basePackages = "com.example.jpayashan.Repository")
@EntityScan
public class JpaYashanApplication {

	public static void main(String[] args) {
		SpringApplication.run(JpaYashanApplication.class, args);
	}

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

启动项目,控制台输出编译成功,数据库已创建表;

Spring JPA集成YashanDB教程分享_YashanDB_05

Spring JPA集成YashanDB教程分享_YashanDB_06

第4章:集成测试

使用接口调试工具测试插入方法以及查询方法

写入数据

调用接口插入数据

Spring JPA集成YashanDB教程分享_YashanDB_07

查看数据库是否写入成功:

Spring JPA集成YashanDB教程分享_SpringJPA_08

查询数据

查询数据结果:

Spring JPA集成YashanDB教程分享_SpringJPA_09

至此集成教程完成,更多可能自行探索。

附上完整项目结构

Spring JPA集成YashanDB教程分享_SpringJPA_10