SpringBoot Data JPA基本使用

news2024/10/12 19:19:38

一、项目起步

1.1 pom配置

<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>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

1.2 yml配置

server:
  port: 8037
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_jpa?useSSL=false&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
  jpa:
    # 在建表的时候,将默认的存储引擎切换为InnoDB
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    # 控制台显示sql
    show-sql: true
    # 默认为false,意味着在视图渲染完成后,session会自动关闭
    open-in-view: false
    hibernate:
      # 自动生成数据库表
      ddl-auto: update
      # 字段命名策略(默认)【驼峰转换下划线】
      naming:
        physical-strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy

1.3 实体类

1.3.1 用户

package com.qiangesoft.jpa.entity;

import java.io.Serializable;
import java.util.Date;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

/**
 * 用户实体
 *
 * @author qiangesoft
 * @date 2024-10-12
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "sys_user")
public class SysUser implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long createBy;

    private Date createTime;

    private Long updateBy;

    private Date updateTime;

    @Column(nullable = false, length = 50)
    private String userName;

    @Column(length = 255)
    private String password;

    @ManyToOne
    @JoinColumn(name = "dept_id", nullable = false)
    private SysDept dept;

    @Column(nullable = false, length = 50)
    private String nickName;

    private Integer sex;

    @Column(length = 50)
    private String phoneNumber;

    @Column(length = 50)
    private String email;

    @Column(length = 255)
    private String avatar;

    @Column(length = 500)
    private String remark;

    private Integer status;

    @Column(name = "is_deleted", nullable = false)
    private Boolean deleted;

    /**
     * 旧密码
     * <p>非表字段</p>
     */
    @Transient
    private String oldPassword;

}

1.3.2部门

package com.qiangesoft.jpa.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

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

/**
 * 部门实体
 *
 * @author qiangesoft
 * @date 2024-10-12
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "sys_dept")
public class SysDept implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long createBy;

    private Date createTime;

    private Long updateBy;

    private Date updateTime;

    @Column(nullable = false, length = 50)
    private String deptName;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private SysDept parent;

    @Column(length = 500)
    private String remark;

    private Integer status;

    @Column(name = "is_deleted", nullable = false)
    private Boolean deleted;

}

1.4持久层

1.4.1 用户

package com.qiangesoft.jpa.dao;

import com.qiangesoft.jpa.entity.SysUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * 用户持久层
 *
 * @author qiangesoft
 * @date 2024-10-12
 */
@Repository
public interface SysUserDao extends JpaRepository<SysUser, Long> {

}

1.4.2 部门

package com.qiangesoft.jpa.dao;

import com.qiangesoft.jpa.entity.SysDept;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * 部门持久层
 *
 * @author qiangesoft
 * @date 2024-10-12
 */
@Repository
public interface SysDeptDao extends JpaRepository<SysDept, Long> {

}

1.5 启动

在这里插入图片描述
在这里插入图片描述

二、CRUD

2.1 业务层

package com.qiangesoft.jpa.service;

import com.qiangesoft.jpa.entity.SysUser;

import java.util.List;

/**
 * 用户服务层
 *
 * @author qiangesoft
 * @date 2024-10-11
 */
public interface SysUserService {

    void save(SysUser sysUser);

    void deleteById(Long id);

    List<SysUser> finaAll();

    SysUser findById(Long id);

}

package com.qiangesoft.jpa.service.impl;

import com.qiangesoft.jpa.dao.SysUserDao;
import com.qiangesoft.jpa.entity.SysUser;
import com.qiangesoft.jpa.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 用户服务层实现
 *
 * @author qiangesoft
 * @date 2024-10-11
 */
@Service
public class SysUserServiceImpl implements SysUserService {

    @Autowired
    private SysUserDao sysUserDao;


    @Override
    public void save(SysUser sysUser) {
        sysUserDao.save(sysUser);
    }

    @Override
    public void deleteById(Long id) {
    	boolean exists = sysUserDao.existsById(id);
        if (exists) {
            sysUserDao.deleteById(id);
        }
    }

    @Override
    public List<SysUser> finaAll() {
        return sysUserDao.findAll();
    }

    @Override
    public SysUser findById(Long id) {
        return sysUserDao.findById(id).orElse(null);
    }
}

2.2 控制层

package com.qiangesoft.jpa.controller;

import com.qiangesoft.jpa.entity.SysUser;
import com.qiangesoft.jpa.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequestMapping("/sys-user")
@RestController
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    /**
     * 新增或者修改
     * @param sysUser
     */
    @PostMapping
    public void save(@RequestBody SysUser sysUser) {
        sysUserService.save(sysUser);
    }

    /**
     * 删除
     * @param id
     */
    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable("id") Long id) {
        sysUserService.deleteById(id);
    }

    /**
     * 单个查询
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public SysUser findById(@PathVariable("id") Long id) {
        return sysUserService.findById(id);
    }

    /**
     * 查询列表
     * @return
     */
    @GetMapping
    public List<SysUser> findAll() {
        return sysUserService.finaAll();
    }

}

2.3 测试

新增
在这里插入图片描述
单个查询
在这里插入图片描述
查询列表
在这里插入图片描述
删除
在这里插入图片描述

三、进阶

3.1 持久层

package com.qiangesoft.jpa.dao;

import com.qiangesoft.jpa.entity.SysUser;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

/**
 * 用户持久层
 *
 * @author qiangesoft
 * @date 2024-10-12
 */
@Repository
public interface SysUserDao extends JpaRepository<SysUser, Long>, JpaSpecificationExecutor<SysUser> {

    /**
     * nativeQuery为true表示使用原生sql
     * @param userName
     * @return
     */
    @Query(value = "select * from sys_user where user_name =:userName", nativeQuery = true)
    SysUser findByUserName(@Param("userName") String userName);

    @Query(value = "select u from SysUser u where u.nickName =:nickName")
    Page<SysUser> pageByNickName(@Param("nickName") String nickName, Pageable pageable);

    @Modifying
    @Transactional
    @Query("update SysUser u set u.nickName =:nickName where u.id =:id")
    Integer updateById(@Param("nickName") String nickName, @Param("id") Long id);

}

3.2 业务层

package com.qiangesoft.jpa.service;

import com.qiangesoft.jpa.entity.SysUser;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 用户服务层
 *
 * @author qiangesoft
 * @date 2024-10-11
 */
public interface SysUserService {

    void save(SysUser sysUser);

    void deleteById(Long id);

    List<SysUser> finaAll();

    Page<SysUser> page(Integer pageNum, Integer pageSize, String nickName);

    SysUser findById(Long id);

}

package com.qiangesoft.jpa.service.impl;

import com.qiangesoft.jpa.dao.SysUserDao;
import com.qiangesoft.jpa.entity.SysUser;
import com.qiangesoft.jpa.service.SysUserService;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户服务层实现
 *
 * @author qiangesoft
 * @date 2024-10-11
 */
@Service
public class SysUserServiceImpl implements SysUserService {

    @Autowired
    private SysUserDao sysUserDao;


    @Override
    public void save(SysUser sysUser) {
        sysUserDao.save(sysUser);
    }

    @Override
    public void deleteById(Long id) {
        boolean exists = sysUserDao.existsById(id);
        if (exists) {
            sysUserDao.deleteById(id);
        }
    }

    @Override
    public List<SysUser> finaAll() {
        return sysUserDao.findAll();
    }

    @Override
    public Page<SysUser> page(Integer pageNum, Integer pageSize, String nickName) {
        // 排序
        List<Sort.Order> orders = new ArrayList<>();
        orders.add(new Sort.Order(Sort.Direction.DESC, "id"));
        Sort sort = Sort.by(orders);

        // 分页
        PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize, sort);

        if (nickName != null && !"".equals(nickName)) {
            // 查询条件
            Specification<SysUser> specification = (root, criteriaQuery, criteriaBuilder) -> {
                List<Predicate> predicateList = new ArrayList<>();
                predicateList.add(criteriaBuilder.equal(root.get("nickName"), nickName));
                Predicate[] pre = predicateList.toArray(new Predicate[0]);
                return criteriaQuery.where(pre).getRestriction();
            };
            return sysUserDao.findAll(specification, pageRequest);
//            return sysUserDao.pageByNickName(nickName, pageRequest);
        } else {
            return sysUserDao.findAll(pageRequest);
        }
    }

    @Override
    public SysUser findById(Long id) {
        sysUserDao.updateById("王五", 2L);
//        SysUser admin = sysUserDao.findByUserName("admin");
        return sysUserDao.findById(id).orElse(null);
    }
}

3.3 控制层

package com.qiangesoft.jpa.controller;

import com.qiangesoft.jpa.entity.SysUser;
import com.qiangesoft.jpa.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequestMapping("/sys-user")
@RestController
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    /**
     * 新增或者修改
     * @param sysUser
     */
    @PostMapping
    public void save(@RequestBody SysUser sysUser) {
        sysUserService.save(sysUser);
    }

    /**
     * 删除
     * @param id
     */
    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable("id") Long id) {
        sysUserService.deleteById(id);
    }

    /**
     * 单个查询
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public SysUser findById(@PathVariable("id") Long id) {
        return sysUserService.findById(id);
    }

    /**
     * 查询列表
     * @return
     */
    @GetMapping
    public List<SysUser> findAll() {
        return sysUserService.finaAll();
    }

    /**
     * 分页查询
     * @return
     */
    @GetMapping("/page")
    public Page<SysUser> page(@RequestParam Integer pageNum,
                              @RequestParam Integer pageSize,
                              @RequestParam String nickName) {
        return sysUserService.page(pageNum, pageSize, nickName);
    }

}

3.4 测试

在这里插入图片描述

四、代码仓库

https://gitee.com/qiangesoft/boot-business/tree/master/boot-business-jpa

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

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

相关文章

基于ssm的美妆分享网站的设计与实现

文未可获取一份本项目的java源码和数据库参考。 经济的快速发展&#xff0c;人均可支配收入提高&#xff0c;多数年轻人化妆理念都已经改变。在化妆品消费渗透率不断提升、核心化妆人口持续扩散因素的多重影响下&#xff0c;化妆品行业持续高速增长&#xff0c;但是我们对美妆的…

C++题 十进制转二进制

文章目录 1. 使用C20 std::format2. 使用 std::bitset 类3. 手动实现十进制到二进制的转换反过来&#xff0c;手动二进制到十进制 VisualStudio2022使用C&#xff0c;进行十进制到二进制的转换&#xff0c;常见的实现方式 1. 使用C20 std::format 需要将VisualStudio默认的标准…

信息学奥赛复赛复习16-CSP-J2022-01乘方-循环特判、pow函数、快速幂

PDF文档回复:20241012 此前解析题&#xff0c;P8813 [CSP-J 2022] 乘方&#xff0c;给出了循环的解题思路&#xff0c;当时在洛谷提交是通过的&#xff0c;后台收到留言&#xff0c;a1,b1e9会炸吧&#xff1f;&#xff0c;确实啊整除要求1s内循环次数最大可以到10^7,现在测试数…

微信自动化工具,让多微管理更轻松更高效!

对于多个微信账号的管理&#xff0c;往往会让人感到繁琐和耗时。 这时&#xff0c;通过个微管理系统实现微信自动化设置&#xff0c;将大大提升我们的管理效率。 1、批量自动加好友 只需将客户号码一次性导入系统&#xff0c;设置好加好友规则&#xff0c;系统便会自动发送加…

PS文件保存后突然消失?别急,这里有7种解决方案!

咨询&#xff1a;“我刚做完的PS文件&#xff0c;保存得好好的&#xff0c;怎么就突然消失了呢&#xff1f;连回收站里都没有&#xff0c;这可怎么办才好。” 面对PS&#xff08;Photoshop&#xff09;文件在保存后突然消失的情况&#xff0c;许多设计师和图像处理爱好者可能会…

List的实现类

1.ArrayList&#xff08;数组&#xff09; &#xff08;1&#xff09;代码 新建学生类&#xff1a; package com.collection;public class Student {private String name;private int age;//添加构造方法 都是使用altenter快捷键public Student() {this.name name;this.age…

OCR经典神经网络(二)文本检测算法DBNet算法原理及其在icdar15数据集上的应用

OCR经典神经网络(二)文本检测算法DBNet算法原理及其在icdar15数据集上的应用 场景文本检测任务&#xff0c;一直以来是OCR整个任务中最为重要的一环。虽然有一些相关工作是端对端的&#xff0c;但是从工业界来看&#xff0c;相关落地应用较为困难。因此&#xff0c;两阶段的OC…

RUM性能优化之图片加载

作者&#xff1a;三石 在现代Web开发中&#xff0c;图片作为内容表达的核心元素&#xff0c;其加载效率直接影响到页面的整体性能和用户体验。随着高清大图和动态图像的普及&#xff0c;优化图片加载变得尤为重要。RUM作为一种主动监测技术&#xff0c;能够帮助开发者从真实用户…

【Linux-基础IO】软硬链接+动静态库

一、软硬链接 见一见 软连接 硬连接 通过观察我们发现以下几点&#xff1a; 1.ll - i后&#xff0c;软连接形成的文件有指向&#xff0c;并且软连接的Inode编号与对应文件的Inode编号不一样 2.ll - i后&#xff0c;硬连接形成的文件与对应的文件Inode编号一样 3.软连接…

贪心+dfs,CF 1975D - Paint the Tree

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1975D - Paint the Tree 二、解题报告 1、思路分析 我们从树中一点出发&…

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…

汽车免拆诊断案例 | 2013款宝马116i车偶尔加速不良

故障现象  一辆2013款宝马116i车&#xff0c;搭载N13B16A 发动机&#xff0c;累计行驶里程约为12.1万km。车主反映&#xff0c;该车行驶中偶尔加速无反应&#xff0c;且发动机故障灯异常点亮。 故障诊断 接车后试车&#xff0c;故障现象无法再现。用故障检测仪检测&#xff…

[论文阅读] MoAI: Mixture of All Intelligence for Large Language and Vision Models

原文链接&#xff1a;http://arxiv.org/abs/2403.07508 源码链接&#xff1a;https://github.com/ByungKwanLee/MoAI 启发&#xff1a;这篇文章提供一个比较新奇的思路&#xff0c;将传统CV小模型的输出进行语言化&#xff0c;转换成统一格式&#xff0c;传入到后续的模型中&…

8. Control Station Studio控制站开发平台概述

更多内容见CSDN博客专栏&#xff1a;无人机飞控 相关资源&#xff1a;https://gitee.com/ss15/ph47 8.1. 概述 Ground Control Station&#xff08;CSS&#xff09;是一个地面站软件开发平台&#xff0c;通过对控制站工程的设计搭建&#xff0c;从而开发出面向各种不同用途&a…

【软件测试】基本知识2

一、能对穷举场景设计测试点——等价类划分法 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分 分类 有效等价类&#xff1a;满足需求的数据集合无效等价类&#xff1a;不满足需求的数据集合 步骤 明确需求确定有效和无效等价类提取数据编写…

linux使用xhell连接特别慢

linux使用xhell连接特别慢 在此记录一下 1.vi /etc/ssh/sshd_config&#xff0c;修改如下配置 GSSAPIAuthentication yes 修改 no UseDNS yes 修改 no 2.重新启动sshd服务 systemctl restart sshd

从混乱到卓越:六西格玛是如何助力企业摆脱困境的

六西格玛&#xff0c;这一源自摩托罗拉、发扬于通用电气的管理方法&#xff0c;以其严谨的数据分析、持续改进的理念&#xff0c;成为了企业转型升级的利器。它不仅仅是一套工具和方法论&#xff0c;更是一种追求卓越的文化和思维方式。在六西格玛的视角下&#xff0c;企业的一…

基于yolov8、yolov5的鸟类检测系统(含UI界面、数据集、训练好的模型、Python代码)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…

当下流行的【疗愈】是什么?疗愈门店未来发展前景分析|个案疗愈系统源码私

▶ 「疗愈」是什么&#xff1f; 疗愈通常指的是一种综合性的治疗方法&#xff0c;旨在帮助人们恢复身心健康、平衡和内在和谐。可能包括心理治疗、身体疗法、能量疗法、草药疗法、冥想和其他练习&#xff0c;以促进个体的整体健康和福祉。 疗愈的具体内容和方法会因不同的文化…

论文笔记:Pre-training to Match for Unified Low-shot Relation Extraction

论文来源&#xff1a;ACL 2022 论文地址&#xff1a;https://aclanthology.org/2022.acl-long.397.pdf 论文代码&#xff1a;https://github.com/fc-liu/MCMN &#xff08;笔记不易&#xff0c;请勿恶意转载抄袭&#xff01;&#xff01;&#xff01;&#xff09; 目录 A…