SpringBoot Data JPA基本使用

一、项目起步

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android终端GB28181音视频实时回传设计探讨

技术背景 好多开发者&#xff0c;在调研Android平台GB28181实时回传的时候&#xff0c;对这块整体的流程&#xff0c;没有个整体的了解&#xff0c;本文以大牛直播SDK的SmartGBD设计开发为例&#xff0c;聊下如何在Android终端实现GB28181音视频数据实时回传。 技术实现 Andr…

光伏仿真系统在光伏项目开发中有哪些应用场景?

光伏仿真系统在光伏项目开发中的应用场景广泛&#xff0c;涵盖了从项目规划、设计优化到运维管理的全过程。 一、项目规划与选址 1、气象模拟与评估 光伏仿真系统能够基于历史气象数据和先进的预测模型&#xff0c;模拟不同地理位置、不同季节和时间段的光照强度、温度、湿度…

【学术论文投稿】Java入门:零基础小白也能轻松掌握的全攻略

【IEEE | 往届见刊1个月检索 | 国际双会场】第四届智能电力与系统国际学术会议(ICIPS 2024)_艾思科蓝_学术一站式服务平台 更多学术论文投稿请看&#xff1a;https://ais.cn/u/nuyAF3 目录 【IEEE | 往届见刊1个月检索 | 国际双会场】第四届智能电力与系统国际学术会议(ICIPS…

『网络游戏』三端增加数据.dll替换【32】三端

修改服务器脚本&#xff1a;DBMgr 增加数据库 修改客户端脚本&#xff1a;MainCityWnd.cs 拖拽绑定 查看服务端PlayerData调用的协议位置 在客户端中替换 之后客户端就可以调用服务端新增的数据了

Elasticsearch Ingest Pipelines

1. 前言 在将第三方数据源的数据导入到Elasticsearch中时&#xff0c;原始数据长什么样&#xff0c;索引后的文档就是什么样。文档数据结构不统一&#xff0c;导致后续数据分析时变得麻烦&#xff0c;以往需要额外写一个中间程序来读取原始数据&#xff0c;转换加工后再写入到…

Linux下Docker方式Jenkins安装和配置

一、下载&安装 Jenkins官方Docker仓库地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins 从官网上可以看到&#xff0c;当前最新的稳定版本是 jenkins/jenkins:lts-jdk17。建议下在新的&#xff0c;后面依赖下不来 所以&#xff0c;我们这里&#xff0c;执行doc…

智绘城市地图:使用百度地图 API 实现智能定位

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

测网速小程序,纯前端

搜索&#xff1a;证寸照制作 源码介绍: 测网速小程序源码&#xff0c;是一款纯前端无需服务器的测网速小程序&#xff0c;依赖百度开发者中心js接口&#xff0c;真正的永久使用的小工具源码&#xff0c;很实用&#xff0c;可以单独运行&#xff0c;测网速很流畅~ 合法域名: ht…

深入理解 pnpm(Performant NPM) 的实现原理及其与 npm 的区别

深入理解 pnpm 的实现原理及其与 npm 的区别 在 JavaScript 生态系统中&#xff0c;包管理器是开发者日常工作中不可或缺的工具。npm&#xff08;Node Package Manager&#xff09;作为 Node.js 的默认包管理器&#xff0c;已经广泛应用于各种项目中。然而&#xff0c;随着项目…

力扣之接雨水(42)

刷题不在多&#xff0c;而在精。 这道题号称字节的保洁阿姨都能做出的。 方法一&#xff1a;动态规划 下面这幅图简直封神&#xff0c;看了下图我才做出来的。 两个方向遍历&#xff0c;然后取相同覆盖值-原始值&#xff08;heigth数组&#xff09; 这种方法更好理解。但是也有…

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮

厨房老鼠数据集&#xff1a;掀起餐饮卫生监测的科技浪潮 摘要&#xff1a;本文深入探讨了厨房老鼠数据集在餐饮行业卫生管理中的重要性及其相关技术应用。厨房老鼠数据集通过收集夜间厨房图像、老鼠标注信息以及环境数据&#xff0c;为深度学习模型提供了丰富的训练样本。基于…

新手爬虫DAY1

这个错误信息表明在你的Python程序中&#xff0c;re.search() 函数没有找到预期的匹配项&#xff0c;因此返回了 None。当你尝试在 None 对象上调用 group(1) 方法时&#xff0c;Python 抛出了一个 AttributeError。 具体来说&#xff0c;错误发生在 pc.py 文件的第6行&#x…

QT开发--QT基础

第0章 QT工具介绍 0.1 编译工具 uic&#xff0c;rcc&#xff0c;moc&#xff0c;qmake 都是 qt 的工具 uic 主要是 编译 .ui文件 -> ui_xxx.h //.ui文件 .h rcc 主要是 编译 资源文件.qrc文件 -> xxx.rcc …

某电子元器件企业人力资源管理体系搭建咨询项目

某电子元器件企业人力资源管理体系搭建咨询项目 ——搭建管理体系&#xff0c;梳理工作流程 【导读】 与其他同类企业一样&#xff0c;该电子公司面临招不到合适的人才、留不住人才的难题&#xff0c;自然也加大了人力资源管理的成本。公司人事部员工的工作基本上陷入了“招…

OpenUAV:首个专为现实无人机视觉语言导航设计的大规模轨迹数据集,由大约 12k 个轨迹组成,涵盖了多种环境和复杂的飞行动态。

2024-10-10&#xff0c;由北京航空航天大学人工智能研究所、香港中文大学MMLab以及感知与交互智能中心共同创建了OpenUAV数据集&#xff0c;首个专为现实无人机&#xff08;UAV&#xff09;视觉语言导航&#xff08;VLN&#xff09;任务设计的大型轨迹数据集&#xff0c;该数据…

波司登超1000+门店用钉钉Teambition开店管理,实现拓店“自动化”

门店开在哪里&#xff1f;什么时候装修&#xff1f;什么时候开门迎客&#xff1f; 在瞬息万变的零售行业&#xff0c;门店作为连接产品和消费者、融合线上和线下的核心场景&#xff0c;其运营效率和管理策略至关重要。 近日&#xff0c;波司登正式启用钉钉项目 Teambition&am…

【uniapp】打包成H5并发布

目录 1、设置配置mainifest.sjon 1.1 页面标题 1.2 路由模式 1.3 运行的基础路径 2、打包 2.1 打包入口 2.2 打包成功 2.3 依据目录找到web目录 3、 将web目录整体拷贝出来 4、上传 4.1 登录uniapp官网注册免费空间 4.2 上传拷贝的目录 4.3 检查上传是否正确 5、…

内容共创与UGC:TikTok腰部达人推动品牌海外传播新风向

当今数字营销的新时代&#xff0c;内容共创已成为品牌与用户之间构建深度互动的关键方式。在TikTok上&#xff0c;腰部达人通过UGC等形式&#xff0c;不仅能增强品牌与用户的互动性和参与度&#xff0c;还能够帮助品牌在海外市场上实现声量和知名度的提升。本文Nox聚星将和大家…

嵌入式开发学习日记——认识指针及和数组函数的联系(c语言)

一、指针的定义 一般格式&#xff1a; 数据类型 * 指针变量名 [初始地址值]; 数据类型是指针所指向的地址处的数据类型&#xff0c;如 int、char、float 等。 符号 * 用于通知系统&#xff0c;这里定义的是一个指针变量&#xff0c;通常跟在类型关键字的后面&#xff0c;表示…

从入门到高手的99个Python案例

想掌握Python编程语言&#xff0c;从零基础的小白晋升为大神&#xff1f;没问题&#xff01;接下来我们将以轻松有趣的方式&#xff0c;逐一解锁Python学习路上的99个关键知识点。每一步都将结合实际应用场景、函数功能解析及简洁代码演示&#xff0c;带你深度领略Python的魅力…