第一个搭建SpringBoot项目(连接mysql)

news2024/11/15 15:35:57

首先新建项目找到Spring Initializr 我使用的URL是https://start.spring.io这里最低的JDK版本是17,而且当网速不好的时候可能会显示超时,这里可以选用阿里云的镜像https://start.aliyun.com可以更快一些但是里面还是有一些区别的

我们这里选择Java语言,Maven框架

在这里我们选择一些我们需要用到的

这个版本可以选低一点更加稳定

进来之后我们需要先等pom文件加载,我们可以选择刷新Maven

加载完之后由于我们加载了MySQL所以还不能运行可以先注释掉,然后刷新maven

后面就可以运行了,但是它默认的是8080端口,有可能会有被占用的我们可以更改端口

后面既可以运行了

运行结果就是这样的后面没有了,刚开始由于我学习的时候和别人运行的不一样,还以为是卡住了,调试了好久好久,结果发现这就已经是运行了

下面我们就可以去页面看看结果了

用阿里云镜像的输出会有点不一样但是没有问题。

下面我们就可以创建一个测试类

新建一个TestController

@RestController
public class TestController {
    @GetMapping("/hello")
    public String hello(){
        return "hello word!";
    }
}

再去页面观察

rest api规范

路径

路径又称"终点"(endpoint),表示API的具体网址。在RESTfuI架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。

Http 动词

GET(SELECT):从服务器取出资源(一项或多项)。

POST(CREATE):在服务器新建一个资源。

PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。。PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)

DELETE(DELETE):从服务器删除资源。

新建一个数据库,创建表student

使用mysql语句是这样的

创建

在这里我遇到的问题是JpaRepository我继承不了,然后不断的查找问题是更改pom文件里面的内容

加入

org.springframework.data

spring-data-jpa

然后刷新一下maven就好了

创建Student

Student

package com.example.mysqldemo3.dao;

import jakarta.persistence.*;

import static jakarta.persistence.GenerationType.IDENTITY;

@Entity
@Table(name = "student")
public class Student {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = IDENTITY)
    private long id;
    @Column(name = "name")
    private String name;
    @Column(name = "email")
    private String email;
    @Column(name = "age")
    private int age;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

返回到接口补全代码

package com.example.mysqldemo3.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface StudentRepository extends JpaRepository<Student,Long> {


}

Service层

StudentService

package com.example.mysqldemo3.service;

import com.example.mysqldemo3.dao.Student;

public interface StudentService {
    Student getStudentById(long id);

}

StudentServiceImpl

package com.example.mysqldemo3.service;

import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.dao.StudentRepository;
import jakarta.persistence.Id;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StudentServiceImpl implements StudentService{
    @Autowired
    private StudentRepository StudentRepository;
    @Override
    public Student getStudentById(long id) {
        return StudentRepository.findById(id).orElseThrow(RuntimeException::new) ;
    }
}

controller层

package com.example.mysqldemo3.controller;

import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StudentController {
    @Autowired
    private StudentService studentService;
    @GetMapping("/student/{id}")
    public Student getStudentById(@PathVariable long id){
        return studentService.getStudentById(id);
    }
}

连接数据库这些配置写在application里面

数据库

spring.application.name=mysql-demo3
server.port=8085
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名字?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=sgz250hhh

在数据库中填入数据

后面就可以去网页测试了

再往后我们需要做一些信息的隐藏,不想去展示这莫多的数据

创建

StudentDTO进行封装

package com.example.mysqldemo3.dto;

public class StudentDTO {
    private long id;
    private String name;
    private String email;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

新建converter将student的数据进行转换成DTO

StudentConverter

package com.example.mysqldemo3.converter;

import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.dto.StudentDTO;

public class StudentConverter {
    public static StudentDTO converStudent(Student student){
        //student转换成DTO对象
        StudentDTO studentDTO = new StudentDTO();
        studentDTO.setId(student.getId());
        studentDTO.setName(student.getName());
        studentDTO.setEmail(student.getEmail());
        return studentDTO;
    }
}

新建

判断是否查询成功

Response

package com.example.mysqldemo3;

public class Response <T>{
    //返回后端的一些格式
    private T data;
    private boolean success;
    private String errorMsg;

    public static <K> Response<K> newSuccess(K data){
        //返回成功
        Response<K> response = new Response<>();
        response.setData(data);
        response.setSuccess(true);
        return response;
    }
    public static  Response<Void> newFail(String errorMsg){
        //返回失败
        Response<Void> response = new Response<>();
        response.setErrorMsg(errorMsg);
        response.setSuccess(false);
        return response;
    }
    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
}

StudentService

package com.example.mysqldemo3.service;

import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.dto.StudentDTO;

public interface StudentService {
    StudentDTO getStudentById(long id);

}

StudentServiceImpl

package com.example.mysqldemo3.service;

import com.example.mysqldemo3.converter.StudentConverter;
import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.dao.StudentRepository;
import com.example.mysqldemo3.dto.StudentDTO;
import jakarta.persistence.Id;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StudentServiceImpl implements StudentService{
    @Autowired
    private StudentRepository StudentRepository;
    @Override
    public StudentDTO getStudentById(long id) {
        Student student = StudentRepository.findById(id).orElseThrow(RuntimeException::new);
        return StudentConverter.converStudent(student);
    }
}

StudentController

package com.example.mysqldemo3.controller;

import com.example.mysqldemo3.Response;
import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.dto.StudentDTO;
import com.example.mysqldemo3.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StudentController {
    @Autowired
    private StudentService studentService;
    @GetMapping("/student/{id}")
    public Response<StudentDTO> getStudentById(@PathVariable long id){
        return Response.newSuccess(studentService.getStudentById(id));
    }
}

刷新页面

就可以看见age被隐藏起来了

后面的就是增加删除和修改的操作可以使用Postman进行接口测试,可以直接官网下载

StudentServiceImpl

package com.example.mysqldemo3.service;

import com.example.mysqldemo3.converter.StudentConverter;
import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.dao.StudentRepository;
import com.example.mysqldemo3.dto.StudentDTO;
import jakarta.persistence.Id;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.List;

@Service
public class StudentServiceImpl implements StudentService{
    @Autowired
    private StudentRepository StudentRepository;
    @Override
    public StudentDTO getStudentById(long id) {
        Student student = StudentRepository.findById(id).orElseThrow(RuntimeException::new);
        return StudentConverter.converStudent(student);
    }

    @Override
    public Long addNewStudent(StudentDTO studentDTO) {
        List<Student> studentList = StudentRepository.findByEmail(studentDTO.getEmail());
        if (!CollectionUtils.isEmpty(studentList)){
            throw new IllegalStateException("email:"+studentDTO.getEmail()+"has been taken");
        }
        Student student = StudentRepository.save(StudentConverter.converStudent(studentDTO));
        return student.getId();
    }

    @Override
    public void deleteStudentById(long id) {
        StudentRepository.findById(id).orElseThrow(()->new IllegalArgumentException("id"+id+"doesn`s exist!"));
        StudentRepository.deleteById(id);
    }

    @Override
    public StudentDTO updateStudentById(long id, String name, String email) {
        Student studentDB = StudentRepository.findById(id).orElseThrow(()->new IllegalArgumentException("id"+id+"doesn`s exist!"));
        if (StringUtils.hasLength(name) && !studentDB.getName().equals(name)){
            studentDB.setName(name);
        }
        if(StringUtils.hasLength(email) && !studentDB.getEmail().equals(email)){
            studentDB.setEmail(email);
        }
        Student student = StudentRepository.save(studentDB);
        return StudentConverter.converStudent(student);
    }

}

StudentService

package com.example.mysqldemo3.service;

import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.dto.StudentDTO;

public interface StudentService {
    StudentDTO getStudentById(long id);

    Long addNewStudent(StudentDTO studentDTO);

    void deleteStudentById(long id);

    StudentDTO updateStudentById(long id, String name, String email);
}

StudentRepository

package com.example.mysqldemo3.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface StudentRepository extends JpaRepository<Student,Long> {
    List<Student> findByEmail(String emile);

}

StudentConverter

package com.example.mysqldemo3.converter;

import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.dto.StudentDTO;

public class StudentConverter {
    public static StudentDTO converStudent(Student student){
        //student转换成DTO对象
        StudentDTO studentDTO = new StudentDTO();
        studentDTO.setId(student.getId());
        studentDTO.setName(student.getName());
        studentDTO.setEmail(student.getEmail());
        return studentDTO;
    }
    public static Student converStudent(StudentDTO StudentDTO){
        //student转换成DTO对象
        Student student = new Student();
        student.setName(StudentDTO.getName());
        student.setEmail(StudentDTO.getEmail());
        return student;
    }
}

StudentController

package com.example.mysqldemo3.controller;

import com.example.mysqldemo3.Response;
import com.example.mysqldemo3.dao.Student;
import com.example.mysqldemo3.dto.StudentDTO;
import com.example.mysqldemo3.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class StudentController {
    @Autowired
    private StudentService studentService;
    @GetMapping("/student/{id}")
    public Response<StudentDTO> getStudentById(@PathVariable long id){
        return Response.newSuccess(studentService.getStudentById(id));
    }
    @PostMapping("/student")
    public Response<Long> addNewStudent(@RequestBody StudentDTO studentDTO){
        return Response.newSuccess(studentService.addNewStudent(studentDTO));
    }
    @DeleteMapping("/student/{id}")
    public void deleteStudentById(@PathVariable long id){
        studentService.deleteStudentById(id);
    }
    @PutMapping("/student/{id}")
    public Response<StudentDTO> updateStudentById(@PathVariable long id,@RequestParam(required = false) String name,@RequestParam(required = false) String email){
        return Response.newSuccess(studentService.updateStudentById(id,name,email));
    }
}

最后就可以使用maven对文件进行打包了

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

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

相关文章

【OpenCV3】图像的翻转、图像的旋转、仿射变换之图像平移、仿射变换之获取变换矩阵、透视变换

1 图像的放大与缩小 2 图像的翻转 3 图像的旋转 4 仿射变换之图像平移 5 仿射变换之获取变换矩阵 6 透视变换 1 图像的放大与缩小 resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) src: 要缩放的图片dsize: 缩放之后的图片大小, 元组和列表表示均可.dst: 可选参数, 缩…

AIGC大模型智能抠图(清除背景):Sanster/IOPaint,python(2)

AIGC大模型智能抠图&#xff08;清除背景&#xff09;&#xff1a;Sanster/IOPaint&#xff0c;python&#xff08;2&#xff09; 在文章&#xff08;1&#xff09;的基础上&#xff0c;尝试用大模型扣除图中的某些主要景物。 1、首先&#xff0c;安装插件&#xff1a; pip i…

Qt项目使用Inno Setup打包(关于打包中文乱码的解决)

​ 关于打包好的文件乱码解决方法 打包好的文件中文乱码&#xff0c;就是编码格式出现了问题&#xff0c;更改一下中文脚本编码格式&#xff0c;在官网Inno Setup Translations下载好中文脚本 点击下载&#xff0c;然后另存为 得到ChineseSimplified.isl.txt文件后&#…

使用3DUNet训练自己的数据集(pytorch)— 医疗影像分割

代码:lee-zq/3DUNet-Pytorch: 3DUNet implemented with pytorch (github.com) 文章<cicek16miccai.pdf (uni-freiburg.de)3D U-Net: Learning Dense Volumetric Segmentation

贷款利率高低跟什么有关?仅凭身份证就能贷到款?额度是多少?

在金融的广阔舞台上&#xff0c;借款人的“信用基石”——即其综合资质&#xff0c;是决定贷款利率高低的决定性因素。这并非偶然&#xff0c;而是银行基于详尽的风险评估与收益预期所做出的精准判断。 需明确的是&#xff0c;贷款的易得性并不意味着无门槛的放任。它更像是设置…

【动手学深度学习】04 数据操作 + 数据预处理(个人向笔记)

数据操作 N维数组是机器学习和神经网络的主要数据结构其中 2-d 矩阵中每一行表示每一行表示一个样本 当维度来到三维的时候则可以表示成一张图片&#xff0c;再加一维就可以变成多张图片&#xff0c;再加一维则可以变成一个视频 访问元素 冒号表示从冒号左边的元素到冒号右…

巨魔商店2安装教程,支持最新iOS 17.0的所有型号

支持iOS15.0到16.6.1、16.7 RC (20H18)和17.0的所有iPhone/iPad。 工具下载地址&#xff1a; https://wwi.lanzoup.com/b0knd3q5g 密码:czhi Windows安装教程&#xff1a; 1&#xff0c;电脑必须安装ITunes&#xff0c;关闭查找我的 iPhone&#xff0c;手机上必须要有提示&…

python imshow报错怎么解决

实例如下所示&#xff1a; import matplotlib.pyplot as plt plt.imshow(img) #控制台打印出图像对象的信息&#xff0c;而图像没有显示 解决方法&#xff1a; #引入pylab解决 import matplotlib.pyplot as plt import pylab plt.imshow(img) pylab.show()

MES管理系统助力企业车间管理可视化

MES管理系统作为连接计划层与现场自动化系统的桥梁&#xff0c;在助力企业车间管理可视化方面发挥着重要作用。以下是MES管理系统如何助力企业车间管理可视化的详细阐述&#xff1a; 一、MES管理系统的概述 MES&#xff08;制造执行系统&#xff09;是一种用于生产车间的实时信…

点云数据常见的坐标系有哪些,如何进行转换?

文章目录 一、点云坐标系分类1. 世界坐标系2. 相机坐标系3. 极坐标系4. 笛卡尔坐标系(直角坐标系):5. 传感器坐标系6. 地理坐标系二、坐标系转换方法1. 地理坐标系与投影坐标系之间的转换2. 投影坐标系与局部坐标系之间的转换3. 局部坐标系与3D模型坐标系之间的转换4. 相机坐…

访问修饰符public、protected、private,基于C++

一、基本概念 公有&#xff08;public&#xff09;成员 公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值&#xff0c; 私有&#xff08;private&#xff09;成员 私有成员变量或函数在类的外部是不可访问的&#xff0c;甚至是不…

部落冲突:精通五个流派,部落战传奇杯横着走,但前提是能精通!

部落冲突&#xff1a;精通五个流派&#xff0c;部落战传奇杯横着走&#xff0c;但前提是能精通&#xff01; 在部落冲突当中有很多的流派&#xff0c;每个流派都有着属于自己的特点&#xff0c;但是速途同归的每个流派的最终目的都是用来打部落战和传奇杯&#xff0c;日常打资…

MAT:一款针对MSSQL服务器的安全检测与审计工具

关于MAT MAT是一款针对MSSQL服务器的安全检测与审计工具&#xff0c;该工具使用C#开发&#xff0c;可以帮助广大研究人员快速识别和发现MSSQL 服务器中的安全问题&#xff0c;并实现安全检测与审计目的。 功能介绍 1、执行自动检查并识别安全问题&#xff1b; 2、允许通过 Win…

驾驭冰雪 安全无忧,韩泰高性能冬季轮胎新品上市

- 韩泰轮胎推出冬季轮胎新产品Winter i*cept iZ3和SUV专用的Winter i*cept iZ3 X - 新轮胎采用了V型花纹&#xff0c;冰雪路面安全性极佳&#xff0c;而且具有操控性好、续航里程长的优点 - 新轮胎在位于北极圈以北300km的韩泰轮胎芬兰伊瓦洛测试场进行了严苛测试&#xff0c…

将用户证书导入到系统证书

现在大部分app已经不信任用户证书,通过传统charles安装证书抓包的方式已经不行,今天就来说一个将系统证书移动到系统目录的方法,系统证书的目录只有可读权限,有时候挂在目录会不成功 我们先下载如下模块 GitHub - ys1231/MoveCertificate: 支持Android7-14移动证书&#xff0…

【观察者】设计模式:构建灵活且响应式的软件系统

引言 在软件开发中&#xff0c;我们经常面临需要在多个对象之间进行通信的挑战。特别是当一个对象的状态发生变化时&#xff0c;我们希望所有依赖于这个状态的对象都能自动更新。这就是观察者设计模式大显身手的地方。 简介 观察者模式是一种行为设计模式&#xff0c;它定义…

【机器学习】XGBoost的用法和参数解释

一、XGBoost的用法 流程&#xff1a; 代码案例&#xff1a; 二、XGBoost的几大参数 1、一般参数&#xff0c;用于集成算法本身 ①n_estimators 集成算法通过在数据上构建多个弱 评估器&#xff0c;汇总所有弱评估器的建模结果&#xff0c;以获取比单个模型更好的回归或分类…

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_search函数&…

【ZYNQ】OV5640 介绍

OV5640 是 OmniVison (豪威) 公司推出的高性能数字图像传感器,支持最高 500 万像素图像采集,支持 RAW RGB、RGB565、YCbCr422 等图像格式输出。同时 OV5640 可用于图像补偿,包括自动曝光、白平衡、伽马调节、饱和度调节等功能。本文主要介绍 OV5640 工作原理与接口定义。 目…

xss-labs-master通关教程

一.level1 先来进行一下代码审计 <?php ini_set("display_errors", 0);//关闭错误显示 $str $_GET["name"]; //接受URL来的get形式的name传参 echo "<h2 aligncenter>欢迎用户".$str."</h2>";//在网页输出&#x…