SpringBoot集成Jpa极简教程

简介: 基本概念Jpa(Java Persistence API)即 java 持久化api规范,并不是一个ORM框架,而是一种访问数据的接口定义,通过与数据访问框架或者ORM框架配合,可以简单方便的处理与数据库的交互。这种概念有点类似 slf4j 和 logback 的关系。SpringDataJpa是对JPA规范的封装,旨在提高开发效率,同时不失灵活性,它提供了一种简单、一致的方式来访问不同种类的数据源,包括关系数据库、非关系数据库、MapReduce 框架等。Spring Data JPA 还提供了一些高级特性,如动态查询、多表查询、嵌套查询、存储过程和函数调用等。

简介

基本概念

Jpa(Java Persistence API)即 java 持久化api规范,并不是一个ORM框架,而是一种访问数据的接口定义,通过与数据访问框架或者ORM框架配合,可以简单方便的处理与数据库的交互。这种概念有点类似 slf4j 和 logback 的关系。

SpringDataJpa是对JPA规范的封装,旨在提高开发效率,同时不失灵活性,它提供了一种简单、一致的方式来访问不同种类的数据源,包括关系数据库、非关系数据库、MapReduce 框架等。Spring Data JPA 还提供了一些高级特性,如动态查询、多表查询、嵌套查询、存储过程和函数调用等。

在SpringBoot中,jpa默认情况下的orm实现是 hibernate。

优点

封装了 JPA 的细节,提供了更高层次的抽象,简化了数据访问层的开发,提高了开发效率;支持多种数据源,包括关系型数据库和非关系型数据库;提供了一些高级特性,如动态查询、多表查询、嵌套查询、存储过程和函数调用等;可与其他 Spring 框架无缝集成,如 Spring Boot、Spring Cloud 等。

缺点

对于一些复杂的查询,仍需要手动编写 SQL 语句;默认的实现可能存在性能问题,需要手动优化。

基础实践

pom


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.20</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>

yml

主要配置了数据库访问参数,没有显示配置数据库连接池,默认使用的是 HikariPool 。

通过配置 show-sql = true 来打印sql


spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://ip:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: 123456
  jpa:
    show-sql: true

entity


package com.ramble.ramblespringboot.springdatajpa.entity;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

@Data
@Entity
@Table(name = "user")
public class UserEntity implements Serializable {

    @Id
    private String id;
    @Column(name = "name")
    private String name;
    @Column(table = "user", name = "state")
    private Integer state;

}
  • Entity:表示此类为一个数据库实体
  • Tabel:映射到数据库的哪个表
  • Id:表的主键,必须
  • Column:属性对应的表字段

repository


package com.ramble.ramblespringboot.springdatajpa.repository;
import com.ramble.ramblespringboot.springdatajpa.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface UserRepository extends JpaRepository<UserEntity, String> {

    UserEntity findByName(String name );

    @Query("select u from UserEntity u where u.name like %?1 and u.id = ?2")
    List<UserEntity> find(String name, String id);

    @Query(nativeQuery = true, value = " select * from user where name = ?1 ")
    List<UserEntity> findByNativeQuery(String name);

    //启动的时候报异常,不可  param.name 访问
//    @Query("select u from UserEntity u where u.name like %:us.name and u.id = :us.id")
//    List<UserEntity> findByParam(@Param("us") UserEntity us);

    @Query("select u from UserEntity u where u.name like %:name and u.id = :id")
    List<UserEntity> findByParam(@Param("id") String id, @Param("name") String name);



    @Modifying
    @Query(" update UserEntity u  set u.state=?2  where  u.id = ?1")
    Integer updateSate(String id,  Integer state);

}
  • Repository:表示此接口是一个持久层,同时注入到容器中,供其他容器对象访问
  • JpaRepository:实现JpaRepository 接口,便于使用默认的crud接口。其中第一个泛型参数UserEntity 为数据库实体的名字,第二泛型参数String 为数据库表主机的数据类型
  • findByName:StringDataJpa会根据方法名称自行生成查询sql
  • Query:显示指定查询的sql,这里又分为两种方式,一种是jpa方式,一种是本地查询方式,通过指定nativeQuery=true设置。
  • JPAQuery:当为jpa模式的时候表名称写实体名称
  • NativeQuery:表名写数据库表的名称
  • 参数处理:参数赋值有多种方式:
    • ?1: 表示获取方法第一个参数
    • :id:表示通过param指定的参数名称获取参数
  • Modifying:当update/delete操作的时候需要添加此注解

controller


package com.ramble.ramblespringboot.springdatajpa.controller;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSON;
import com.ramble.ramblespringboot.springdatajpa.entity.UserEntity;
import com.ramble.ramblespringboot.springdatajpa.repository.UserRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.*;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("/test")
public class TestController {

    private UserRepository userRepository;
    @PostMapping("/")
    public Boolean create() {
        UserEntity user = new UserEntity();
        user.setId(IdUtil.fastSimpleUUID());
        user.setName(RandomUtil.randomString(4));
        user.setState(RandomUtil.randomInt());
        UserEntity result = userRepository.save(user);
        return true;
    }

    @DeleteMapping("/{id}")
    public Boolean delete(@PathVariable("id") String id) {
        //userRepository.deleteById(id);
        UserEntity user = new UserEntity();
        user.setId(id);
        userRepository.delete(user);
        return true;
    }

    @GetMapping("/crud")
    public String crud() {
        long count = userRepository.count();
        UserEntity byId = userRepository.getById("ecde5544eb0647ef8b005ca9f6ff68db");
        List<UserEntity> all = userRepository.findAll();
        List<UserEntity> all1 = userRepository.findAll(Sort.by("id"));
        UserEntity user = new UserEntity();
        user.setId("ecde5544eb0647ef8b005ca9f6ff68db");
        user.setName("明");
        ExampleMatcher matcher = ExampleMatcher.matching();
        matcher.withMatcher("id", m -> m.startsWith());
        matcher.withMatcher("name", m -> m.contains());
        Example<UserEntity> example = Example.of(user, matcher);
        List<UserEntity> allExample = userRepository.findAll(example);
        Pageable page = PageRequest.of(0, 20);
        Page<UserEntity> allPage = userRepository.findAll(example, page);
        return JSON.toJSONString(allPage);
    }

    /**
     * 执行 update /delete 必须添加 事务注解  Transactional
     *
     * @return
     */
    @Transactional
    @GetMapping("/query")
    public Boolean query() {
        UserEntity byName = userRepository.findByName("明");
        List<UserEntity> find = userRepository.find("明", "f2bcbe98ef88450b955f76bb063c1cf8");
        List<UserEntity> nativeQuery = userRepository.findByNativeQuery("明");
//        UserEntity user = new UserEntity();
//        user.setName("明");
//        List<UserEntity> byParam = userRepository.findByParam(user);
        Integer update = userRepository.updateSate("f2bcbe98ef88450b955f76bb063c1cf8", 2);
        List<UserEntity> byParam = userRepository.findByParam("f2bcbe98ef88450b955f76bb063c1cf8", "明");
        return true;
    }

}

注意事项

  • 执行 update /delete 必须添加 事务注解 Transactional

思考

  • repository接口传参如何传 dto , 测试代码中我传递 @Param("us") UserEntity us 这样一个参数,无法使用 :us.name 的方式获取

  • 打印的sql没有输出参数,是不支持还是姿势不对?

引用

官网:https://spring.io/projects/spring-data-jpa

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
3月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
631 5
|
9月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
506 0
|
9月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
365 0
|
6月前
|
前端开发
SpringBoot2.3.1集成Knife4j接口文档
SpringBoot2.3.1集成Knife4j接口文档
620 44
|
5月前
|
JSON 分布式计算 大数据
springboot项目集成大数据第三方dolphinscheduler调度器
springboot项目集成大数据第三方dolphinscheduler调度器
308 3
|
5月前
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
578 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
5月前
|
Java 关系型数据库 MySQL
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
628 2
|
5月前
|
分布式计算 Java 大数据
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
345 2
|
7月前
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
545 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程

热门文章

最新文章