66、Spring Data JPA 的基本功能--CRUD 和 分页

news2024/9/24 9:20:15

Spring Data JPA 的基本功能–CRUD 和 分页

★ Spring Data JPA开发

(1)配置数据源。
(2)配置JPA相关属性,这些属性由JpaProperties类负责处理。
     ——上面2步都在application.properties中配置即可。
(3)使用JPA注解定义实体类。
(4)继承CrudRepository或其子接口实现DAO组件,
     如要实现反应式DAO组件,继承ReactiveCrudRepository或其子接口。
     我们只需要开发DAO组件的接口,并不需要提供实现类。

   如果要做分页查询,需要使用Pageable参数,
   但Pageable有个实现类:PageRequest,调用它的of方法即可创建 Pageable对象     

代码演示:

1、创建项目,勾选这些jar包
在这里插入图片描述

application.properties 配置文件
在这里插入图片描述

User实体类
在这里插入图片描述

UserDao 接口
在这里插入图片描述

UserService 接口
在这里插入图片描述

UserServiceImpl 实现类
在这里插入图片描述
启动类进行测试:
因为这个项目没有添加web的jar包,所以不算是个web应用。所以直接再启动类这里进行测试
在这里插入图片描述

测试

测试新增和修改的功能
没有id,是新增
在这里插入图片描述

执行个有id的,且数据库有同样的id存在在这里插入图片描述
执行个有id的,且数据库没有同样的id存在
在这里插入图片描述

查询
在这里插入图片描述

删除
在这里插入图片描述

分页:
在这里插入图片描述

在这里插入图片描述

完整代码:

application.properties

#配置连接数据源,这些配置由 DataSourceProperties 类负责处理
#SpringBoot 读取到这些配置信息后,会使用 AutoConfiguration 去容器中自动配置 DataSource Bean
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

#配置 JPA 相关属性,由 JpaProperties 类负责处理
#SpringBoot 读取到这些配置信息后,会使用 AutoConfiguration 去容器中自动配置 EntityManagerFactory Bean
#JPA 底层就是依赖这个 EntityManagerFactory

#自动建表,只能true或者false
#spring.jpa.generate-ddl=true
#这个也是自动建表,不过比spring.jpa.generate-ddl更严谨,作用:如果已有数据表,无需创建,否则创建数据表
spring.jpa.hibernate.ddl-auto=update
#指定操作的数据库
spring.jpa.database=mysql
#是否在执行的时候显示sql语句
spring.jpa.show-sql=true

User


package cn.ljh.app.domain;


import lombok.Data;

import javax.persistence.*;

//添加这个注解,让这个类变成实体类
@Entity
//指定表名,表明这个实体类映射到user_inf这张表
@Table(name = "user_inf")
@Data
public class User
{
    @Id
    @Column(name = "user_id") // 指定列名
    @GeneratedValue(strategy = GenerationType.IDENTITY)//指定主键的自动增长策略
    private Integer id;
    @Column(name = "user_name")
    private String name;
    //如果不用 @Column 指定列表,name表示列名和属性名一致
    private int age;
    private String password;

    public User()
    {
    }
    public User(String name, int age, String password)
    {
        this.name = name;
        this.age = age;
        this.password = password;
    }
}

UserDao

package cn.ljh.app.Dao;

import cn.ljh.app.domain.User;
import org.springframework.data.repository.PagingAndSortingRepository;


//CrudRepository 的第一个泛型参数是被操作的实体类型,第二个参数是实体的主键类型
public interface UserDao extends PagingAndSortingRepository<User,Integer>
{
    //这个接口无需书写任何代码,只要定义一个空的接口,该接口就能完成大量、通用的 CRUD 操作。
}

UserService

package cn.ljh.app.service;


import cn.ljh.app.domain.User;

import java.util.List;

public interface UserService
{
    //根据id获取一个User对象
    User getUserById(Integer id);

    //查询所有用户
    List<User> getAllUsers();

    //根据id删除用户
    void deleteUserById(Integer id);

    //新增和修改
    void  saveOrUpdateUser(User user);

    //分页查询 , pageNo: 要查询哪一页的页数 , pageSize: 每页显示的条数
    List<User> findUserByPage(int pageNo, int pageSize);
}

UserServiceImpl

package cn.ljh.app.service.impl;


import cn.ljh.app.Dao.UserDao;
import cn.ljh.app.domain.User;
import cn.ljh.app.service.UserService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;


@Service
public class UserServiceImpl implements UserService
{
    private UserDao userDao;

    //构造器进行依赖注入
    public UserServiceImpl(UserDao userDao)
    {
        this.userDao = userDao;
    }


    //根据id获取一个User对象
    @Override
    public User getUserById(Integer id)
    {
        //findById 返回 Optional 值,可能为null
        Optional<User> optional = userDao.findById(id);
        //所以需要再get把数据获取出来,就不会出现null的情况
        User user = optional.get();
        return user;
    }

    //查询所有用户
    @Override
    public List<User> getAllUsers()
    {
        List<User> list = new ArrayList<>();
        //findAll 方法返回 Iterable 值,可将它收集到 List 之后再返回
        Iterable<User> users = userDao.findAll();
        //方式1:Lambda表达式
        //users.forEach(user -> list.add(user));
        //方式2:Lambda表达式的简化写法----方法引用
        users.forEach(list::add);
        return list;
    }

    //根据id删除用户
    @Override
    public void deleteUserById(Integer id)
    {
        userDao.deleteById(id);
    }

    //新增和修改
    @Override
    public void saveOrUpdateUser(User user)
    {
        //有id就是更新,没有则是插入
        userDao.save(user);
    }

    //分页查询 , pageNo: 要查询哪一页的页数 , pageSize: 每页显示的条数
    @Override
    public List<User> findUserByPage(int pageNo, int pageSize)
    {
        //分页对象,此处的pageNo是从0开始的,0代表第一页,所以这里的 pageNo 要 -1 。
        Pageable pageable = PageRequest.of(pageNo - 1, pageSize);
        //Page 包含了分页消息
        Page<User> users = userDao.findAll(pageable);
        //当前页数,因为pageNo-1,所以这里需要+1
        int number = users.getNumber()+1;
        System.err.println("总页数:" + users.getTotalPages());
        System.err.println("总条数:" + users.getTotalElements());
        System.err.println("当前第:" + number + " 页");
        System.err.println("当前页有:" + users.getNumberOfElements() + " 条数据");

        List<User> list = new ArrayList<>();
        users.forEach(list::add);
        return list;
    }


}

App

package cn.ljh.app;

import cn.ljh.app.domain.User;
import cn.ljh.app.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.List;

@SpringBootApplication
public class App
{

    public static void main(String[] args)
    {
        ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args);
        //根据类型获取bean
        UserService usBean = ctx.getBean(UserService.class);
//        usBean.saveOrUpdateUser(new User("小红",25,"12345"));
//        usBean.saveOrUpdateUser(new User("小橙",26,"12345"));
//        usBean.saveOrUpdateUser(new User("小黄",27,"12345"));
//        usBean.saveOrUpdateUser(new User("小绿",28,"12345"));
//        usBean.saveOrUpdateUser(new User("小青",29,"12345"));

//        User user = new User("小紫", 31, "1234");
//        user.setId(6);
//        usBean.saveOrUpdateUser(user);

        //根据id查询
//        System.err.println(usBean.getUserById(2));
        //查询所有
//        usBean.getAllUsers().forEach(System.err::println);

//        usBean.deleteUserById(6);
//        usBean.getAllUsers().forEach(System.err::println);

        //pageNo: 要查询哪一页的页数 , pageSize: 每页显示的条数
        //分页查询:查询第2页,每页显示3条记录
        List<User> userByPage = usBean.findUserByPage(3, 2);
        userByPage.forEach(System.err::println);
    }

}

pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.ljh</groupId>
    <artifactId>spring_data_jpa</artifactId>
    <version>1.0.0</version>
    <name>spring_data_jpa</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

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

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

相关文章

电脑提示丢失MSVCP140.dll是什么意思,总结5个MSVCP140.dll丢失的解决分享

在计算机使用过程中&#xff0c;有时候会出现一些异常情况&#xff0c;比如丢失 MSVCP140.dll 文件。MSVCP140.dll 是 Microsoft Visual C 2015 Redistributable 的一部分&#xff0c;它包含了一些在 C 编程时需要的函数和类。许多程序和游戏都需要依赖这个文件来正常运行。一旦…

通过RSYNC在linux和windows间同步文件

通过RSYNC在linux和windows间同步文件 下载windows版本rsync下载后是一个zip的压缩包&#xff0c;直接解压就可使用配置windows到linux的秘钥拷贝公钥文件到linux服务器&#xff0c;实现免密配置同步命令结合windows计划任务实现定时同步文件 下载windows版本rsync 下载链接 h…

无涯教程-JavaScript - OFFSET函数

描述 OFFSET函数返回对范围的引用,该范围是一个单元格或单元格范围中指定的行数和列数。 返回的引用可以是单个单元格或单元格范围。您可以指定要返回的行数和列数。 语法 OFFSET (reference, rows, cols, [height], [width]) 争论 Argument描述Required/OptionalReferenc…

Amazon Lightsail——兼具亚马逊云科技的强大功能与 VPS 的简易性

对于开发者而言&#xff0c;当你想构建系统架构时&#xff0c;你的面前就出现了两种选择&#xff0c;选择一&#xff1a;花时间去亲手挑选每个亚马逊云科技组件&#xff08;云服务器、存储、IP 地址等&#xff09;&#xff0c;然后自己组装起来&#xff1b;选择二是只需要一个预…

uniappAndroid平台签名证书(.keystore)生成

一、安装JRE环境 https://www.oracle.com/java/technologies/downloads/#java8 记住下载默认安装地址。ps&#xff1a;我都默认安装地址C:\Program Files\Java\jdk-1.8 二、安装成功后配置环境变量 系统变量配置 AVA_HOME 放到环境变量去 %JAVA_HOME%\bin 三、生成签名证书…

JS中BigInt的使用

JS中BigInt的使用 BigInt是一种内置对象&#xff0c;它提供了一种方法来表示大于2^53 - 1的整数&#xff0c;通俗来讲就是提供了一种可以表示任意大整数的方法&#xff0c;当我们使用Number来表示一个超过了2 ^53 - 1的整数的时候&#xff0c;会出错。所以此时我们需要使用Big…

亚马逊小家电出口美国、欧盟、日本需要做什么认证?

海关总署统计数据显示&#xff0c;2023年1-6月&#xff0c;中国家电出口172893.1万台&#xff0c;同比增长1.4%&#xff0c;出口额2967亿元&#xff0c;同比增长5.2%。据奥维云网数据显示&#xff0c;2023年1-6月厨房小家电&#xff08;包含品类&#xff1a;咖啡机、电饭煲、电…

Python脚本批量造数据、跑定时任务协助测试

目录 批量造数据 结合pythonpytestfixture 实现定时任务接口调用 目录结构 定时任务 批量造数据 连接Mysql的信息 1 import pymysql2 # 数据库连接信息3 # 多个库要有多个conn4 conn pymysql.connect(5 host"主机",6 user"用户名",7 pas…

【Redis】Redis 的学习教程(十)之使用 Redis 实现消息队列

消息队列需要满足的要求&#xff1a; 顺序一致&#xff1a;要保证消息发送的顺序和消费的顺序是一致的&#xff0c;不一致的话可能会导致业务上的错误消息确认机制&#xff1a;对于一个已经被消费的消息(已经收到ACK)不能再次被消费消息持久化&#xff1a;要具有持久化的能力&…

ccfcsp9.17

ccf csp第二题前缀和优化 n个ti变化 其中格式是 1 ti或者2 ti 分别表示拉长ti和逆时针旋转ti m个查询 其中格式是 ti到tj的变化(be en) x y初始坐标 输出格式 每个查询x y之间空格&#xff0c;查询\n 时间复杂度On #include<stdio.h> #include<stdlib.h> #includ…

人民日报发文祝贺,这位作者是藏不住了!

近日&#xff0c;人民日报特地发文祝贺一位90后短视频博主任大学副教授&#xff01; 这是哪位短视频博主这么有排面&#xff0c;竟然被人民日报专门发文祝贺呢&#xff1f; 她就是短视频科普“弦论”走红的周思益&#xff01; 同时也是《弦论小女孩的相对论课》一书的作者~~…

如何防止公司代码泄露(如何防止员工拷贝代码)

随着互联网的发展&#xff0c;越来越多的企业开始注重知识产权的保护&#xff0c;其中源代码是企业的重要资产之一。然而&#xff0c;一些员工可能会通过各种手段获取企业的源代码&#xff0c;这对企业的竞争力和商业机密构成了威胁。那么&#xff0c;企业应该如何防止员工拷贝…

文件夹高效改名,批量设置文件夹仅显示编号无名称的方法“

在数字化世界中&#xff0c;文件夹的命名和编号管理对于提高工作效率和保持文件组织的条理性起着至关重要的作用。你是否曾经在杂乱无章的文件系统中迷失&#xff0c;或者在寻找重要文件时感到困惑&#xff1f;如果你回答是肯定的&#xff0c;那么是时候采取一种更有效的文件夹…

亚马逊美国站小家电UL60335-1测试报告办理

有很多做亚马逊平台的客户反映产品因为没有UL认证&#xff0c;被下架了&#xff0c;怎么办&#xff1f; 因为大家都知道UL认证并没有那么好拿&#xff0c;随便一个产品做下来费用10W&#xff0c;一年需要对工厂进行4次审核&#xff0c;而且非常严格&#xff0c;普通工厂根本没…

Redis学习 - Tp6配置并使用redis图文详解 小皮面板(三)

这篇文章主要介绍了Thinkphp6 配置并使用redis的方法,结合实例形式详细分析了Redis的安装、配置以及thinkphp6操作Redis的基本技巧,需要的朋友可以参考下 一、安装redis ThinkPHP内置支持的缓存类型包括file、memcache、wincache、sqlite。ThinkPHP默认使用自带的采用think\Ca…

在MySQL中使用VARCHAR字段进行日期筛选

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

VM ware中Linux连网

在公司时,想搭建一下docker,结果发现连不上网,那就自己动手操作一下 一、联网配置 1.1 ping 发现ping不通&#xff0c;说明虚拟机此时无法与外界网络互连&#xff0c;需要修改设置联网 1.2 ifconfig查看网络配置 注意第一行显示的是ens33还是ens32,后面配置会用到 1.3 获取ro…

详解API接口如何安全的传输数据

概述 API接口的安全传输是确保数据在API请求和响应之间的传输过程中不被截获、篡改或泄露的重要步骤。以下是一些用于增强API接口安全传输的常见技术和最佳实践&#xff1a; 使用HTTPS&#xff1a;使用HTTPS协议而不是HTTP&#xff0c;以确保数据在传输过程中的安全性。HTTPS使…

入户式防汛报警器是什么?

入户式防汛报警器是一款能够和雨量气象监测设备搭配的仪器&#xff0c;是集实时监测、信息显示、多时段声光报警功能的监测报警设备&#xff0c;支持不同级别的声光报警。 当监测要素超过设定的危险警戒值时设备发出报警声&#xff0c;提醒居民做好防汛&#xff08;转移&#…

无所不知的Mac效率神器 Alfred 4,一顶神器的小帽子!

肯定很多人在工作、学习或者写东西的时候&#xff0c;总想着怎样可以提高效率&#xff0c;节约时间。现在每天用得最多的电脑&#xff0c;怎样才能够让工作效率更高呢&#xff1f;带着这样的一个目的&#xff0c;使用了很多的小工具&#xff0c;有些可以简化工作&#xff0c;有…