SpringBoot 整合JPA

news2024/10/9 22:29:56

spring data jpa

JPA(java persistence api)

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 [1]

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

JPA底层采用hibernate,

Spring Data

Spring Data项目目的是为了简化基于spring框架对持久化层的操作技术,包含了关系型数据库、非关系型数据库,map-reduce框架等。

  1. Spring Data特点

提供了统一的api对持久化层进行操作;主要是通过spring data commons项目实现。让我们使用关系型数据库或非关系型数据库时都能给予一个统一的标准,这个标准中包含了crud,分页排序等。

  1. Spring Data提供了统一的Repository接口,可以实现对关系型数据库或非关系型数据库的操作
  2. Spring Data提供了数据访问的模版

如:

JdbcTemplate

RedisTemplate

MongoDbTemplate

Spring Data Jpa

是spring data家族中的一个项目,可以轻松的实现基于Jpa的数据操作。

启动器和依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>2109q-boot-test1</artifactId>
        <groupId>com.sofwin</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>2109q-boot-jpa</artifactId>

    <dependencies>
        <!-- jpa 和jdbc相关的依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

    </dependencies>

</project>
配置jpa
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///db
    username: root
    password: 123456
    hikari:
      minimum-idle: 2 # 最小连接数
      idle-timeout: 200000 # 空闲连接的最大存活时间
      maximum-pool-size: 6 # 连接池中的最大连接数
      connection-test-query: select 1 # 测试连接是否可用的语句
      connection-timeout: 200000 # 数据库连接的超时时
  jpa:
    show-sql: true  # 打印SQL语句
    hibernate:
      ddl-auto: none # 主要是基于hibernate orm框 对象关系模型 
                      # none  不对数据库中的表进行新增和更新
                      # create 每次启动项目都根据对象关系模型来生成数据库中的表
                      # update 每次启动项目都根据对象关系模型来更新数据库中的表
创建实体类完善对象关系模型
  • @Entity

声明当前类是实体类,也就是说这个类需要和数据库中的某个表进行映射。

  • @Table

声明当前实体类和哪个表进行关系映射

  • @Id

声明属性中用于映射主键的属性

  • @GeneratedValue

主键策略

table :从一张表中来获取主键信息

IDENTITY:主键自增 mysql

SEQUENCE:根据数据库的序列来生成逐渐,数据库底层要支持序列 oracle

AUTO:由程序来控制主键的生成

  • @Column

声明属性和字段的映射关系

package com.sofwin.pojo;

import lombok.Data;

import javax.persistence.*;

/**
 * ClassName: User
 * Description: 实体类   对象 --sys_user关系型表
 * date: 2022/4/20 11:10 上午
 *
 * @author andyliu
 * @qq 115176513
 * @since JDK 1.8
 */
@Data
// 声明当前是一个实体类
@Entity
// 声明当前实体类需要和数据库中哪个表进行映射
// name需要对应的表的名称
@Table(name = "sys_user1")
public class User {
    @Id
    // 声明主键的策略
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    // 声明属性和表字段的映射关系
    // 注解写在属性上或属性的setter方法上,name指当前属性需要
    // 映射到tABLE定义的表中的哪个字段上
    @Column(name="user_name")
    private String userName;
    @Column(name="pwd")
    private String pwd;
    @Column(name="real_name")
    private String realName;
    @Column(name="dept_id")
    private Integer deptId;
    @Column(name="create_date")
    private String createDate;

}

创建dao接口extends JpaRepository

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

父接口中包含了单表的crud

package com.sofwin.dao;

import com.sofwin.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * ClassName: UserDao
 * Description: TODO
 * date: 2022/4/20 11:31 上午
 *
 * @author andyliu
 * @qq 115176513
 * @since JDK 1.8
 * 泛型1:当前需要操作的实体类的类型
 * 泛型2:主键的类型
 */
public interface UserDao extends JpaRepository<User,Integer> {
}

测试
package com.xx.test;

import com.xx.dao.UserDao;
import com.xx.pojo.User;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;

/**
 * ClassName: Test1
 * Description: TODO
 * date: 2022/4/20 11:26 上午
 *
 * @author andyliu
 * @qq 115176513
 * @since JDK 1.8
 */
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class Test1 {
    @Autowired
    UserDao dao;
    @Test
    public void test01(){
        System.out.println("test01");
    }
    @Test
    public void test02(){
        User user = new User();
        user.setUserName("sofwin");
        dao.save(user);
    }
}

JPA api

参考文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#dependencies.spring-boot

crudRepository
public interface CrudRepository<T, ID> extends Repository<T, ID> {

  <S extends T> S save(S entity);    1  

  Optional<T> findById(ID primaryKey);  2

  Iterable<T> findAll();              3 

  long count();                      4  

  void delete(T entity);         5      

  boolean existsById(ID primaryKey);  6 
   
   void deleteById(ID id);      7

    void deleteAllById(Iterable<? extends ID> ids); 8

    void deleteAll(Iterable<? extends T> entities); 9

    void deleteAll(); 10
    
     Iterable<T> findAllById(Iterable<ID> ids); 11

  // … more functionality omitted.
}

1.Saves the given entity.
保存给定的实体(新增、更新)
如果给定的对象没有主键值,调用insert语句,如果有主键值调用Update语句
2.Returns the entity identified by the given ID.
根据给定的主键的值获取实体
3. Returns all entities.
没有条件查询所有
4. Returns the number of entities.
查询数据库中的总数
5.Deletes the given entity.
删除给定的实体,实体必须有主键值
6.Indicates whether an entity with the given ID exists.
给定的id是否存在
7. 根据id删除
8. 根据id批量删除
9. 根据实体中的id批量删除
10. 全部删除
11. 根据多个id查询 采用in子句

save

 @Test
    public void testSave(){
        // Saves the given entity.
        Student student = new Student();
        student.setAge(110);
        student.setSex(11);
        student.setId(1);
        student.setRealName("admin1");
        student.setDescription("描述1");
        Student t2 = dao.save(student);
        System.out.println(t2);

    }

FindById

@Test
    public void testFindById(){
        Optional<Student> optional = dao.findById(1);
        Student student = optional.get();
        System.out.println(student);

    }

findAll

 @Test
    public void testFindAll(){
        List<Student> all = dao.findAll();
        System.out.println(all);
    }

count

 @Test
    public void testCound(){
        long count = dao.count();
        System.out.println(count);
    }

delete

  @Test
    public void testDelete(){
        Student student = new Student();
        student.setId(1);
        student.setAge(11);
        dao.delete(student);
    }	

existsById

  @Test
    public void testExistsById(){
        boolean b = dao.existsById(1);
        System.out.println(b);
        boolean b1 = dao.existsById(2);
        System.out.println(b1);
    }
PagingAndSortingRepository
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    Iterable<T> findAll(Sort sort); 1

    Page<T> findAll(Pageable pageable); 2
    
    1. 对所有数据进行排序
    
    2. 对所有数据进行分页
}
  @Test
    public void testPaging(){
        // 需要传递当前页码和每页大小
        Page<Student> page = dao.findAll(PageRequest.of(1, 5));
        List<Student> content = page.getContent();
        System.out.println(content);
    }

    @Test
    public void testSort(){
        // 降序排列
        List<Student> students = dao.findAll(Sort.by("id").descending());
        for (Student st:students
             ) {
            System.out.println(st);
        }
    }
方法名派生查询

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

package com.xx.dao;

import com.xx.pojo.Student;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

/**
 * @packageName: com.sofwin.dao
 * @user: andyliu
 * @date: 2023/2/2 10:07
 * @email 115176513@qq.com
 * @description: TODO
 */

public interface StudentDao extends JpaRepository<Student,Integer> {

    List<Student> findAllByRealNameEqualsAndAgeGreaterThan(String name,Integer age);
}

自定义查询

采用的是hinbernate的hql语句

  @Query("from Student s where s.id>1")
    List<Student> findStudents();
    
    @Query("from Student s where s.realName=?2 and s.age>?1")
    List<Student> find(Integer age,String name);
QueryByExampleExecutor
  @Test
    public void test01(){
        Student student = new Student();
        student.setRealName("admin10");
        Example<Student> of = Example.of(student);
        List<Student> users = dao.findAll(of);
        System.out.println(users);
    }
 public void test01(){
        Student student = new Student();
        student.setRealName("10");
        student.setAge(10);
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("realName", ExampleMatcher.GenericPropertyMatchers.endsWith());

        Example<Student> of = Example.of(student,matcher);
       List<Student> users = dao.findAll(of);
        System.out.println(users);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2200209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链表Set_LinkList(建立)

用单链保存集合元素&#xff0c;元素由键盘输入。输入以-1结束&#xff0c;将所建链表打印输出。 链表结构如下图所示&#xff1a; 提示&#xff1a; 1.链表中数据元素为整型&#xff0c;typedef int ElemType; 2.用结构体自定义链表结构Set_LinkList &#xff1b; 3.初始化链表…

【每日刷题】Day135

【每日刷题】Day135 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 011. 连续数组 - 力扣&#xff08;LeetCode&#xff09; 2. 【模板】二维前缀和_牛客题霸_牛客…

基于SSM的共享读书网站

文未可获取一份本项目的java源码和数据库参考。 1.1 题目背景 进入新时代&#xff0c;中国的经济建设和社会发展需要与之相适应的人力资源相匹配。如何提升人力资源的素养&#xff0c;是新时代中国持续发展亟待解决的问题[1]。阅读不失为其中一个有效的手段。有效有益的阅读能…

【每日一题 | 24.10.6】确定字符串是否包含唯一字符

1. 题目2. 解题思路3. 代码实现&#xff08;AC_Code&#xff09; 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;每日一题 1. 题目 确定字符串是否包含唯一字符 2. 解题思路 题目要求&#xff1a;判断输入的字符串是否唯一&#xff0c;这里想到可以借助布尔数组。 第一…

软件测试外包干了4年,感觉废了....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

【模板进阶】std::conditional

一、 s t d : : c o n d i t i o n a l std::conditional std::conditional的使用 C 11 C11 C11标准引入了 s t d : : c o n d i t i o n a l std::conditional std::conditional&#xff0c;这是一个类模板&#xff0c;用于表现一种编译期间的分支逻辑。 它的实现代码比较简…

【斯坦福CS144】Lab4

一、实验目的 完成一个网络接口实现。 二、实验内容 完成一个网络接口实现&#xff0c;其大部分工作是&#xff1a;为每个下一跳IP地址查找(和缓存)以太网地址。而这种协议被称为地址解析协议ARP。 三、实验过程 在minnow目录下输入git merge origin/check4-startercode获…

[ C++ ] C++ 类和对象 -- 类的六个默认成员函数

目录 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值操作符重载 5.两个取地址操作符的重载 在C中当你创建一个空类&#xff0c;那这个空类是什么都没有吗&#xff1f;不是的&#xff0c;编译器会默认帮你生成六个成员函数 1.构造函数 构造函数是特殊的成员函数&#xff0c;…

使用数据库:

数据库&#xff1a; 1.为何需要数据库&#xff1f; 存储数据方法 第一种&#xff1a;用大脑记住数据&#xff0c; 第二种&#xff1a;写纸上&#xff0c; 第三种&#xff1a;写在计算机的内存中&#xff0c; 第四种&#xff1a;写出磁盘文件 2.数据库能做什么&#xff1…

【探索艺术新纪元:Midjourney中文版,让创意无界!】

&#x1f3a8; 艺术&#xff0c;从此触手可及 在这个数字时代&#xff0c;Midjourney中文版正引领一场艺术创作的革命。作为一款前沿的AI绘画工具&#xff0c;它利用深度学习技术&#xff0c;将你的想象转化为触手可及的艺术作品。无需深厚的绘画功底&#xff0c;只需简单的文…

机器学习:opencv--图像拼接

目录 前言 一、两个函数 1.显示图像 2.计算图片特征与描述符 二、代码实例 1.准备图像 2.特征检测 3.特征匹配 4.图像变换 5.图像融合 前言 图像拼接是一种将多张图像合成一幅大图的技术&#xff0c;常用于全景图生成、图像拼接和图像合成等应用场景。 一、两个函数…

第二十三天|回溯算法| 39. 组合总和,40. 组合总和II,131. 分割回文串

目录 39. 组合总和 未剪枝 剪枝优化 40. 组合总和II 131. 分割回文串 回溯 回溯动态规划优化回文串判断 今天的题目自己都没啥思路&#xff0c;二刷的时候再理解一下。尤其是131. 39. 组合总和 本题和77.组合 &#xff0c;216.组合总和III的区别是&#xff1a;本题没有…

IDEA 输入英文字体变了的问题

**问题&#xff1a;**有时不知道按了什么快捷键导致在 IDEA 输入英文字体变了&#xff0c;如下所示&#xff0c;看起来特别不顺眼&#xff1a; 出现以上问题是因为在输入时切换了中文输入法&#xff0c;并且在提示文字时按了 Shift 空格 键&#xff0c;导致出现以上字体变化情…

H、Happy Number(2024牛客国庆集训派对day7)

题目链接&#xff1a; H-Happy Number_2024牛客国庆集训派对day7 (nowcoder.com) 题目描述&#xff1a; 翻译为中文&#xff1a; 数据范围&#xff1a; 输入样例&#xff1a; 680 输出样例&#xff1a; 326623 分析: 本来以为是dfs&#xff0c;但是看到数据范围1e9, 联想到是…

uniapp自定义导航,全端兼容

我们在用uniapp 开发应用的时候&#xff0c;有的页面需要自定义导航&#xff0c; 1.如果普通的直接使用uni 扩展柜组件的 uni-nav-bar 也基本够用&#xff0c; 2.如果稍微带点自定义的这个值无法支持的&#xff0c;特别在小程序端&#xff0c;胶囊是会压住右边的按钮的 自定…

多模态简单了解

多模态 1.文本编码2. ViT图像编码器2.1图像矩阵self-attention计算&#xff1a; 3.Transformer多模态3.1CLIP 图文交互3.2 对比学习训练3.3 flamingo 图文交互3.4 LLava 图文交互 1.文本编码 简介&#xff1a; 即通过embedding将字符向量化&#xff0c;进入模型即可。 2. ViT…

水下图像增强(论文复现)

本文所涉及所有资源均在 传知代码平台 可获取。 目录 概述 一、论文思路 二、模型介绍&#xff1a; 三、实现方法 四、复现过程(重要) 部署方式 概述 2021年11月&#xff0c;提出一种用于水下图像增强的U型Transformer模型&#xff0c;这是首次在水下图像增强任务中使用Transfo…

InnoDB 磁盘结构 - RedoLog

文章目录 RedoLog是什么刷盘机制崩溃恢复相关参数Redo Log 和 Undo Log 对比 https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html RedoLog是什么 RedoLog 是MySQL的一种日志文件&#xff0c;用于在崩溃恢复期间纠正由不完整事务写入的数据。在正常操作过程中&…

AtCoder Beginner Contest 374

C - Separated Lunch 题目&#xff1a; 思路&#xff1a; dfs枚举每个数是否选入a数组中&#xff0c;求和比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;typedef long long LL;const int N25;int a[N]; bool st[N]; int mn0x3f3f3f3f; int sum; …

VMWare安装ubuntu22虚拟机

1.下载VMware虚拟机和ubuntu 下载地址&#xff1a; VMware Workstation Pro - Download (softonic.com) Download Ubuntu Desktop | Ubuntu 2.Ubuntu的安装 1.VMware创建虚拟机。 2.选择默认即可点击下一步。 3.找到刚才下载的ubuntu20.04。选择下面的稍后安装操作系统。 …