从0开始写一个Springboot的简单项目

本文详细描述了在新建Springboot项目过程中遇到的常见问题,包括Maven版本选择、Controller的使用、与数据库的mybatis交互,以及错误的诊断和解决。涵盖了从创建项目、编写Controller到数据库操作的完整流程。
摘要由CSDN通过智能技术生成

1 新建Springboot项目

1.1 搭建新项目过程

File -> New -> Project,这里选择jdk1.8,点击Next

在这里插入图片描述

Group一般是公司域名,Artfact是我们的项目名,Type选择Maven(这个选项里,Maven会自动生成java目录和resource目录),Packaging选择Jar(因为是Springboot项目不是SSM项目,所以不需要打包成War,直接Jar包就能运行),Java Version选择和jdk1.8适配的Java 8版本,点击Next。

在这里插入图片描述

我们在这里将SpringBoot版本设置为3.0.10(这里会有错误,版本选择为2.7.15,这里演示一下错误是怎么产生的),由于是Web项目,我们吧Spring Web勾选上,这个依赖集合里包含SpringMVC等的相关依赖。点击Next。

在这里插入图片描述

设置项目名和项目所在磁盘位置过后,点击Finish,项目构建完成。

1.2 遇到的一系列错误及解决方案

首先我们看到pom.xml文件时,发现Maven找不到spring-boot-starter-parent的3.0.10的版本

在这里插入图片描述

  1. 首先看一下Maven是否正确配置,我这里的Maven配置并没有错。
    在这里插入图片描述

  2. 那在Maven仓库里看一下,仓库里是否有该依赖(org.springframework.boot:spring-boot-starter-parent:3.0.10),果然没有。
    在这里插入图片描述

  3. 在idea的Maven中点击compile重新编译,让他重新下载一下3.0.10的包,但是Maven莫名其妙地报错了Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project springboot01: Fatal error compiling。

  4. 因为很莫名其妙,所以我重启idea了,发现3.0.10版本号那里不报红了,but Maven编译还是会报错。
    在这里插入图片描述

  5. 参考https://blog.csdn.net/gao_jun1/article/details/109997200,指出这个错误的原因很可能是jdk版本不匹配,然后我看了下我的pom.xml文件里,java语言版本为17,因此果断改成了与jdk1.8对应的8。

	<properties>
        <java.version>17</java.version> <!--改为8-->
    </properties>
  1. 没问题了,也不用重新compile了,等出现问题过后再解决。一个新的问题是,在我的项目目录里面,java目录、resources目录、test目录都被标识成了普通的目录文件,这是不应该的(其实按道理应该不会出现这种问题,但我的idea就是问题这么多),那我就手动标记一下目录吧。
    在这里插入图片描述

  2. 如图标记一下目录。java目录设置为Source Root,resources目录设置为Resources Root,test目录设置为Test Source Root。
    在这里插入图片描述

  3. 设置完成后,目录图标就变成了以下这样,Springboot01Application文件也变成了一个正常的启动类标识了。
    在这里插入图片描述

  4. 打开Springboot01Application文件看一下,发现一大串红色,错误为Cannot resolve symbol ‘SpringBootApplication’,没有找到符号,也无法正常运行(ERROR为java: 程序包org.springframework.boot不存在)。
    在这里插入图片描述
    在这里插入图片描述

  5. 查了一下具体操作为打开cmd,跳转到项目的根目录,然后执行mvn -U idea:idea
    在这里插入图片描述

  6. 大概三分钟过后,该命令执行结束了,然后重启idea或者File -> Reload All from Disk,发现不报红了
    在这里插入图片描述
    在这里插入图片描述

  7. 运行启动类,难道他就没出错了吗?不,他还有错。(wctm)。查了下是版本过高,parent版本原本创建的时候为3.0.10,出现该错误是version的版本过高(SpringBoot3只支持java17),需要将版本降为2.7.9以下。java使用版本为JDK8。
    在这里插入图片描述

  8. 于是把SpringBoot版本改为2.7.8,再重新编译pom.xml。编译成功后,刷新pom.xml文件还是爆红,重启idea,不爆红了。
    在这里插入图片描述
    在这里插入图片描述

  9. 重新运行一下启动类,还是12中的错误,于是重新install一下,再Reload All from Disk重新加载项目文件。再次运行启动类,Ok,我启动成功了。(。。。)
    在这里插入图片描述

2 What is controller ?

2.1 写一个简单的请求

  1. 再项目成功启动后,我们在浏览器中输入http://localhost:8080/,这个url是我们项目的根目录,但是由于我们后端什么都没写,所以浏览器得到的response告诉我们,我们的应用没有相关的url映射。
    在这里插入图片描述
  2. 一个Web应用会有很多个请求,不同的请求都有不同的url,那么后端如何对不同的请求做出相应的方法来处理呢?这就是Controller的作用,Controller会对每一个url设置一个方法与之对应,使得当浏览器发出某个请求时,Controller会调用对应的方法来处理这个请求,并将浏览器希望的数据返回给浏览器。
  3. 这里我们创建一个Controller包,在这个包里面定义不同的Controller文件。我们先写一个TestController来试试一个Controller具体是怎么处理一个请求的。

写一个TestController类,然后标上@RestController注解(这个注解相当于@Responsebody和@Controller的结合),其中@Controller注解标识这个类是一个用来处理请求的Controller类,@Responsebody的作用是将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端(这个返回值会直接把返回的数据以json格式返回给客户端)。当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象(这个返回值会返回给客户端一个html页面)。如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json串,然后写到客户端。(通常情况下都会用@RestController注解而不只是@Controller,因为现在前后端分离,后端不会直接返回一个页面,页面会由前端写,后端只会返回前端需要的数据)
@RequestMapping注解的作用是定义该方法用来处理什么url。value表示请求的url,method表示该请求是Get请求还是Post请求等。

在这里插入图片描述
4. 启动应用,在浏览器url中输入http://localhost:8080/,发现浏览器的页面出现以下结果。由于返回的是一个字符串,因此response里面也是直接接收的一个字符串;如果返回的是一个对象,那么response里接收的会是一个json串。
在这里插入图片描述
在这里插入图片描述

2.2 如何给前端返回一个对象 ?

  1. 我们现在写一个User类,待会尝试着把一个User对象返回给前端。如下图

在SpringBoot应用中,一个与数据库中表对应的实体类会被写在一个特定的包中,这个包通常叫做entity或者pojo(表示这个包里的一个类与一个数据表对应,例如数据库中有张表叫t_user表,这个表的字段有id,name,age;那么这个表相对应的实体类User,User的属性也有id,name,age。这样约定的目的在于,一个User对象可以代表着t_user表中的一条数据)。

在这里插入图片描述
2. 在之前的TestController中加一个请求。这次将@RequestMapping改成了@GetMapping,表示这是一个Get请求。这个请求是携带参数的,使用@RequestParam注解,@RequestParam注解内部的name值表示请求中携带的参数名,可以省略不写。这个方法给浏览器返回的是一个User对象。

在这里插入图片描述

  1. 在浏览器中输入http://localhost:8080/getUser?id=1&name=Jay&age=22,发现返回的response是一个json串,而这个json串可以表示一个User对象。

在这里插入图片描述

在这里插入图片描述

  1. 学着用postman发送请求测试接口,写好url,添加参数。如下,收到的response和浏览器相同

在这里插入图片描述

2.3 那再试试Post请求?

从这里开始,咱就不用浏览器url的方式模拟请求了,因为一般浏览器只能在地址栏通过加参数的方式模拟Get请求(众所周知,Get请求的参数放在url后面,例如http://localhost:8080/getUser?id=1&name=Jay&age=22,携带参数的url为在原本的url尾部拼接了?id=1&name=Jay&age=22)

  1. 从现在开始,我们用postman模拟请求的发送。这里在TestController中我们增加一个方法getUser1的注解由为@PostMapping,其它的和方法getUser相同。然后,项目,启动!

在这里插入图片描述

  1. 打开postman输入url(http://127.0.0.1:8080/getUser1),众所周知Post请求的参数放置的位置是在请求体(Requestbody)里,因此我们如下图将参数以json的形式放在body里(别忘了把Params里原有的去掉勾选)。点击发送!!!??????为什么出错了???

在这里插入图片描述

返回的body报了400错误,看看项目控制台的日志信息:Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter ‘id’ for method parameter type int is not present]。奥,它说方法里面的参数不存在。But,这不是明明存在吗,写在Body里面的啊?

  1. 问题来自于这里:@RequestParam注解。这个注解只能用于通常用于请求头里参数的接收,而Requestbody里面json串形式发送的请求参数它无法接收。那如果不用RequestParam怎么接收Post请求的参数呢?答案是,直接用一个对象接收。如下:
@PostMapping("/getUser1")
    public User getUser1(@RequestBody User user){
        user.setName("被修改的"+user.getName());
        return user;
    }
}

当要接收Post请求里的请求体里的json时,以一个对象的形式接收,并且要加上@RequestBody注解。

  1. 项目启动,再次发送请求!。。。又报错了,尊嘟假嘟。。。

在这里插入图片描述

看了看项目的控制台日志:Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘text/plain;charset=UTF-8’ not supported]。OK这个错是因为,Get请求和Post请求的请求体中有个参数Content-Type不一样。如图,在浏览器中显示在这里
在这里插入图片描述

  1. 这次是Postman的问题,在Postman中手动设置一下Content-Type为application/json,再次发送请求,OK,Post请求成功了。

在这里插入图片描述

  1. 还有一个问题,后端接口只能用一个对象接收。有时候会很麻烦,为了个请求还非得去写一个类,其实某些情况也可以不用一个对象接收,but你得和前端大哥好好谈谈,因为。。。没有为什么,这是他写的。-------OK,再写一个方法getUser2,还是用参数接收,注解用@RequestParam

在这里插入图片描述
7. 启动项目。正常发送Post请求前面说了控制台的日志显示参数不存在。其实,前端发Post请求,以表单的方式发送请求,参数是可以被接收到的。这里Postman也可以模拟。如图,发送,成功!

在这里插入图片描述

  1. 尽管如此,Post请求接收参数通常还是会用对象接收。除了某些特殊情况,比如上传文件,因为上传文件通常是以表单的形式发送请求的,这时候Post请求就能用@RequestParam接收参数了。

3 与数据库的交互

我们在后端中,最终是要与数据库进行交互操作的。而与数据库的读写操作主要是通过mybatis实现的。

3.1 What is mybatis ?

我的理解是,mybatis就是你的应用程序与数据库之间更方便连接、更方便操作数据库的一种工具,用别的老师的高级一点的话来说,是一个持久层框架(???)。

众所周知,java项目里只能写java代码,而数据库里只能写sql语句不能写java代码。那么我要在java项目里面进行对数据库的操作怎么办呢?就用mybatis,其实除了mybatis外,还有别的连接数据库的工具比如说jdbc,但mybatis之所以被称为框架,是因为他减少了大量的java代码,mybatis让java操作数据库的动作变得尊嘟很简单。

用mybatis操作数据库的过程主要分为两步:1、写Mapper接口(这主要定义了有哪些操作数据库的操作);2、写Mapper.xml文件(这主要定义了具体的sql语句)。其中,一个Mapper接口文件对应一个Mapper.xml文件,一个Mapper接口中的一个方法对应Mapper.xml中的一个sql语句。


我们后面会展示mybatis具体是怎么操作数据库的,在这之前我们先使用Mysql创建一个名为test_demo的数据库,并在里面创建一个student表,建立表后,往里插入几条数据。

drop table if exists student;
create table `student`(
    `id` int(10) NOT NULL AUTO_INCREMENT, # 自增
    `name` varchar(32),
    `age` int ,
    `score` double,
    `birthday` date,
    `insert_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, #默认插入记录的时候自动生成时间戳
	PRIMARY KEY (`id`)
);

insert into student(name,age,score,birthday) values('name1',20,60.0,'2001-02-20 12:00:00');
insert into student(name,age,score,birthday) values('name2',20,60.0,'2001-02-21 12:00:00');
insert into student(name,age,score,birthday) values('name3',20,60.0,'2001-02-22 12:00:00');
insert into student(name,age,score,birthday) values('name4',20,60.0,'2001-01-20 12:00:00');
insert into student(name,age,score,birthday) values('name5',20,60.0,'2001-01-21 12:00:00');
insert into student(name,age,score,birthday) values('name6',20,60.0,'2001-01-22 12:00:00');

在这里插入图片描述

OK 成功插入了6条数据

为这张表再建立一个实体类Student,以对应student表中的记录。
在这里插入图片描述

准备工作完毕!下面开始讲解mybatis是咋用的啊,注意听讲!!!
发现一个错误,左边目录中resources文件夹被标识成了Sources Root,这里是错的,应该是Resources Root。学生自行修改一下,改过后该目录的图标变成了这样
在这里插入图片描述
还有一个错误,不过这是我自身idea的问题。就是在pom文件配置正常,依赖正确加入后。右边Maven没有显示出Dependencies文件夹。且Reload Maven项目时在build中出错(具体错误是什么忘了),找了很久发现是idea和Maven版本不一致的问题。但我降低了Maven版本,仍出现这个问题,于是我升级了idea到2023版本,就正常了。ps:正常人应该不会出这种奇葩错误。以下是正常的项目结构。
在这里插入图片描述

3.2 简单mybatis

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值