前言:这里是我对于前后端spring boot + vue3的学习过程收纳整理以及知识分享。
目录
一、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 List<User> findAllUser();//查找所有用户
}
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 List<User> findAllUser();
}
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 List<User> findAllUser(){
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:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demo.mapper.UserMapper" >
<resultMap id="result" type="com.example.demo.entity.User">
<result property="id" column="id" />
<result property="username" column="username" />
<result property="age" column="age" />
<result property="job" column="job" />
<result property="hobby" column="hobby"/>
</resultMap>
<!-- 查找所有用户-->
<select id="findAllUser" resultMap="result">
select * from user
</select>
</mapper>
还需要在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):
<select id="getListUser" resultMap="result"> select * from user </select>
那么UserMapper.java中对应方法就换为(方法名更换为getListUser):
public List<User> getListUser();//查找所有用户
而其他包中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文件,都是与数据库调用有关的