SpringBoot JPA使用

这篇具有很好参考价值的文章主要介绍了SpringBoot JPA使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot JPA使用

简介

Spring Data JPA 是 Spring 框架提供的一个模块,用于简化与关系型数据库的交互和数据访问。它基于JPA(Java Persistence API)标准,并提供了一组易于使用的API和工具,帮助开发人员更轻松地进行数据库操作。通过Spring Data JPA,开发人员可以通过编写简洁的代码来执行常见的 CRUD 操作,同时还支持高级查询、分页、事务管理等功能。它的目标是提供一种更简单、更高效的方式来处理数据库操作,减少开发人员的工作量,并提高应用程序的可维护性和可扩展性。

创建工程

使用 idea 快速创建 Spring Boot 整合 Spring Boot JPA实例。我们选择了 spring-boot-starter-webspring-boot-starter-data-jpamysql-connector-jspring-boot-starter-test 依赖。

对应的pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

创建实体 Entity

@Entity
@Table(name = "t_user")
public class TUser {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 使用数据库自增
    private long id;

    @Column
    private String username;

    @Column
    private String age;
}

@Entity 表示这个类是一个需要受 EntityManager 管理的实体类。@Table(name = "sys_user") 注解指定了实体在数据库中所对应的表名称。@Id 用于标识ID字段,@GeneratedValue(strategy = GenerationType.IDENTITY) 注解指定了 ID 值的生成方式,其中 GenerationType.IDENTITY 表示主键由数据库自动生成(自增)。@Column 注解表示对象字段和数据表列的映射关系。

TUser对应的SQL

CREATE TABLE `t_user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `age` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8

创建 Repository 接口

package org.example.springbootjpa.repository;

import org.example.springbootjpa.entity.TUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Repository
public interface TUserRepository extends JpaRepository<TUser, Long>, JpaSpecificationExecutor<TUser> {

    List<TUser> findTUsersByAge(String age);

    @Transactional
    int deleteTUsersByAge(String age);
}

通过继承 JpaRepositoryJpaSpecificationExecutor 就可以获得已经预定义的各种 CRUD 方法。其中 JpaRepository 的泛型对象是实体类型和 ID 类型,JpaSpecificationExecutor 的泛型对象只有实体类型。

使用 @Repository 注解表示这是一个 Repository 接口。

@Transactional 代表启用事务。因为By删除操作,是先执行 select by id, 然后通过 id 逐条删除记录的,所以需要事务。

配置 application.yml

spring:
  application:
    name: spring-boot-jpa

  # 数据源配置
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/kgc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8&allowMultiQueries=true
    username: root
    password: root

  jpa:
    database-platform: org.hibernate.dialect.MySQLDialect
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        hbm2ddl:
          auto: none
logging:
  level:
    org:
      hibernate:
        orm:
          jdbc:
            bind: "TRACE"

上述常用配置中,数据源的配置是必须的。其他配置项都有默认值。

其中 spring.jpa.hibernate.ddl-auto 比较重要,表示建表的策略,可选的枚举值如下:

  • create:不管表是否存在,每次启动都会重新建表(会导致数据丢失)。
  • create-drop:启动的时候创建表,程序退出(SessionFactory 关闭)的时候删除表。
  • none:不进行任何操作。
  • update:如果数据表不存在则创建,在实体对象被修改后,下次启动重新修改表结构(不会删除已经存在的数据)。
  • validate:启动的时候验证数据表的结构。

建议使用 none,手动维护数据表结构,以避免不小心修改了实体对象后导致表结构被修改,甚至是数据丢失。

编写Controller

package org.example.springbootjpa.controller;

import org.example.springbootjpa.entity.TUser;
import org.example.springbootjpa.repository.TUserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Random;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    TUserRepository tUserRepository;

    @PostMapping("/addUser")
    public String addUser() {
        Random rand = new Random();
        TUser tUser = new TUser();
        tUser.setAge("10");
        tUser.setUsername("chenguowei"+ rand.nextInt(100));
        tUserRepository.save(tUser);

        return "success";
    }

    @GetMapping("/getUsersByAge")
    public List<TUser> getUsesrByAge(@RequestParam(value = "age", required = true) String age) {
        System.out.println("getUserByAge: " + age);
        return  tUserRepository.findTUsersByAge(age);
    }

    @PostMapping("deleteUsersByAge")
    public String deleteUsersByAge(@RequestParam(value = "age", required = true) String age) {
        System.out.println("deleteUsersByAge: " + 10);
        int result = tUserRepository.deleteTUsersByAge(age);
        System.out.println("deleteTUsersByAge result: " + result);

        return "success " + result;
    }
}

这里使用字段注入的方式 @Autowired, 实际中最好使用 setXXX()注入方式。

编写SQL

 @Transactional
    @Modifying
    @Query(nativeQuery = true, value = "delete from t_user where age = ?1")
    int deleteTUser(String age);

事务管理

 @Transactional(rollbackFor = Exception.class)
    public void register(String age) throws Exception {
        TUser user = new TUser();
        user.setAge(age);
        user.setUsername("chenguowei");

        tUserRepository.save(user);
        if (Objects.equals(age, "10")) {
            throw new Exception("测试事务");
        }

        TOrder tOrder = new TOrder();
        tOrder.setName("chenguowei");
        tOrder.setNumber(age);

        tOrderRepository.save(tOrder);
    }
  • ​ 多个方法嵌套调用,如果都有 @Transactional 注解,则产生事务传递,默认 Propagation.REQUIRED。
  • ​ 事务默认只对 RutimeException 回滚,而非 Exception回滚。
  • ​ 如果要对 checked Exceptions 进行回滚,则需要 @Transactional(rollbackFor = Exception.class)

联表查询

新建一个联表的结构体

package org.example.springbootjpa.dao;

public interface UserOrderDao {
    String getName();
    String getNumber();
    String getUsername();
    String getAge();
}

自定义联表查询语句

@Query(nativeQuery = true, value = "select username, age, number, name " +
            "from t_user left join t_order ON t_user.age = t_order.number")
    public List<UserOrderDao> findViewInfo();

测试

curl -XGET ‘http://localhost:8080/user/getUsersByAge?age=10’

curl -XPOST ‘http://localhost:8080/user/addUser’

curl -XPOST ‘http://localhost:8080/user/deleteUserSql?age=10’

curl -XPOST ‘http://localhost:8080/user/transaction?age=10’

curl -XGET ‘http://localhost:8080/user/findViewInfo’文章来源地址https://www.toymoban.com/news/detail-858497.html

到了这里,关于SpringBoot JPA使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接

    系列文章: SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计 SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接 SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接 SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现 SpringBoot + Vue前后

    2024年02月12日
    浏览(68)
  • SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接

    系列文章: SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计 SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接 SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接 SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现 SpringBoot + Vue前后

    2024年02月11日
    浏览(63)
  • Jpa与Druid线程池及Spring Boot整合(一): spring-boot-starter-data-jpa 搭建持久层

                          Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二):几个坑 附录官网文档:core.domain-events域事件 docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五

    2024年02月13日
    浏览(53)
  • 微信小程序的授权登录-Java 后端 (Spring boot)

    微信开发文档链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 一个可以测试的微信小程序 此微信小程序的APPID和APPscret(至开发者后台获取) 从时序图我们可以了解到流程大致分为两步: 小程序端获取code后传给Java后台 Java后台获取code后向微信后台接口

    2024年02月09日
    浏览(53)
  • Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

                         docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六):docker 网络及数据卷设置 docker实战(七):docker 性质及版本选择 认知升维: 道、法、

    2024年02月13日
    浏览(59)
  • Spring Boot 实战 | Spring Boot整合JPA常见问题解决方案

    专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏: Python 专栏: Redis 专栏: TensorFlow 专栏: Logback 专栏: 量子计算: 量子计算 | 解密著名量子算法Shor算法和Grover算法 AI机器学习实战: AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析 AI机器学习 | 基于lib

    2024年02月04日
    浏览(59)
  • Spring Boot整合Spring Data Jpa + QueryDSL

    Spring Data JPA是一个Spring项目中常用的持久化框架,它简化了与数据库进行交互的过程。而QueryDSL是一个查询构建框架,可以让我们以面向对象的方式来编写数据库查询。 在本文中,我们将讨论如何使用Spring Boot整合Spring Data JPA和QueryDSL,并提供一个使用案例来演示它们的用法。

    2024年02月09日
    浏览(63)
  • “从零开始学习Spring Boot:快速搭建Java后端开发环境“

    标题:从零开始学习Spring Boot:快速搭建Java后端开发环境 摘要:本文将介绍如何从零开始学习Spring Boot,并详细讲解如何快速搭建Java后端开发环境。通过本文的指导,您将能够快速搭建一个基于Spring Boot的Java后端开发环境并开始编写代码。 正文: 一、准备工作 在开始之前,

    2024年02月15日
    浏览(56)
  • Spring Boot 61:JPA 中的级联类型

    图源:简书 (jianshu.com) 关系型数据库的增删改查操作会因为有关联关系而存在“级联操作”的需要,体现在 JPA 中,就是实体中会定义的级联类型(Cascade Type)。 JPA 中的级联类型由枚举 jakarta.persistence.CascadeType 表示,包括: ALL PERSIST MERGE REMOVE REFRESH DETACH 这些级联类型对应实

    2024年02月12日
    浏览(66)
  • 【Spring Boot 3】【JPA】枚举类型持久化

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月24日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包