前言:这里是我对于前后端spring boot + vue3的学习过程收纳整理以及知识分享。
目录
一、springboot框架搭建
1.新建spring boot项目
2.添加必要依赖项
二、配置数据库路径
1.数据库建表填数据
2.IDEA配置数据库
三、测试数据库是否连接成功:
四、将数据库中的内容输出到页面
1.目录结构更改
2.添加代码
3.测试输出
五、目录结构及调用过程解释
1.方法调用过程
2.路径问题
3.总结
一、springboot框架搭建
1.新建spring boot项目
打开IDEA,新建一个项目:
选择spring initalizr,设置项目存储位置,JDK选17,项目名称可以自行更改,类型选择Maven:
2.添加必要依赖项
版本按照默认,添加依赖项web->spring web:
在sql中添加依赖项MySQL Driver和MyBatis Framework:
点击create进行创建,创建后点开项目,等待各种依赖项、文件自动下载完毕
目录结构为:
二、配置数据库路径
1.数据库建表填数据
打开MySQL或者Navicat,创建新的数据库及表,并向表内增添用于测试的数据。
示例:
创建数据库schema为db,并创建user表:
其中user表包含属性:用户ID(id),用户名(username),年龄(age),职业(job),爱好(hobby)
-- 建数据库 create schema db; use db; -- 建表 create table user( id int primary key, username varchar(20), age int, job varchar(100), hobby varchar(100)); -- 插入数据 insert into user values(1,'张三',30,'前端开发工程师','睡觉'); insert into user values(2,'李四',25,'产品助理','打篮球'); insert into user values(3,'王五',40,'后端开发工程师','旅行'); -- 查看数据 select * from user;
插入数据成功后:
2.IDEA配置数据库
在application.properties文件中,配置数据库,其中url中的db为数据库名称:
server.port=8080 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=123456
对于端口号,一般写成8080,如果端口号已经被其他进程占用,可以改成8081等等,数据库名称,其他配置,用户名和密码,以及要连接的数据库名称,需要根据自己的情况更改:
此时,点击绿色小三角运行,在浏览器输入http://localhost:8080(设置的端口号),出现如下页面:
三、测试数据库是否连接成功:
在test中:
更改Java类的内容
DemoApplicationTests:
@SpringBootTest class DemoApplicationTests { @Autowired DataSource dataSource; @Test void contextLoads() throws Exception{ System.out.println("获取的数据库链接为:"+dataSource.getConnection()); } }
右击运行DemoApplicationTests.java:
出现红框内容即连接成功:
四、将数据库中的内容输出到页面
要实现在网页中展示表中数据
1.目录结构更改
在java中创建如下五个包:
其中,controller用于编写方法类,entity用于储存实体类,service中存放接口,mapper中用于衔接数据库,result用于统一规范输出结果形式
在每个package包中分别创建如下Java类:
(mapper下的UserMapper前方黑色小鸟图标是因为我在file->settings->plugins中添加了MyBatisX插件,便于将xxMapper.xml文件下的sql语句与xxMapper.java中的方法对应起来,可以不添加)如果要添加的话是下面这里:
在resources中创建如下结构,.xml文件中用于书写mysql语句:
最终目录结构:
2.添加代码
每个文件代码:
User.java:
package com.example.demo.entity; public class User { private int id; private String username; private int age; private String job; private String hobby; public void setId(int id) { this.id = id; } public int getId() { return id; } public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setJob(String job) { this.job = job; } public String getJob() { return job; } public void setHobby(String hobby) { this.hobby = hobby; } public String getHobby() { return hobby; } }
UserController.java:
package com.example.demo.controller; import com.example.demo.result.Result; import com.example.demo.service.UserService; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/user") public class UserController { @Resource UserService userService; @CrossOrigin @GetMapping(value = "/findAll") @ResponseBody public Result findAllUser(){ try { return Result.success(userService.findAllUser()); }catch (Exception e){ return Result.failure(500,"服务器异常"); } } }
UserMapper.java:
package com.example.demo.mapper; import com.example.demo.entity.User; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; import java.util.List; @Mapper public interface UserMapper { public ListfindAllUser();//查找所有用户 }
UserService.java:
package com.example.demo.service; import com.example.demo.entity.User; import org.springframework.stereotype.Service; import java.util.List; public interface UserService { public ListfindAllUser(); }
UserServiceImpl.java:
package com.example.demo.service; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl implements UserService { @Resource private UserMapper userMapper; @Override public ListfindAllUser(){ return userMapper.findAllUser(); } }
Result.java:
package com.example.demo.result; public class Result { private int code; //接口状态码 private String msg; //接口返回消息2、User.java private Object data; //响应内容 public Result(){ super(); } public Result(int code,String msg,Object data){ this.code=code; this.msg=msg; this.data=data; } public static Result success(Object data){ Result item=new Result(200,"success",data); return item; } public static Result failure(int errCode,String errorMessage){ Result item=new Result(errCode,errorMessage,null); return item; } public int getCode(){ return code; } public void setCode(int code){ this.code=code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
UserMapper.xml:
还需要在application.properties中设置文件路径:
#mybatis配置 mybatis.typeAliasesPackage=org.spring.springboot.domain mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package= com.example.demo.entity
3.测试输出
先在右上角的configuration中选择Demo1Application(前面有绿色图标的),然后点击绿色小三角运行程序:
控制台:
此时在浏览器中输入http://localhost:8080/user/findALL
五、目录结构及调用过程解释
以下内容按我的理解来解释整个过程,比较口语化,也可能不太专业,如有不当敬请指出
1.方法调用过程
刚才已经粗略解释过一部分:controller用于编写方法类,entity用于储存实体类,service中存放接口,mapper中用于衔接数据库,result用于统一规范输出结果形式
要知道它的执行过程需要一步一步来,一层一层看,先看的是controller里面的注解:
1)controller中,对整个UserController类使用了RequestMapping注解,findAllUser()函数之上对应的注解GetMapping:/findALL,所以,findAllUser注解可以视为/user/findAll
浏览器输入链接http://localhost:8080/user/findALL时,启用8080端口,/user/findALL的请求会由findAllUser()来处理
该函数内部有一条语句:userService.findAllUser(),调用了service包下UserService.java里面的findAllUser()函数
2)再来看service文件,这里定义了UserService接口,接口中没有定义具体的实现方法体:
里面正是findAllUser()函数被调用,这个函数返回值为list形式的user对象集合,无需输入
3)接下来就是到了UserServiceImpl了,UserServiceImpl为UserService的接口实现类,定义了findAllUser()的具体方法体:
到这里算是java方法和mysql语句衔接的一个重要转折点啦,在UserServiceImpl中,调用了UserMapper.java中的findAllUser()方法
4)具体UserMapper.java:
也拥有findAllUser(),这里的函数名字不是随便起的,一切的根源都在resources->mapper->UserMapper.xml中:
4)这里mysql语句中,设置的id为:findAllUser
UserMapper.java中的对应方法名和UserMapper.xml中mysql语句id的命名要完全一致(包括大小写)
比如:
.xml文件替换为(id更换为getListUser):
那么UserMapper.java中对应方法就换为(方法名更换为getListUser):
public ListgetListUser();//查找所有用户
而其他包中java类为了协调一致不搞混,也同样用getListUser命名对应函数
2.路径问题
那么UserMapper.java中的函数又是怎么找到UserMapper.xml文件中对应的id呢?这就是路径配置问题了
在resources->mapper->UserMapper.xml中,
namespace="com.example.demo.mapper.UserMapper"
这一句指明了.xml文件对应的.java文件路径,是在src->main->java->com.example.demo.mapper->UserMapper.java
再加上application.properties中针对mybatis路径配置:
mybatis.mapper-locations=classpath:mapper/*.xml
指明访问.xml文件的路径为resources->mapper->*.xml
如果没有这些设置的话,是找不到数据库表信息的。
3.总结
简单来说整体流程大致为:
方法请求->controller注解->service接口->service实现接口(具体方法实现)->mapper包中的**Mapper.java->根据路径配置找到resources中的**Mapper.xml->实现具体sql语句,获得返回值->将返回值再倒着传递出去
可以视为:
controller、service包中的内容都是与java后端方法调用有关的,
而mapper包中,不管是src->main->java->mapper下的.java文件,还是resources->***下的.xml文件,都是与数据库调用有关的